Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 5 additions & 4 deletions lib/style/module_directives.ex
Original file line number Diff line number Diff line change
Expand Up @@ -433,11 +433,12 @@ defmodule Styler.Style.ModuleDirectives do

defp apply_aliases(acc, inverted_env) when map_size(inverted_env) == 0, do: acc

defp apply_aliases(%{require: requires, nondirectives: nondirectives, alias_env: alias_env} = acc, inverted_env) do
# applying aliases to requires can change their ordering again
requires = requires |> apply_aliases(inverted_env, alias_env) |> sort()
defp apply_aliases(%{nondirectives: nondirectives, alias_env: alias_env} = acc, inverted_env) do
# Requires are intentionally left alone: they sort above aliases in strict layout,
# so shortening `require Foo.Bar` to `require Bar` would reference an alias declared
# below it (broken Elixir).
nondirectives = apply_aliases(nondirectives, inverted_env, alias_env)
%{acc | require: requires, nondirectives: nondirectives}
%{acc | nondirectives: nondirectives}
end

# applies the aliases withi `to_as` across the given ast
Expand Down
41 changes: 38 additions & 3 deletions test/style/module_directives/alias_lifting_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -176,7 +176,7 @@ defmodule Styler.Style.ModuleDirectives.AliasLiftingTest do

import A.B.C

require C
require A.B.C

alias A.B.C

Expand Down Expand Up @@ -216,24 +216,59 @@ defmodule Styler.Style.ModuleDirectives.AliasLiftingTest do
)
end

test "re-sorts requires after lifting" do
test "lifting does not rewrite require directives" do
# Requires sort above aliases, so a `require A.B.C` cannot be shortened to `require C` - at that point in the file,
# `C` isn't aliased yet.
assert_style(
"""
defmodule A do
require A.B.C
require B

A.B.C.foo()
A.B.C.foo()
end
""",
"""
defmodule A do
require A.B.C
require B
require C

alias A.B.C

C.foo()
C.foo()
end
"""
)
end

test "lifting via a require sighting does not rewrite the require itself" do
# Regression test: one require + one nondirective use of the same FQDN used to
# produce a `require Baz` ordered above its `alias Foo.Bar.Baz` (broken Elixir).
assert_style(
"""
defmodule Foo do
@moduledoc false

require Foo.Bar.Baz

def go do
Foo.Bar.Baz.go()
end
end
""",
"""
defmodule Foo do
@moduledoc false

require Foo.Bar.Baz

alias Foo.Bar.Baz

def go do
Baz.go()
end
end
"""
)
Expand Down
2 changes: 1 addition & 1 deletion test/style/module_directives_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -294,7 +294,7 @@ defmodule Styler.Style.ModuleDirectivesTest do
alias A.A
""",
"""
require A
require A.A
require A.C

alias A.A
Expand Down
Loading