diff --git a/CHANGELOG.md b/CHANGELOG.md index 7e59767b..3d9560b1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,12 @@ ## main +## v0.10.5 + +### Fixes + +* alias: fix single-module alias deletion newlines bug + ## v0.10.4 ### Improvements diff --git a/lib/style/module_directives.ex b/lib/style/module_directives.ex index 5b25256c..4119cc01 100644 --- a/lib/style/module_directives.ex +++ b/lib/style/module_directives.ex @@ -151,10 +151,10 @@ defmodule Styler.Style.ModuleDirectives do behaviours = expand_and_sort(directives[:"@behaviour"] || []) uses = (directives[:use] || []) |> Enum.flat_map(&expand_directive/1) |> reset_newlines() - imports = expand_and_sort(directives[:import] || []) - aliases = expand_and_sort(directives[:alias] || []) requires = expand_and_sort(directives[:require] || []) + original_aliases = directives[:alias] || [] + aliases = expand_and_sort(directives[:alias] || []) directives = [ @@ -170,7 +170,8 @@ defmodule Styler.Style.ModuleDirectives do |> fix_line_numbers(List.first(nondirectives)) cond do - Enum.empty?(directives) -> + # the # of aliases can be decreased during sorting - if there were any, we need to be sure to write the deletion + Enum.empty?(directives) and Enum.empty?(original_aliases) -> parent Enum.empty?(nondirectives) -> @@ -253,10 +254,13 @@ defmodule Styler.Style.ModuleDirectives do |> reset_newlines() end - # alias Foo.{Bar, Baz} + # Deletes root level aliases ala (`alias Foo` -> ``) + defp expand_directive({:alias, _, [{:__aliases__, _, [_]}]}), do: [] + + # import Foo.{Bar, Baz} # => - # alias Foo.Bar - # alias Foo.Baz + # import Foo.Bar + # import Foo.Baz defp expand_directive({directive, _, [{{:., _, [{:__aliases__, _, module}, :{}]}, _, right}]}), do: Enum.map(right, fn {_, meta, segments} -> {directive, meta, [{:__aliases__, [], module ++ segments}]} end) diff --git a/lib/style/single_node.ex b/lib/style/single_node.ex index ef068ee1..75c3ba28 100644 --- a/lib/style/single_node.ex +++ b/lib/style/single_node.ex @@ -30,10 +30,6 @@ defmodule Styler.Style.SingleNode do alias Styler.Style alias Styler.Zipper - # Delete root level alias - # `alias Foo` -> `` - def run({{:alias, _, [{:__aliases__, _, [_]}]}, _} = zipper, ctx), do: {:cont, Zipper.remove(zipper), ctx} - def run({node, meta}, ctx), do: {:cont, {style(node), meta}, ctx} # as of 1.15, elixir's formatter takes care of this for us. diff --git a/test/style/module_directives_test.exs b/test/style/module_directives_test.exs index 5c5dddc4..9daefb38 100644 --- a/test/style/module_directives_test.exs +++ b/test/style/module_directives_test.exs @@ -415,4 +415,38 @@ defmodule Styler.Style.ModuleDirectivesTest do ) end end + + test "Deletes root level alias" do + assert_style("alias Foo", "") + + assert_style( + """ + alias unquote(Foo) + alias Foo + alias Bar, as: Bop + alias __MODULE__ + """, + """ + alias __MODULE__ + alias Bar, as: Bop + alias unquote(Foo) + """ + ) + + assert_style( + """ + alias A.A + alias B.B + alias C + + require D + """, + """ + alias A.A + alias B.B + + require D + """ + ) + end end diff --git a/test/style/single_node_test.exs b/test/style/single_node_test.exs index 1a7a0f7c..6b125a27 100644 --- a/test/style/single_node_test.exs +++ b/test/style/single_node_test.exs @@ -293,22 +293,4 @@ defmodule Styler.Style.SingleNodeTest do assert_style("Enum.reverse(foo, bar) ++ bar") end end - - test "Delete root level alias" do - assert_style("alias Foo", "") - - assert_style( - """ - alias unquote(Foo) - alias Foo - alias Bar, as: Bop - alias __MODULE__ - """, - """ - alias __MODULE__ - alias Bar, as: Bop - alias unquote(Foo) - """ - ) - end end