From 732cbd7d8d4ae3a47a2b494947d36bacd486718e Mon Sep 17 00:00:00 2001 From: Paulo Daniel Gonzalez Date: Sat, 28 Sep 2024 14:34:56 -0500 Subject: [PATCH 1/2] fix(formatter): fix small issue where there was only one newline added to a def that is followed by a module attribute. --- lib/elixir/lib/code/formatter.ex | 12 ++++- .../elixir/code_formatter/general_test.exs | 50 +++++++++++++++++++ 2 files changed, 60 insertions(+), 2 deletions(-) diff --git a/lib/elixir/lib/code/formatter.ex b/lib/elixir/lib/code/formatter.ex index 366a8d8b275..39a58cad91d 100644 --- a/lib/elixir/lib/code/formatter.ex +++ b/lib/elixir/lib/code/formatter.ex @@ -637,8 +637,8 @@ defmodule Code.Formatter do end defp block_args_to_algebra(args, min_line, max_line, state) do - quoted_to_algebra = fn {kind, meta, _} = arg, _args, state -> - newlines = meta[:end_of_expression][:newlines] || 1 + quoted_to_algebra = fn {kind, meta, _} = arg, args, state -> + newlines = maybe_add_newlines({kind, args}, meta) {doc, state} = quoted_to_algebra(arg, :block, state) {{doc, block_next_line(kind), newlines}, state} end @@ -656,6 +656,14 @@ defmodule Code.Formatter do defp block_next_line(:@), do: @empty defp block_next_line(_), do: break("") + defp maybe_add_newlines({:def, [{:@, _, _} = _next | _]}, _meta) do + @newlines + end + + defp maybe_add_newlines(_, meta) do + meta[:end_of_expression][:newlines] || 1 + end + ## Operators defp maybe_unary_op_to_algebra(fun, meta, args, context, state) do diff --git a/lib/elixir/test/elixir/code_formatter/general_test.exs b/lib/elixir/test/elixir/code_formatter/general_test.exs index bc3b58ab8db..91b7c785b84 100644 --- a/lib/elixir/test/elixir/code_formatter/general_test.exs +++ b/lib/elixir/test/elixir/code_formatter/general_test.exs @@ -869,6 +869,56 @@ defmodule Code.Formatter.GeneralTest do assert_format bad, good end + test "with def followed by module attribute" do + bad = """ + defmodule Example do + @impl FooA + def a(), do: :something + @impl FooB + def b() do + :something_else + end + end + """ + + good = """ + defmodule Example do + @impl FooA + def a(), do: :something + + @impl FooB + def b() do + :something_else + end + end + """ + + assert_format bad, good + end + + test "with def followed by def" do + bad = """ + defmodule Example do + def a(), do: :something + def b() do + :something_else + end + end + """ + + good = """ + defmodule Example do + def a(), do: :something + + def b() do + :something_else + end + end + """ + + assert_format bad, good + end + test "with multiple defs" do assert_same """ def foo(:one), do: 1 From 3e2692ff537f4bc491c1e89273b5d0255136da38 Mon Sep 17 00:00:00 2001 From: Paulo Daniel Gonzalez Date: Mon, 30 Sep 2024 14:21:19 -0500 Subject: [PATCH 2/2] Try to add above, not below. --- lib/elixir/lib/code/formatter.ex | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/elixir/lib/code/formatter.ex b/lib/elixir/lib/code/formatter.ex index 39a58cad91d..36670f029b2 100644 --- a/lib/elixir/lib/code/formatter.ex +++ b/lib/elixir/lib/code/formatter.ex @@ -638,7 +638,7 @@ defmodule Code.Formatter do defp block_args_to_algebra(args, min_line, max_line, state) do quoted_to_algebra = fn {kind, meta, _} = arg, args, state -> - newlines = maybe_add_newlines({kind, args}, meta) + newlines = handle_newlines(arg, args, meta[:end_of_expression][:newlines] || 1) {doc, state} = quoted_to_algebra(arg, :block, state) {{doc, block_next_line(kind), newlines}, state} end @@ -656,12 +656,12 @@ defmodule Code.Formatter do defp block_next_line(:@), do: @empty defp block_next_line(_), do: break("") - defp maybe_add_newlines({:def, [{:@, _, _} = _next | _]}, _meta) do - @newlines + defp handle_newlines({current, _, _}, [{:@, _, _} = _next | _], newlines) when current != :@ do + max(newlines, 2) end - defp maybe_add_newlines(_, meta) do - meta[:end_of_expression][:newlines] || 1 + defp handle_newlines(_, _, newlines) do + newlines end ## Operators