Skip to content

Commit b063690

Browse files
committed
Don't lift require aliases due to our ordering rules
1 parent 1bfe301 commit b063690

3 files changed

Lines changed: 44 additions & 8 deletions

File tree

lib/style/module_directives.ex

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -433,11 +433,12 @@ defmodule Styler.Style.ModuleDirectives do
433433

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

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

443444
# applies the aliases withi `to_as` across the given ast

test/style/module_directives/alias_lifting_test.exs

Lines changed: 38 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,7 @@ defmodule Styler.Style.ModuleDirectives.AliasLiftingTest do
176176
177177
import A.B.C
178178
179-
require C
179+
require A.B.C
180180
181181
alias A.B.C
182182
@@ -216,24 +216,59 @@ defmodule Styler.Style.ModuleDirectives.AliasLiftingTest do
216216
)
217217
end
218218

219-
test "re-sorts requires after lifting" do
219+
test "lifting does not rewrite require directives" do
220+
# Requires sort above aliases, so a `require A.B.C` cannot be shortened to `require C` - at that point in the file,
221+
# `C` isn't aliased yet.
220222
assert_style(
221223
"""
222224
defmodule A do
223225
require A.B.C
224226
require B
225227
226228
A.B.C.foo()
229+
A.B.C.foo()
227230
end
228231
""",
229232
"""
230233
defmodule A do
234+
require A.B.C
231235
require B
232-
require C
233236
234237
alias A.B.C
235238
236239
C.foo()
240+
C.foo()
241+
end
242+
"""
243+
)
244+
end
245+
246+
test "lifting via a require sighting does not rewrite the require itself" do
247+
# Regression test: one require + one nondirective use of the same FQDN used to
248+
# produce a `require Baz` ordered above its `alias Foo.Bar.Baz` (broken Elixir).
249+
assert_style(
250+
"""
251+
defmodule Foo do
252+
@moduledoc false
253+
254+
require Foo.Bar.Baz
255+
256+
def go do
257+
Foo.Bar.Baz.go()
258+
end
259+
end
260+
""",
261+
"""
262+
defmodule Foo do
263+
@moduledoc false
264+
265+
require Foo.Bar.Baz
266+
267+
alias Foo.Bar.Baz
268+
269+
def go do
270+
Baz.go()
271+
end
237272
end
238273
"""
239274
)

test/style/module_directives_test.exs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -294,7 +294,7 @@ defmodule Styler.Style.ModuleDirectivesTest do
294294
alias A.A
295295
""",
296296
"""
297-
require A
297+
require A.A
298298
require A.C
299299
300300
alias A.A

0 commit comments

Comments
 (0)