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..1f583cda95d 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,43 @@ 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) + + assert quoted_to_string(ast) == expected + + ast = + Code.string_to_quoted!(input, + 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) + + assert quoted_to_string(ast) == expected + + ast = + Code.string_to_quoted!(input, + 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