Skip to content

Commit 5ad9bd7

Browse files
committed
fix: advance parser if sub-parser has closing delimiter leftover
1 parent 0513a5d commit 5ad9bd7

2 files changed

Lines changed: 45 additions & 2 deletions

File tree

‎lib/spitfire.ex‎

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,12 @@ defmodule Spitfire do
212212
peek_token(parser) in [:eol, :";", :eof] and parser.tokens != :eot ->
213213
next_token(parser)
214214

215+
current_token(parser) in [:")", :"]", :"}", :">>"] ->
216+
next_token(parser)
217+
218+
peek_token(parser) in [:")", :"]", :"}", :">>"] ->
219+
next_token(parser)
220+
215221
true ->
216222
parser
217223
end

‎test/spitfire_test.exs‎

Lines changed: 39 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2646,7 +2646,6 @@ defmodule SpitfireTest do
26462646
{{:., [line: 5, column: 37], [{:state, [line: 5, column: 32], nil}, :baz]},
26472647
[no_parens: true, line: 5, column: 38], []}
26482648
]},
2649-
{:__block__, [error: true, line: 5, column: 41], []},
26502649
{:__block__,
26512650
[
26522651
end_of_expression: [newlines: 1, line: 5, column: 43],
@@ -2658,7 +2657,6 @@ defmodule SpitfireTest do
26582657
[
26592658
{[line: 2, column: 8], "missing closing brace for map"},
26602659
{[line: 4, column: 1], "unknown token: ,"},
2661-
{[line: 5, column: 41], "unknown token: )"},
26622660
{[line: 5, column: 42], "unknown token: }"}
26632661
]}
26642662
end
@@ -3104,6 +3102,45 @@ defmodule SpitfireTest do
31043102
{[line: 1, column: 16], "missing closing brace for struct %__MODULE__"}
31053103
]} == Spitfire.parse("%__MODULE__ a: 1")
31063104
end
3105+
3106+
test "stray closing delimiter after identifier" do
3107+
assert {:error, {:__block__, [], [{:x, _, nil}, {:__block__, [error: true, line: 1, column: 3], []}]},
3108+
[{[line: 1, column: 3], "unknown token: ]"}]} = Spitfire.parse("x ]")
3109+
3110+
assert {:error, {:__block__, [], [{:x, _, nil}, {:__block__, [error: true, line: 1, column: 3], []}]},
3111+
[{[line: 1, column: 3], "unknown token: }"}]} = Spitfire.parse("x }")
3112+
3113+
assert {:error, {:__block__, [], [{:x, _, nil}, {:__block__, [error: true, line: 1, column: 3], []}]},
3114+
[{[line: 1, column: 3], "unknown token: )"}]} = Spitfire.parse("x )")
3115+
3116+
assert {:error, {:__block__, [], [{:@, _, [{:x, _, nil}]}, {:__block__, [error: true, line: 1, column: 4], []}]},
3117+
[{[line: 1, column: 4], "unknown token: ]"}]} = Spitfire.parse("@x ]")
3118+
3119+
assert {:error, {:__block__, [], [1, {:__block__, [error: true, line: 1, column: 3], []}]},
3120+
[{[line: 1, column: 3], "unknown token: ]"}]} = Spitfire.parse("1 ]")
3121+
3122+
assert {:error, _ast, [{[line: 1, column: 3], "unknown token: ]"}, {[line: 1, column: 5], "unknown token: }"}]} =
3123+
Spitfire.parse("x ] }")
3124+
end
3125+
3126+
test "stray closing delimiter after complete expression" do
3127+
assert {:error,
3128+
{:__block__, [],
3129+
[
3130+
{:foo, [closing: [line: 1, column: 5], line: 1, column: 1], []},
3131+
{:__block__, [error: true, line: 1, column: 6], []}
3132+
]}, [{[line: 1, column: 6], "unknown token: }"}]} = Spitfire.parse("foo()}")
3133+
3134+
assert {:error, {:__block__, [], [[1, 2], {:__block__, [error: true, line: 1, column: 7], []}]},
3135+
[{[line: 1, column: 7], "unknown token: }"}]} = Spitfire.parse("[1, 2]}")
3136+
3137+
assert {:error,
3138+
{:__block__, [],
3139+
[
3140+
{:%{}, [closing: [line: 1, column: 7], line: 1, column: 1], [a: 1]},
3141+
{:__block__, [error: true, line: 1, column: 8], []}
3142+
]}, [{[line: 1, column: 8], "unknown token: )"}]} = Spitfire.parse("%{a: 1})")
3143+
end
31073144
end
31083145

31093146
describe "&parse_with_comments/2" do

0 commit comments

Comments
 (0)