From 70e241ce09e1c09151f37cda0ecb984dfa4a1157 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonatan=20K=C5=82osko?= Date: Thu, 7 Nov 2024 16:47:50 +0800 Subject: [PATCH] Add AST metadata about assoc operator location --- lib/elixir/src/elixir_parser.yrl | 17 +++++++--- lib/elixir/test/elixir/kernel/parser_test.exs | 32 +++++++++++++++++++ 2 files changed, 45 insertions(+), 4 deletions(-) diff --git a/lib/elixir/src/elixir_parser.yrl b/lib/elixir/src/elixir_parser.yrl index 61fad685aa1..05dafcdcf4d 100644 --- a/lib/elixir/src/elixir_parser.yrl +++ b/lib/elixir/src/elixir_parser.yrl @@ -610,10 +610,10 @@ map_base_expr -> ellipsis_op map_base_expr : build_unary_op('$1', '$2'). assoc_op_eol -> assoc_op : '$1'. assoc_op_eol -> assoc_op eol : '$1'. -assoc_expr -> matched_expr assoc_op_eol matched_expr : {'$1', '$3'}. -assoc_expr -> unmatched_expr assoc_op_eol unmatched_expr : {'$1', '$3'}. -assoc_expr -> matched_expr assoc_op_eol unmatched_expr : {'$1', '$3'}. -assoc_expr -> unmatched_expr assoc_op_eol matched_expr : {'$1', '$3'}. +assoc_expr -> matched_expr assoc_op_eol matched_expr : {with_assoc_meta('$1', '$2'), '$3'}. +assoc_expr -> unmatched_expr assoc_op_eol unmatched_expr : {with_assoc_meta('$1', '$2'), '$3'}. +assoc_expr -> matched_expr assoc_op_eol unmatched_expr : {with_assoc_meta('$1', '$2'), '$3'}. +assoc_expr -> unmatched_expr assoc_op_eol matched_expr : {with_assoc_meta('$1', '$2'), '$3'}. assoc_expr -> map_base_expr : '$1'. assoc_update -> matched_expr pipe_op_eol assoc_expr : {'$2', '$1', ['$3']}. @@ -1154,6 +1154,15 @@ parens_meta({Open, Close}) -> parens_meta({Open, _Args, Close}) -> parens_meta({Open, Close}). +with_assoc_meta({Target, Meta, Args}, AssocToken) -> + case ?token_metadata() of + true -> + {Target, [{assoc, meta_from_token(AssocToken)} | Meta], Args}; + false -> + {Target, Meta, Args} + end; + +with_assoc_meta(Left, _AssocToken) -> Left. %% Warnings and errors diff --git a/lib/elixir/test/elixir/kernel/parser_test.exs b/lib/elixir/test/elixir/kernel/parser_test.exs index a373f39a632..f22bf41bf53 100644 --- a/lib/elixir/test/elixir/kernel/parser_test.exs +++ b/lib/elixir/test/elixir/kernel/parser_test.exs @@ -856,6 +856,38 @@ defmodule Kernel.ParserTest do assert string_to_quoted.("foo.\nBar\n.\nBaz") == {:__aliases__, [last: [line: 4], line: 1], [{:foo, [line: 1], nil}, :Bar, :Baz]} end + + test "adds metadata about assoc operator position in maps" do + opts = [ + literal_encoder: &{:ok, {:__block__, &2, [&1]}}, + token_metadata: true, + columns: true + ] + + string_to_quoted = &Code.string_to_quoted!(&1, opts) + + file = "%{:key => 1, {} => {}}" + + assert string_to_quoted.(file) == + { + :%{}, + [closing: [line: 1, column: 22], line: 1, column: 1], + [ + {{:__block__, [assoc: [line: 1, column: 8], line: 1, column: 3], [:key]}, + {:__block__, [token: "1", line: 1, column: 11], [1]}}, + { + {:{}, + [ + assoc: [line: 1, column: 17], + closing: [line: 1, column: 15], + line: 1, + column: 14 + ], []}, + {:{}, [closing: [line: 1, column: 21], line: 1, column: 20], []} + } + ] + } + end end describe "syntax errors" do