Skip to content

Commit 34f32ef

Browse files
authored
Keep keyword format of tuple last element (#11354)
1 parent c1d2bc7 commit 34f32ef

File tree

2 files changed

+28
-1
lines changed

2 files changed

+28
-1
lines changed

lib/elixir/lib/code/normalizer.ex

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,20 @@ defmodule Code.Normalizer do
182182
end
183183
end
184184

185+
# Tuples
186+
defp do_normalize({:{}, meta, args} = quoted, state) do
187+
{last_arg, args} = List.pop_at(args, -1)
188+
189+
with [{{:__block__, key_meta, _}, _} | _] <- last_arg, :keyword <- key_meta[:format] do
190+
args = normalize_kw_args(args, state)
191+
kw_list = normalize_kw_args(last_arg, state)
192+
{:{}, meta, args ++ kw_list}
193+
else
194+
_ ->
195+
normalize_call(quoted, state)
196+
end
197+
end
198+
185199
# Calls
186200
defp do_normalize({_, _, args} = quoted, state) when is_list(args) do
187201
normalize_call(quoted, state)
@@ -231,7 +245,13 @@ defmodule Code.Normalizer do
231245
defp normalize_literal({left, right}, meta, state) do
232246
meta = patch_meta_line(meta, state.parent_meta)
233247
state = %{state | parent_meta: meta}
234-
{:__block__, meta, [{do_normalize(left, state), do_normalize(right, state)}]}
248+
249+
with [{{:__block__, key_meta, _}, _} | _] <- right, :keyword <- key_meta[:format] do
250+
{:__block__, meta, [{do_normalize(left, state), normalize_kw_args(right, state)}]}
251+
else
252+
_ ->
253+
{:__block__, meta, [{do_normalize(left, state), do_normalize(right, state)}]}
254+
end
235255
end
236256

237257
# Lists

lib/elixir/test/elixir/code_normalizer/formatted_ast_test.exs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -342,6 +342,13 @@ defmodule Code.Normalizer.FormatterASTTest do
342342
@type foo :: a when b: :c
343343
"""
344344
end
345+
346+
test "last tuple element as keyword list keeps its format" do
347+
assert_same ~S"{:wrapped, [opt1: true, opt2: false]}"
348+
assert_same ~S"{:unwrapped, opt1: true, opt2: false}"
349+
assert_same ~S"{:wrapped, 1, [opt1: true, opt2: false]}"
350+
assert_same ~S"{:unwrapped, 1, opt1: true, opt2: false}"
351+
end
345352
end
346353

347354
describe "preserves user choice on parenthesis" do

0 commit comments

Comments
 (0)