Skip to content

Commit 480c19c

Browse files
committed
Respect keywords in access in code formatter
1 parent 1c9d736 commit 480c19c

File tree

4 files changed

+44
-9
lines changed

4 files changed

+44
-9
lines changed

lib/elixir/lib/code/formatter.ex

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -393,10 +393,17 @@ defmodule Code.Formatter do
393393
end
394394

395395
# foo[bar]
396-
defp quoted_to_algebra({{:., _, [Access, :get]}, meta, [target | args]}, _context, state) do
396+
defp quoted_to_algebra({{:., _, [Access, :get]}, meta, [target, arg]}, _context, state) do
397397
{target_doc, state} = remote_target_to_algebra(target, state)
398-
{call_doc, state} = list_to_algebra(meta, args, state)
399-
{concat(target_doc, call_doc), state}
398+
399+
{access_doc, state} =
400+
if keyword?(arg) do
401+
list_to_algebra(meta, arg, state)
402+
else
403+
list_to_algebra(meta, [arg], state)
404+
end
405+
406+
{concat(target_doc, access_doc), state}
400407
end
401408

402409
# %Foo{}

lib/elixir/src/elixir_parser.yrl

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -285,9 +285,9 @@ number -> char : handle_number(?exprs('$1'), '$1', number_value('$1')).
285285
parens_call -> dot_call_identifier call_args_parens : build_parens('$1', '$2', {[], []}).
286286
parens_call -> dot_call_identifier call_args_parens call_args_parens : build_nested_parens('$1', '$2', '$3', {[], []}).
287287

288-
bracket_arg -> open_bracket kw close_bracket : build_list('$1', '$2', '$3').
289-
bracket_arg -> open_bracket container_expr close_bracket : build_list('$1', '$2', '$3').
290-
bracket_arg -> open_bracket container_expr ',' close_bracket : build_list('$1', '$2', '$4').
288+
bracket_arg -> open_bracket kw close_bracket : build_access_arg('$1', '$2', '$3').
289+
bracket_arg -> open_bracket container_expr close_bracket : build_access_arg('$1', '$2', '$3').
290+
bracket_arg -> open_bracket container_expr ',' close_bracket : build_access_arg('$1', '$2', '$4').
291291

292292
bracket_expr -> dot_bracket_identifier bracket_arg : build_access(build_no_parens('$1', nil), '$2').
293293
bracket_expr -> access_expr bracket_arg : build_access('$1', '$2').
@@ -882,8 +882,10 @@ build_fn(Fn, Stab, End) ->
882882

883883
%% Access
884884

885-
build_access(Expr, {List, Location}) ->
886-
Meta = meta_from_location(Location),
885+
build_access_arg(Left, Args, Right) ->
886+
{Args, newlines_pair(Left, Right) ++ meta_from_token(Left)}.
887+
888+
build_access(Expr, {List, Meta}) ->
887889
{{'.', Meta, ['Elixir.Access', get]}, Meta, [Expr, List]}.
888890

889891
%% Interpolation aware

lib/elixir/test/elixir/code_formatter/calls_test.exs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1215,7 +1215,9 @@ defmodule Code.Formatter.CallsTest do
12151215
end
12161216

12171217
test "with keywords" do
1218-
assert_format "expr[foo: bar, baz: bat]", "expr[[foo: bar, baz: bat]]"
1218+
assert_format "expr[[]]", "expr[[]]"
1219+
assert_format "expr[foo: bar, baz: bat]", "expr[foo: bar, baz: bat]"
1220+
assert_format "expr[[foo: bar, baz: bat]]", "expr[[foo: bar, baz: bat]]"
12191221
end
12201222
end
12211223
end

lib/elixir/test/elixir/code_formatter/comments_test.exs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -358,6 +358,30 @@ defmodule Code.Formatter.CommentsTest do
358358
end
359359
end
360360

361+
describe "access" do
362+
test "before and after single arg" do
363+
assert_same ~S"""
364+
foo[
365+
# bar
366+
baz
367+
# bat
368+
]
369+
"""
370+
end
371+
372+
test "before and after keywords" do
373+
assert_same ~S"""
374+
foo[
375+
# bar
376+
one: :two,
377+
# baz
378+
three: :four
379+
# bat
380+
]
381+
"""
382+
end
383+
end
384+
361385
describe "calls" do
362386
test "local with parens inside before and after" do
363387
assert_same ~S"""

0 commit comments

Comments
 (0)