From 2d1c64cc5d97cdba1e9f05de88623eafc46dfe3d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Valim?= Date: Mon, 24 May 2021 09:42:25 +0200 Subject: [PATCH] Do not assume delimiter is always available for sigils --- lib/elixir/lib/code/normalizer.ex | 5 ++++- .../elixir/code_normalizer/quoted_ast_test.exs | 14 ++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/lib/elixir/lib/code/normalizer.ex b/lib/elixir/lib/code/normalizer.ex index 601cef76b7..c32ed29454 100644 --- a/lib/elixir/lib/code/normalizer.ex +++ b/lib/elixir/lib/code/normalizer.ex @@ -177,7 +177,10 @@ defmodule Code.Normalizer do when is_atom(sigil) do case Atom.to_string(sigil) do <<"sigil_", _name>> -> - meta = patch_meta_line(meta, state.parent_meta) + meta = + meta + |> patch_meta_line(state.parent_meta) + |> Keyword.put_new(:delimiter, "\"") {sigil, meta, [do_normalize(string, %{state | parent_meta: meta}), modifiers]} 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 11b09c4a05..ff44e387c6 100644 --- a/lib/elixir/test/elixir/code_normalizer/quoted_ast_test.exs +++ b/lib/elixir/test/elixir/code_normalizer/quoted_ast_test.exs @@ -85,6 +85,9 @@ defmodule Code.Normalizer.QuotedASTTest do assert quoted_to_string(quote(do: ~S["'(123)'"])) == ~S/~S["'(123)'"]/ assert quoted_to_string(quote(do: ~s"#{"foo"}")) == ~S/~s"#{"foo"}"/ + assert quoted_to_string(quote(do: ~S["'(123)'"]) |> strip_metadata()) == ~S/~S"\"'(123)'\""/ + assert quoted_to_string(quote(do: ~s"#{"foo"}") |> strip_metadata()) == ~S/~s"#{"foo"}"/ + assert quoted_to_string( quote do ~s""" @@ -126,6 +129,13 @@ defmodule Code.Normalizer.QuotedASTTest do ) == ~s[~S"""\n"123"\n"""] end + test "tuple" do + assert quoted_to_string(quote do: {1, 2}) == "{1, 2}" + assert quoted_to_string(quote do: {1}) == "{1}" + assert quoted_to_string(quote do: {1, 2, 3}) == "{1, 2, 3}" + assert quoted_to_string(quote do: {1, 2, 3, foo: :bar}) == "{1, 2, 3, [foo: :bar]}" + end + test "tuple call" do assert quoted_to_string(quote(do: alias(Foo.{Bar, Baz, Bong}))) == "alias Foo.{Bar, Baz, Bong}" @@ -580,6 +590,10 @@ defmodule Code.Normalizer.QuotedASTTest do end end + defp strip_metadata(ast) do + Macro.prewalk(ast, &Macro.update_meta(&1, fn _ -> [] end)) + end + defp quoted_to_string(quoted, opts \\ []) do doc = Code.quoted_to_algebra(quoted, opts)