Skip to content

Commit 987eb6e

Browse files
committed
Fix crash in keyword parsing
1 parent b752cb5 commit 987eb6e

File tree

2 files changed

+40
-8
lines changed

2 files changed

+40
-8
lines changed

lib/spitfire.ex

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -549,10 +549,15 @@ defmodule Spitfire do
549549

550550
{kvs, parser} =
551551
while2 peek_token(parser) == :"," <- parser do
552-
parser = parser |> next_token() |> next_token()
553-
{pair, parser} = parse_kw_identifier(parser)
554-
555-
{pair, parser}
552+
if kw_identifier?(current_token(parser)) do
553+
parser = parser |> next_token() |> next_token()
554+
{pair, parser} = parse_kw_identifier(parser)
555+
{pair, parser}
556+
else
557+
parser = parser |> next_token() |> next_token()
558+
{item, parser} = parse_expression(parser, @kw_identifier, true, false, false)
559+
{item, parser}
560+
end
556561
end
557562

558563
{[{token, value} | kvs], parser}
@@ -573,15 +578,24 @@ defmodule Spitfire do
573578

574579
{kvs, parser} =
575580
while2 peek_token(parser) == :"," <- parser do
576-
parser = parser |> next_token() |> next_token()
577-
{pair, parser} = parse_kw_identifier(parser)
578-
579-
{pair, parser}
581+
if kw_identifier?(current_token(parser)) do
582+
parser = parser |> next_token() |> next_token()
583+
{pair, parser} = parse_kw_identifier(parser)
584+
{pair, parser}
585+
else
586+
parser = parser |> next_token() |> next_token()
587+
{item, parser} = parse_expression(parser, @kw_identifier, true, false, false)
588+
{item, parser}
589+
end
580590
end
581591

582592
{[{atom, value} | kvs], parser}
583593
end
584594

595+
defp kw_identifier?({:kw_identifier, _, _}), do: true
596+
defp kw_identifier?({:kw_identifier_unsafe, _, _}), do: true
597+
defp kw_identifier?(_), do: false
598+
585599
defp parse_assoc_op(%{current_token: {:assoc_op, _, _token}} = parser, key) do
586600
parser = parser |> next_token() |> eat_eol()
587601
{value, parser} = parse_expression(parser, @assoc_op, false, false, false)

test/spitfire_test.exs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -534,6 +534,24 @@ defmodule SpitfireTest do
534534
end
535535
end
536536

537+
test "unfinished keyword list" do
538+
code = ~S'''
539+
defmodule MyModule do
540+
IO.inspect(
541+
:stderr,
542+
label: "label",
543+
(__cursor__())
544+
)
545+
end
546+
'''
547+
548+
assert Spitfire.parse(code) == s2q(code)
549+
550+
code = ~S'foo(a, "#{field}": value, (__cursor__()))'
551+
552+
assert Spitfire.parse(code) == s2q(code)
553+
end
554+
537555
test "another thing" do
538556
code = ~S'''
539557
case foo do

0 commit comments

Comments
 (0)