Skip to content

Commit 0372af3

Browse files
committed
feat: access syntax
1 parent 0be0f08 commit 0372af3

File tree

2 files changed

+24
-2
lines changed

2 files changed

+24
-2
lines changed

lib/spitfire.ex

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,7 @@ defmodule Spitfire do
147147
:identifier -> &parse_identifier/1
148148
:do_identifier -> &parse_identifier/1
149149
:paren_identifier -> &parse_identifier/1
150+
:bracket_identifier -> &parse_identifier/1
150151
:alias -> &parse_alias/1
151152
:kw_identifier -> &parse_kw_identifier/1
152153
:int -> &parse_int/1
@@ -693,17 +694,32 @@ defmodule Spitfire do
693694
end
694695

695696
defp parse_identifier(%{current_token: {:paren_identifier, _, token}} = parser) do
696-
parser = parser |> next_token() |> eat_eol()
697+
parser =
698+
parser
699+
|> next_token()
700+
|> eat_eol()
697701

698702
if peek_token(parser) == :")" do
699703
{{token, [], []}, next_token(parser)}
700704
else
701-
{pairs, parser} = parse_comma_list(parser |> next_token() |> eat_eol())
705+
{pairs, parser} =
706+
parser
707+
|> next_token()
708+
|> eat_eol()
709+
|> parse_comma_list()
702710

703711
{{token, [], List.wrap(pairs)}, parser |> next_token() |> eat_eol()}
704712
end
705713
end
706714

715+
defp parse_identifier(%{current_token: {:bracket_identifier, _, token}} = parser) do
716+
parser = parser |> next_token() |> eat_eol()
717+
718+
{key, parser} = parse_expression(parser |> next_token() |> eat_eol())
719+
ast = {{:., [], [Access, :get]}, [], [{token, [], Elixir}, key]}
720+
{ast, parser |> next_token() |> eat_eol()}
721+
end
722+
707723
@operators [
708724
:"=>",
709725
:->,

test/spitfire_test.exs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,12 @@ defmodule SpitfireTest do
4040
]}
4141
end
4242

43+
test "access syntax" do
44+
code = "foo[:bar]"
45+
46+
assert Spitfire.parse(code) == {{:., [], [Access, :get]}, [], [{:foo, [], Elixir}, :bar]}
47+
end
48+
4349
test "parses unary operators" do
4450
code = ~S'''
4551
^foo

0 commit comments

Comments
 (0)