Skip to content

Commit db57fe7

Browse files
committed
Rename Dealias to AliasEnv, now that elixir 1.17 gave me much better words for everything
1 parent 83103ec commit db57fe7

File tree

3 files changed

+63
-51
lines changed

3 files changed

+63
-51
lines changed

lib/alias_env.ex

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
defmodule Styler.AliasEnv do
2+
@moduledoc """
3+
A datastructure for maintaining something like compiler alias state when traversing AST.
4+
5+
Not anywhere as correct as what the compiler gives us, but close enough for open source work.
6+
7+
A alias env is a map from an alias's `as` to its resolution in a context.
8+
9+
Given the ast for
10+
11+
alias Foo.Bar
12+
13+
we'd create the env:
14+
15+
%{:Bar => [:Foo, :Bar]}
16+
"""
17+
def define(env \\ %{}, ast)
18+
19+
def define(env, asts) when is_list(asts), do: Enum.reduce(asts, env, &define(&2, &1))
20+
21+
def define(env, {:alias, _, aliases}) do
22+
case aliases do
23+
[{:__aliases__, _, aliases}] -> define(env, aliases, List.last(aliases))
24+
[{:__aliases__, _, aliases}, [{_as, {:__aliases__, _, [as]}}]] -> define(env, aliases, as)
25+
# `alias __MODULE__` or other oddities i'm not bothering to get right
26+
_ -> env
27+
end
28+
end
29+
30+
defp define(env, modules, as), do: Map.put(env, as, do_expand(env, modules))
31+
32+
# no need to traverse ast if there are no aliases
33+
def expand(env, ast) when map_size(env) == 0, do: ast
34+
35+
def expand(env, {:alias, m, [{:__aliases__, m_, modules} | rest]}),
36+
do: {:alias, m, [{:__aliases__, m_, do_expand(env, modules)} | rest]}
37+
38+
def expand(env, ast) do
39+
Macro.prewalk(ast, fn
40+
{:__aliases__, meta, modules} -> {:__aliases__, meta, do_expand(env, modules)}
41+
ast -> ast
42+
end)
43+
end
44+
45+
# if the list of modules is itself already aliased, dealias it with the compound alias
46+
# given:
47+
# alias Foo.Bar
48+
# Bar.Baz.Bop.baz()
49+
#
50+
# lifting Bar.Baz.Bop should result in:
51+
# alias Foo.Bar
52+
# alias Foo.Bar.Baz.Bop
53+
# Bop.baz()
54+
defp do_expand(env, [first | rest] = modules) do
55+
if dealias = env[first], do: dealias ++ rest, else: modules
56+
end
57+
end

lib/dealias.ex

Lines changed: 0 additions & 45 deletions
This file was deleted.

lib/style/module_directives.ex

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ defmodule Styler.Style.ModuleDirectives do
8888
"""
8989
@behaviour Styler.Style
9090

91-
alias Styler.Dealias
91+
alias Styler.AliasEnv
9292
alias Styler.Style
9393
alias Styler.Zipper
9494

@@ -235,7 +235,7 @@ defmodule Styler.Style.ModuleDirectives do
235235
|> Enum.reduce(@acc, fn
236236
{:@, _, [{attr_directive, _, _}]} = ast, acc when attr_directive in @attr_directives ->
237237
# attr_directives are moved above aliases, so we need to dealias them
238-
{ast, acc} = acc.dealiases |> Dealias.apply(ast) |> lift_module_attrs(acc)
238+
{ast, acc} = acc.dealiases |> AliasEnv.expand(ast) |> lift_module_attrs(acc)
239239
%{acc | attr_directive => [ast | acc[attr_directive]]}
240240

241241
{:@, _, [{attr, _, _}]} = ast, acc ->
@@ -245,8 +245,8 @@ defmodule Styler.Style.ModuleDirectives do
245245
{ast, acc} = lift_module_attrs(ast, acc)
246246
ast = expand(ast)
247247
# import and used get hoisted above aliases, so need to dealias
248-
ast = if directive in ~w(import use)a, do: Dealias.apply(acc.dealiases, ast), else: ast
249-
dealiases = if directive == :alias, do: Dealias.put(acc.dealiases, ast), else: acc.dealiases
248+
ast = if directive in ~w(import use)a, do: AliasEnv.expand(acc.dealiases, ast), else: ast
249+
dealiases = if directive == :alias, do: AliasEnv.define(acc.dealiases, ast), else: acc.dealiases
250250

251251
# the reverse accounts for `expand` putting things in reading order, whereas we're accumulating in reverse
252252
%{acc | directive => Enum.reverse(ast, acc[directive]), dealiases: dealiases}
@@ -327,7 +327,7 @@ defmodule Styler.Style.ModuleDirectives do
327327
defp lift_aliases(%{alias: aliases, require: requires, nondirectives: nondirectives} = acc) do
328328
# we can't use the dealias map built into state as that's what things look like before sorting
329329
# now that we've sorted, it could be different!
330-
dealiases = Dealias.new(aliases)
330+
dealiases = AliasEnv.define(aliases)
331331
excluded = dealiases |> Map.keys() |> Enum.into(Styler.Config.get(:lifting_excludes))
332332
liftable = find_liftable_aliases(requires ++ nondirectives, excluded)
333333

@@ -339,7 +339,7 @@ defmodule Styler.Style.ModuleDirectives do
339339

340340
aliases =
341341
liftable
342-
|> Enum.map(&Dealias.apply(dealiases, {:alias, m, [{:__aliases__, [{:last, m} | m], &1}]}))
342+
|> Enum.map(&AliasEnv.expand(dealiases, {:alias, m, [{:__aliases__, [{:last, m} | m], &1}]}))
343343
|> Enum.concat(aliases)
344344
|> sort()
345345

0 commit comments

Comments
 (0)