Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -27,3 +27,4 @@ spitfire-*.tar
benchmarks
*.bggg
priv/plts/*
.expert
27 changes: 23 additions & 4 deletions lib/spitfire.ex
Original file line number Diff line number Diff line change
Expand Up @@ -174,6 +174,7 @@ defmodule Spitfire do
case result do
{:ok, ast} -> {:ok, ast, comments}
{:error, ast, errors} -> {:error, ast, comments, errors}
{:error, :no_fuel_remaining} -> {:error, :no_fuel_remaining}
end
after
Process.delete(:code_formatter_comments)
Expand Down Expand Up @@ -619,9 +620,16 @@ defmodule Spitfire do
{kvs, parser} =
while2 peek_token(parser) == :"," <- parser do
parser = parser |> next_token() |> next_token()
{pair, parser} = parse_kw_identifier(parser)

{pair, parser}
case current_token_type(parser) do
type when type in [:kw_identifier, :kw_identifier_unsafe] ->
{pair, parser} = parse_kw_identifier(parser)
{pair, parser}

_ ->
# Not a keyword identifier, exit the loop
{:filter, {nil, parser}}
end
end

{[{token, value} | kvs], parser}
Expand All @@ -646,9 +654,16 @@ defmodule Spitfire do
{kvs, parser} =
while2 peek_token(parser) == :"," <- parser do
parser = parser |> next_token() |> next_token()
{pair, parser} = parse_kw_identifier(parser)

{pair, parser}
case current_token_type(parser) do
type when type in [:kw_identifier, :kw_identifier_unsafe] ->
{pair, parser} = parse_kw_identifier(parser)
{pair, parser}

_ ->
# Not a keyword identifier, exit the loop
{:filter, {nil, parser}}
end
end

{[{atom, value} | kvs], parser}
Expand Down Expand Up @@ -2415,6 +2430,10 @@ defmodule Spitfire do
:eof
end

defp peek_token(%{peek_token: nil}) do
:eof
end

defp peek_token_eat_eol(%{peek_token: {:eol, _token}} = parser) do
peek_token_eat_eol(next_token(parser))
end
Expand Down
18 changes: 18 additions & 0 deletions test/spitfire_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -2722,6 +2722,24 @@ defmodule SpitfireTest do
]
}
end

test "invalid character inside list" do
assert Spitfire.parse("[«]") ==
{:error, [{:__block__, [error: true], []}],
[
{[], "unknown token: eot"},
{[line: 1, column: 1], "missing closing bracket for list"}
]}
end

test "invalid character inside tuple" do
assert Spitfire.parse("{«}") ==
{:error, {:{}, [closing: [], line: 1, column: 1], [{:__block__, [error: true], []}]},
[
{[], "unknown token: eot"},
{[line: 1, column: 1], "missing closing brace for tuple"}
]}
end
end

describe "&parse_with_comments/2" do
Expand Down