Skip to content

Commit 5b221a5

Browse files
Add AST metadata about assoc operator location (#13978)
1 parent 9197ce5 commit 5b221a5

File tree

2 files changed

+45
-4
lines changed

2 files changed

+45
-4
lines changed

lib/elixir/src/elixir_parser.yrl

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -610,10 +610,10 @@ map_base_expr -> ellipsis_op map_base_expr : build_unary_op('$1', '$2').
610610
assoc_op_eol -> assoc_op : '$1'.
611611
assoc_op_eol -> assoc_op eol : '$1'.
612612

613-
assoc_expr -> matched_expr assoc_op_eol matched_expr : {'$1', '$3'}.
614-
assoc_expr -> unmatched_expr assoc_op_eol unmatched_expr : {'$1', '$3'}.
615-
assoc_expr -> matched_expr assoc_op_eol unmatched_expr : {'$1', '$3'}.
616-
assoc_expr -> unmatched_expr assoc_op_eol matched_expr : {'$1', '$3'}.
613+
assoc_expr -> matched_expr assoc_op_eol matched_expr : {with_assoc_meta('$1', '$2'), '$3'}.
614+
assoc_expr -> unmatched_expr assoc_op_eol unmatched_expr : {with_assoc_meta('$1', '$2'), '$3'}.
615+
assoc_expr -> matched_expr assoc_op_eol unmatched_expr : {with_assoc_meta('$1', '$2'), '$3'}.
616+
assoc_expr -> unmatched_expr assoc_op_eol matched_expr : {with_assoc_meta('$1', '$2'), '$3'}.
617617
assoc_expr -> map_base_expr : '$1'.
618618

619619
assoc_update -> matched_expr pipe_op_eol assoc_expr : {'$2', '$1', ['$3']}.
@@ -1154,6 +1154,15 @@ parens_meta({Open, Close}) ->
11541154
parens_meta({Open, _Args, Close}) ->
11551155
parens_meta({Open, Close}).
11561156

1157+
with_assoc_meta({Target, Meta, Args}, AssocToken) ->
1158+
case ?token_metadata() of
1159+
true ->
1160+
{Target, [{assoc, meta_from_token(AssocToken)} | Meta], Args};
1161+
false ->
1162+
{Target, Meta, Args}
1163+
end;
1164+
1165+
with_assoc_meta(Left, _AssocToken) -> Left.
11571166

11581167
%% Warnings and errors
11591168

lib/elixir/test/elixir/kernel/parser_test.exs

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -856,6 +856,38 @@ defmodule Kernel.ParserTest do
856856
assert string_to_quoted.("foo.\nBar\n.\nBaz") ==
857857
{:__aliases__, [last: [line: 4], line: 1], [{:foo, [line: 1], nil}, :Bar, :Baz]}
858858
end
859+
860+
test "adds metadata about assoc operator position in maps" do
861+
opts = [
862+
literal_encoder: &{:ok, {:__block__, &2, [&1]}},
863+
token_metadata: true,
864+
columns: true
865+
]
866+
867+
string_to_quoted = &Code.string_to_quoted!(&1, opts)
868+
869+
file = "%{:key => 1, {} => {}}"
870+
871+
assert string_to_quoted.(file) ==
872+
{
873+
:%{},
874+
[closing: [line: 1, column: 22], line: 1, column: 1],
875+
[
876+
{{:__block__, [assoc: [line: 1, column: 8], line: 1, column: 3], [:key]},
877+
{:__block__, [token: "1", line: 1, column: 11], [1]}},
878+
{
879+
{:{},
880+
[
881+
assoc: [line: 1, column: 17],
882+
closing: [line: 1, column: 15],
883+
line: 1,
884+
column: 14
885+
], []},
886+
{:{}, [closing: [line: 1, column: 21], line: 1, column: 20], []}
887+
}
888+
]
889+
}
890+
end
859891
end
860892

861893
describe "syntax errors" do

0 commit comments

Comments
 (0)