MichaelHatherly / CommonMark.jl

A CommonMark-compliant Markdown parser for Julia.
Other
84 stars 11 forks source link

Bug in `TableRule` #8

Closed bramtayl closed 4 years ago

bramtayl commented 4 years ago

Here's the error output when I just enable TableRule and run the tests. I'll see if I can't find a simpler reproducer.

docs: Error During Test at /home/brandon/.julia/dev/JuliaFormatter/test/default_style.jl:1375
  Got exception outside of a @test
  UndefRefError: access to undefined reference
  Stacktrace:
   [1] getproperty at ./Base.jl:33 [inlined]
   [2] (::CommonMark.var"#49#51"{CommonMark.TableRule})(::CommonMark.InlineParser, ::CommonMark.Node) at /home/brandon/.julia/dev/CommonMark/src/extensions/tables.jl:111
   [3] parse_inlines(::CommonMark.InlineParser, ::CommonMark.Node) at /home/brandon/.julia/dev/CommonMark/src/parsers/inlines.jl:125
   [4] parse at /home/brandon/.julia/dev/CommonMark/src/parsers/inlines.jl:129 [inlined]
   [5] process_inlines(::CommonMark.Parser, ::CommonMark.Node) at /home/brandon/.julia/dev/CommonMark/src/parsers/blocks.jl:416
   [6] parse(::CommonMark.Parser, ::Base.GenericIOBuffer{Array{UInt8,1}}; kws::Base.Iterators.Pairs{Union{},Union{},Tuple{},NamedTuple{(),Tuple{}}}) at /home/brandon/.julia/dev/CommonMark/src/parsers/blocks.jl:446
   [7] parse at /home/brandon/.julia/dev/CommonMark/src/parsers/blocks.jl:427 [inlined]
   [8] #_#21 at /home/brandon/.julia/dev/CommonMark/src/parsers/blocks.jl:451 [inlined]
   [9] Parser at /home/brandon/.julia/dev/CommonMark/src/parsers/blocks.jl:451 [inlined]
   [10] #_#20 at /home/brandon/.julia/dev/CommonMark/src/parsers/blocks.jl:450 [inlined]
   [11] Parser at /home/brandon/.julia/dev/CommonMark/src/parsers/blocks.jl:450 [inlined]
   [12] #p_literal#45 at /home/brandon/.julia/dev/JuliaFormatter/src/pretty.jl:344 [inlined]
   [13] p_macrocall(::DefaultStyle, ::CSTParser.EXPR, ::JuliaFormatter.State) at /home/brandon/.julia/dev/JuliaFormatter/src/pretty.jl:458
   [14] pretty(::DefaultStyle, ::CSTParser.EXPR, ::JuliaFormatter.State; kwargs::Base.Iterators.Pairs{Union{},Union{},Tuple{},NamedTuple{(),Tuple{}}}) at /home/brandon/.julia/dev/JuliaFormatter/src/pretty.jl:71
   [15] pretty(::DefaultStyle, ::CSTParser.EXPR, ::JuliaFormatter.State) at /home/brandon/.julia/dev/JuliaFormatter/src/pretty.jl:3
   [16] p_fileh(::DefaultStyle, ::CSTParser.EXPR, ::JuliaFormatter.State) at /home/brandon/.julia/dev/JuliaFormatter/src/pretty.jl:149
   [17] pretty(::DefaultStyle, ::CSTParser.EXPR, ::JuliaFormatter.State; kwargs::Base.Iterators.Pairs{Union{},Union{},Tuple{},NamedTuple{(),Tuple{}}}) at /home/brandon/.julia/dev/JuliaFormatter/src/pretty.jl:125
   [18] pretty at /home/brandon/.julia/dev/JuliaFormatter/src/pretty.jl:3 [inlined]
   [19] run_pretty(::String, ::Int64; opts::Options, style::DefaultStyle) at /home/brandon/.julia/dev/JuliaFormatter/test/runtests.jl:27
   [20] run_pretty(::String, ::Int64) at /home/brandon/.julia/dev/JuliaFormatter/test/runtests.jl:24
   [21] top-level scope at /home/brandon/.julia/dev/JuliaFormatter/test/default_style.jl:1383
   [22] top-level scope at /buildworker/worker/package_linux64/build/usr/share/julia/stdlib/v1.4/Test/src/Test.jl:1113
   [23] top-level scope at /home/brandon/.julia/dev/JuliaFormatter/test/default_style.jl:1376
   [24] top-level scope at /buildworker/worker/package_linux64/build/usr/share/julia/stdlib/v1.4/Test/src/Test.jl:1113
   [25] top-level scope at /home/brandon/.julia/dev/JuliaFormatter/test/default_style.jl:2
   [26] include(::String) at ./client.jl:439
   [27] top-level scope at /home/brandon/.julia/dev/JuliaFormatter/test/runtests.jl:43
   [28] include(::String) at ./client.jl:439
   [29] top-level scope at none:6
   [30] eval(::Module, ::Any) at ./boot.jl:331
   [31] exec_options(::Base.JLOptions) at ./client.jl:264
   [32] _start() at ./client.jl:484

strings: Error During Test at /home/brandon/.julia/dev/JuliaFormatter/test/default_style.jl:1519
  Test threw exception
  Expression: fmt(str) == str
  UndefRefError: access to undefined reference
  Stacktrace:
   [1] getproperty at ./Base.jl:33 [inlined]
   [2] (::CommonMark.var"#49#51"{CommonMark.TableRule})(::CommonMark.InlineParser, ::CommonMark.Node) at /home/brandon/.julia/dev/CommonMark/src/extensions/tables.jl:111
   [3] parse_inlines(::CommonMark.InlineParser, ::CommonMark.Node) at /home/brandon/.julia/dev/CommonMark/src/parsers/inlines.jl:125
   [4] parse at /home/brandon/.julia/dev/CommonMark/src/parsers/inlines.jl:129 [inlined]
   [5] process_inlines(::CommonMark.Parser, ::CommonMark.Node) at /home/brandon/.julia/dev/CommonMark/src/parsers/blocks.jl:416
   [6] parse(::CommonMark.Parser, ::Base.GenericIOBuffer{Array{UInt8,1}}; kws::Base.Iterators.Pairs{Union{},Union{},Tuple{},NamedTuple{(),Tuple{}}}) at /home/brandon/.julia/dev/CommonMark/src/parsers/blocks.jl:446
   [7] parse at /home/brandon/.julia/dev/CommonMark/src/parsers/blocks.jl:427 [inlined]
   [8] #_#21 at /home/brandon/.julia/dev/CommonMark/src/parsers/blocks.jl:451 [inlined]
   [9] Parser at /home/brandon/.julia/dev/CommonMark/src/parsers/blocks.jl:451 [inlined]
   [10] #_#20 at /home/brandon/.julia/dev/CommonMark/src/parsers/blocks.jl:450 [inlined]
   [11] Parser at /home/brandon/.julia/dev/CommonMark/src/parsers/blocks.jl:450 [inlined]
   [12] #p_literal#45 at /home/brandon/.julia/dev/JuliaFormatter/src/pretty.jl:344 [inlined]
   [13] p_macrocall(::DefaultStyle, ::CSTParser.EXPR, ::JuliaFormatter.State) at /home/brandon/.julia/dev/JuliaFormatter/src/pretty.jl:458
   [14] pretty(::DefaultStyle, ::CSTParser.EXPR, ::JuliaFormatter.State; kwargs::Base.Iterators.Pairs{Union{},Union{},Tuple{},NamedTuple{(),Tuple{}}}) at /home/brandon/.julia/dev/JuliaFormatter/src/pretty.jl:71
   [15] pretty(::DefaultStyle, ::CSTParser.EXPR, ::JuliaFormatter.State) at /home/brandon/.julia/dev/JuliaFormatter/src/pretty.jl:3
   [16] p_fileh(::DefaultStyle, ::CSTParser.EXPR, ::JuliaFormatter.State) at /home/brandon/.julia/dev/JuliaFormatter/src/pretty.jl:149
   [17] pretty(::DefaultStyle, ::CSTParser.EXPR, ::JuliaFormatter.State; kwargs::Base.Iterators.Pairs{Union{},Union{},Tuple{},NamedTuple{(),Tuple{}}}) at /home/brandon/.julia/dev/JuliaFormatter/src/pretty.jl:125
   [18] pretty(::DefaultStyle, ::CSTParser.EXPR, ::JuliaFormatter.State) at /home/brandon/.julia/dev/JuliaFormatter/src/pretty.jl:3
   [19] _format_text(::DefaultStyle, ::JuliaFormatter.State, ::CSTParser.EXPR) at /home/brandon/.julia/dev/JuliaFormatter/src/JuliaFormatter.jl:270
   [20] format_text(::String; indent::Int64, margin::Int64, style::DefaultStyle, always_for_in::Bool, whitespace_typedefs::Bool, whitespace_ops_in_indices::Bool, remove_extra_newlines::Bool, import_to_using::Bool, pipe_to_function_call::Bool, short_to_long_function_def::Bool, always_use_return::Bool, whitespace_in_kwargs::Bool, annotate_untyped_fields_with_any::Bool) at /home/brandon/.julia/dev/JuliaFormatter/src/JuliaFormatter.jl:258
   [21] #fmt1#3 at /home/brandon/.julia/dev/JuliaFormatter/test/runtests.jl:6 [inlined]
   [22] #fmt#5 at /home/brandon/.julia/dev/JuliaFormatter/test/runtests.jl:13 [inlined]
   [23] fmt(::String) at /home/brandon/.julia/dev/JuliaFormatter/test/runtests.jl:13
   [24] top-level scope at /home/brandon/.julia/dev/JuliaFormatter/test/default_style.jl:1519
   [25] top-level scope at /buildworker/worker/package_linux64/build/usr/share/julia/stdlib/v1.4/Test/src/Test.jl:1113
   [26] top-level scope at /home/brandon/.julia/dev/JuliaFormatter/test/default_style.jl:1514
   [27] top-level scope at /buildworker/worker/package_linux64/build/usr/share/julia/stdlib/v1.4/Test/src/Test.jl:1113
   [28] top-level scope at /home/brandon/.julia/dev/JuliaFormatter/test/default_style.jl:2

strings: Error During Test at /home/brandon/.julia/dev/JuliaFormatter/test/default_style.jl:1529
  Test threw exception
  Expression: fmt(str) == str
  UndefRefError: access to undefined reference
  Stacktrace:
   [1] getproperty at ./Base.jl:33 [inlined]
   [2] (::CommonMark.var"#49#51"{CommonMark.TableRule})(::CommonMark.InlineParser, ::CommonMark.Node) at /home/brandon/.julia/dev/CommonMark/src/extensions/tables.jl:111
   [3] parse_inlines(::CommonMark.InlineParser, ::CommonMark.Node) at /home/brandon/.julia/dev/CommonMark/src/parsers/inlines.jl:125
   [4] parse at /home/brandon/.julia/dev/CommonMark/src/parsers/inlines.jl:129 [inlined]
   [5] process_inlines(::CommonMark.Parser, ::CommonMark.Node) at /home/brandon/.julia/dev/CommonMark/src/parsers/blocks.jl:416
   [6] parse(::CommonMark.Parser, ::Base.GenericIOBuffer{Array{UInt8,1}}; kws::Base.Iterators.Pairs{Union{},Union{},Tuple{},NamedTuple{(),Tuple{}}}) at /home/brandon/.julia/dev/CommonMark/src/parsers/blocks.jl:446
   [7] parse at /home/brandon/.julia/dev/CommonMark/src/parsers/blocks.jl:427 [inlined]
   [8] #_#21 at /home/brandon/.julia/dev/CommonMark/src/parsers/blocks.jl:451 [inlined]
   [9] Parser at /home/brandon/.julia/dev/CommonMark/src/parsers/blocks.jl:451 [inlined]
   [10] #_#20 at /home/brandon/.julia/dev/CommonMark/src/parsers/blocks.jl:450 [inlined]
   [11] Parser at /home/brandon/.julia/dev/CommonMark/src/parsers/blocks.jl:450 [inlined]
   [12] #p_literal#45 at /home/brandon/.julia/dev/JuliaFormatter/src/pretty.jl:344 [inlined]
   [13] p_macrocall(::DefaultStyle, ::CSTParser.EXPR, ::JuliaFormatter.State) at /home/brandon/.julia/dev/JuliaFormatter/src/pretty.jl:458
   [14] pretty(::DefaultStyle, ::CSTParser.EXPR, ::JuliaFormatter.State; kwargs::Base.Iterators.Pairs{Union{},Union{},Tuple{},NamedTuple{(),Tuple{}}}) at /home/brandon/.julia/dev/JuliaFormatter/src/pretty.jl:71
   [15] pretty(::DefaultStyle, ::CSTParser.EXPR, ::JuliaFormatter.State) at /home/brandon/.julia/dev/JuliaFormatter/src/pretty.jl:3
   [16] p_fileh(::DefaultStyle, ::CSTParser.EXPR, ::JuliaFormatter.State) at /home/brandon/.julia/dev/JuliaFormatter/src/pretty.jl:149
   [17] pretty(::DefaultStyle, ::CSTParser.EXPR, ::JuliaFormatter.State; kwargs::Base.Iterators.Pairs{Union{},Union{},Tuple{},NamedTuple{(),Tuple{}}}) at /home/brandon/.julia/dev/JuliaFormatter/src/pretty.jl:125
   [18] pretty(::DefaultStyle, ::CSTParser.EXPR, ::JuliaFormatter.State) at /home/brandon/.julia/dev/JuliaFormatter/src/pretty.jl:3
   [19] _format_text(::DefaultStyle, ::JuliaFormatter.State, ::CSTParser.EXPR) at /home/brandon/.julia/dev/JuliaFormatter/src/JuliaFormatter.jl:270
   [20] format_text(::String; indent::Int64, margin::Int64, style::DefaultStyle, always_for_in::Bool, whitespace_typedefs::Bool, whitespace_ops_in_indices::Bool, remove_extra_newlines::Bool, import_to_using::Bool, pipe_to_function_call::Bool, short_to_long_function_def::Bool, always_use_return::Bool, whitespace_in_kwargs::Bool, annotate_untyped_fields_with_any::Bool) at /home/brandon/.julia/dev/JuliaFormatter/src/JuliaFormatter.jl:258
   [21] #fmt1#3 at /home/brandon/.julia/dev/JuliaFormatter/test/runtests.jl:6 [inlined]
   [22] #fmt#5 at /home/brandon/.julia/dev/JuliaFormatter/test/runtests.jl:13 [inlined]
   [23] fmt(::String) at /home/brandon/.julia/dev/JuliaFormatter/test/runtests.jl:13
   [24] top-level scope at /home/brandon/.julia/dev/JuliaFormatter/test/default_style.jl:1529
   [25] top-level scope at /buildworker/worker/package_linux64/build/usr/share/julia/stdlib/v1.4/Test/src/Test.jl:1113
   [26] top-level scope at /home/brandon/.julia/dev/JuliaFormatter/test/default_style.jl:1514
   [27] top-level scope at /buildworker/worker/package_linux64/build/usr/share/julia/stdlib/v1.4/Test/src/Test.jl:1113
   [28] top-level scope at /home/brandon/.julia/dev/JuliaFormatter/test/default_style.jl:2

Format docstrings: Error During Test at /home/brandon/.julia/dev/JuliaFormatter/test/default_style.jl:4882
  Test threw exception
  Expression: fmt(unformatted) == formatted
  UndefRefError: access to undefined reference
  Stacktrace:
   [1] getproperty at ./Base.jl:33 [inlined]
   [2] (::CommonMark.var"#49#51"{CommonMark.TableRule})(::CommonMark.InlineParser, ::CommonMark.Node) at /home/brandon/.julia/dev/CommonMark/src/extensions/tables.jl:111
   [3] parse_inlines(::CommonMark.InlineParser, ::CommonMark.Node) at /home/brandon/.julia/dev/CommonMark/src/parsers/inlines.jl:125
   [4] parse at /home/brandon/.julia/dev/CommonMark/src/parsers/inlines.jl:129 [inlined]
   [5] process_inlines(::CommonMark.Parser, ::CommonMark.Node) at /home/brandon/.julia/dev/CommonMark/src/parsers/blocks.jl:416
   [6] parse(::CommonMark.Parser, ::Base.GenericIOBuffer{Array{UInt8,1}}; kws::Base.Iterators.Pairs{Union{},Union{},Tuple{},NamedTuple{(),Tuple{}}}) at /home/brandon/.julia/dev/CommonMark/src/parsers/blocks.jl:446
   [7] parse at /home/brandon/.julia/dev/CommonMark/src/parsers/blocks.jl:427 [inlined]
   [8] #_#21 at /home/brandon/.julia/dev/CommonMark/src/parsers/blocks.jl:451 [inlined]
   [9] Parser at /home/brandon/.julia/dev/CommonMark/src/parsers/blocks.jl:451 [inlined]
   [10] #_#20 at /home/brandon/.julia/dev/CommonMark/src/parsers/blocks.jl:450 [inlined]
   [11] Parser at /home/brandon/.julia/dev/CommonMark/src/parsers/blocks.jl:450 [inlined]
   [12] #p_literal#45 at /home/brandon/.julia/dev/JuliaFormatter/src/pretty.jl:344 [inlined]
   [13] p_macrocall(::DefaultStyle, ::CSTParser.EXPR, ::JuliaFormatter.State) at /home/brandon/.julia/dev/JuliaFormatter/src/pretty.jl:458
   [14] pretty(::DefaultStyle, ::CSTParser.EXPR, ::JuliaFormatter.State; kwargs::Base.Iterators.Pairs{Union{},Union{},Tuple{},NamedTuple{(),Tuple{}}}) at /home/brandon/.julia/dev/JuliaFormatter/src/pretty.jl:71
   [15] pretty(::DefaultStyle, ::CSTParser.EXPR, ::JuliaFormatter.State) at /home/brandon/.julia/dev/JuliaFormatter/src/pretty.jl:3
   [16] p_fileh(::DefaultStyle, ::CSTParser.EXPR, ::JuliaFormatter.State) at /home/brandon/.julia/dev/JuliaFormatter/src/pretty.jl:149
   [17] pretty(::DefaultStyle, ::CSTParser.EXPR, ::JuliaFormatter.State; kwargs::Base.Iterators.Pairs{Union{},Union{},Tuple{},NamedTuple{(),Tuple{}}}) at /home/brandon/.julia/dev/JuliaFormatter/src/pretty.jl:125
   [18] pretty(::DefaultStyle, ::CSTParser.EXPR, ::JuliaFormatter.State) at /home/brandon/.julia/dev/JuliaFormatter/src/pretty.jl:3
   [19] _format_text(::DefaultStyle, ::JuliaFormatter.State, ::CSTParser.EXPR) at /home/brandon/.julia/dev/JuliaFormatter/src/JuliaFormatter.jl:270
   [20] format_text(::String; indent::Int64, margin::Int64, style::DefaultStyle, always_for_in::Bool, whitespace_typedefs::Bool, whitespace_ops_in_indices::Bool, remove_extra_newlines::Bool, import_to_using::Bool, pipe_to_function_call::Bool, short_to_long_function_def::Bool, always_use_return::Bool, whitespace_in_kwargs::Bool, annotate_untyped_fields_with_any::Bool) at /home/brandon/.julia/dev/JuliaFormatter/src/JuliaFormatter.jl:258
   [21] #fmt1#3 at /home/brandon/.julia/dev/JuliaFormatter/test/runtests.jl:6 [inlined]
   [22] #fmt#5 at /home/brandon/.julia/dev/JuliaFormatter/test/runtests.jl:13 [inlined]
   [23] fmt(::String) at /home/brandon/.julia/dev/JuliaFormatter/test/runtests.jl:13
   [24] top-level scope at /home/brandon/.julia/dev/JuliaFormatter/test/default_style.jl:4882
   [25] top-level scope at /buildworker/worker/package_linux64/build/usr/share/julia/stdlib/v1.4/Test/src/Test.jl:1113
   [26] top-level scope at /home/brandon/.julia/dev/JuliaFormatter/test/default_style.jl:4807
   [27] top-level scope at /buildworker/worker/package_linux64/build/usr/share/julia/stdlib/v1.4/Test/src/Test.jl:1113
   [28] top-level scope at /home/brandon/.julia/dev/JuliaFormatter/test/default_style.jl:2
bramtayl commented 4 years ago

This seems to do it:

using CommonMark

parser = Parser()
enable!(parser, [TableRule()])
parser(
    """
    \"""
    Interpolate using `\\\$`
    \"""
    a"""
)
MichaelHatherly commented 4 years ago

Hopefully it's just a simple missing condition:

diff --git a/src/extensions/tables.jl b/src/extensions/tables.jl
index cb50f8f..75d5755 100644
--- a/src/extensions/tables.jl
+++ b/src/extensions/tables.jl
@@ -107,6 +107,7 @@ end
 # Low priority since this *must* happen after nested structure of emphasis and
 # links is determined. 100 should do fine.
 inline_modifier(rule::TableRule) = Rule(100) do parser, block
+    block.t isa TableRow || return
     isheader = block.parent.t isa TableHeader
     spec = block.parent.parent.t.spec
     max_cols = length(spec)

Could you try applying that to CommonMark and see what happens?

bramtayl commented 4 years ago

Yes, that seems to have done it! I enabled all the extensions and the test passed.

MichaelHatherly commented 4 years ago

Good, thanks for confirming. I'll tag a patch release either late today, or tomorrow. I suppose this highlights the need for some thorough integration tests with all the extensions enabled.

bramtayl commented 4 years ago

Well, if the PR ever lifts off, JuliaFormatter could be a test suite unto itself!