From 96212bb096516d3592b43165b694c125db03a6a6 Mon Sep 17 00:00:00 2001 From: sabiwara Date: Sat, 19 Oct 2024 19:57:43 +0900 Subject: [PATCH 1/2] Attemptive fix for edge case in normalizer for keyword args - wip --- lib/elixir/lib/code/normalizer.ex | 2 +- .../code_normalizer/quoted_ast_test.exs | 39 +++++++++++++++++++ 2 files changed, 40 insertions(+), 1 deletion(-) diff --git a/lib/elixir/lib/code/normalizer.ex b/lib/elixir/lib/code/normalizer.ex index 96ec5a826db..c4a71b676cd 100644 --- a/lib/elixir/lib/code/normalizer.ex +++ b/lib/elixir/lib/code/normalizer.ex @@ -347,7 +347,7 @@ defmodule Code.Normalizer do args = normalize_args(args, %{state | parent_meta: meta}) {form, meta, args} - Keyword.has_key?(meta, :do) or match?([{{:__block__, _, [:do]}, _} | _], last) -> + Keyword.has_key?(meta, :do) -> # def foo do :ok end # def foo, do: :ok normalize_kw_blocks(form, meta, args, state) diff --git a/lib/elixir/test/elixir/code_normalizer/quoted_ast_test.exs b/lib/elixir/test/elixir/code_normalizer/quoted_ast_test.exs index cc41cf20eba..d02435ba9d4 100644 --- a/lib/elixir/test/elixir/code_normalizer/quoted_ast_test.exs +++ b/lib/elixir/test/elixir/code_normalizer/quoted_ast_test.exs @@ -629,6 +629,45 @@ defmodule Code.Normalizer.QuotedASTTest do assert quoted_to_string(quote(do: foo |> [bar: :baz])) == "foo |> [bar: :baz]" end + test "keyword arg edge case: cursor" do + input = "def foo, do: :bar, __cursor__()" + expected = "def foo, [{:do, :bar}, __cursor__()]" + + ast = Code.string_to_quoted!(input, token_metadata: true) + + assert quoted_to_string(ast) == expected + + ast = + Code.string_to_quoted!(input, + token_metadata: true, + literal_encoder: &{:ok, {:__block__, &2, [&1]}} + ) + + assert quoted_to_string(ast) == expected + end + + test "keyword arg edge case: literal encoder" do + input = """ + foo Bar do + :ok + end + """ + + expected = String.trim(input) + + ast = Code.string_to_quoted!(input, token_metadata: true) + + assert quoted_to_string(ast) == expected + + ast = + Code.string_to_quoted!(input, + token_metadata: true, + literal_encoder: &{:ok, {:__block__, &2, [&1]}} + ) + + assert quoted_to_string(ast) == expected + end + test "list in module attribute" do assert quoted_to_string( quote do From 66775f5bea5d1b876f1c6265d5bf48dd89bda4b4 Mon Sep 17 00:00:00 2001 From: sabiwara Date: Sat, 19 Oct 2024 20:50:20 +0900 Subject: [PATCH 2/2] Failing test --- .../test/elixir/code_normalizer/quoted_ast_test.exs | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/lib/elixir/test/elixir/code_normalizer/quoted_ast_test.exs b/lib/elixir/test/elixir/code_normalizer/quoted_ast_test.exs index d02435ba9d4..1f583cda95d 100644 --- a/lib/elixir/test/elixir/code_normalizer/quoted_ast_test.exs +++ b/lib/elixir/test/elixir/code_normalizer/quoted_ast_test.exs @@ -633,13 +633,12 @@ defmodule Code.Normalizer.QuotedASTTest do input = "def foo, do: :bar, __cursor__()" expected = "def foo, [{:do, :bar}, __cursor__()]" - ast = Code.string_to_quoted!(input, token_metadata: true) + ast = Code.string_to_quoted!(input) assert quoted_to_string(ast) == expected ast = Code.string_to_quoted!(input, - token_metadata: true, literal_encoder: &{:ok, {:__block__, &2, [&1]}} ) @@ -648,20 +647,19 @@ defmodule Code.Normalizer.QuotedASTTest do test "keyword arg edge case: literal encoder" do input = """ - foo Bar do + foo(Bar) do :ok end """ expected = String.trim(input) - ast = Code.string_to_quoted!(input, token_metadata: true) + ast = Code.string_to_quoted!(input) assert quoted_to_string(ast) == expected ast = Code.string_to_quoted!(input, - token_metadata: true, literal_encoder: &{:ok, {:__block__, &2, [&1]}} )