Skip to content

Commit 9e8ac51

Browse files
author
José Valim
committed
Only expand aliases known at compile time, closes #5721
Signed-off-by: José Valim <[email protected]>
1 parent 451b8eb commit 9e8ac51

File tree

2 files changed

+17
-25
lines changed

2 files changed

+17
-25
lines changed

lib/iex/lib/iex/autocomplete.ex

Lines changed: 16 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -115,9 +115,10 @@ defmodule IEx.Autocomplete do
115115

116116
# Elixir.fun
117117
defp expand_call({:__aliases__, _, list}, hint, server) do
118-
expand_alias(list, server)
119-
|> normalize_module
120-
|> expand_require(hint)
118+
case expand_alias(list, server) do
119+
{:ok, alias} -> expand_require(alias, hint)
120+
:error -> no()
121+
end
121122
end
122123

123124
# variable.fun_or_key
@@ -171,9 +172,10 @@ defmodule IEx.Autocomplete do
171172
end
172173

173174
defp expand_elixir_modules(list, hint, server) do
174-
expand_alias(list, server)
175-
|> normalize_module
176-
|> expand_elixir_modules_from_aliases(hint, [])
175+
case expand_alias(list, server) do
176+
{:ok, alias} -> expand_elixir_modules_from_aliases(alias, hint, [])
177+
:error -> no()
178+
end
177179
end
178180

179181
defp expand_elixir_modules_from_aliases(mod, hint, aliases) do
@@ -183,19 +185,16 @@ defmodule IEx.Autocomplete do
183185
|> format_expansion(hint)
184186
end
185187

186-
defp expand_alias([name | rest] = list, server) do
187-
module = Module.concat(Elixir, name)
188-
Enum.find_value aliases_from_env(server), list, fn {alias, mod} ->
189-
if alias === module do
190-
case Atom.to_string(mod) do
191-
"Elixir." <> mod ->
192-
Module.concat [mod | rest]
193-
_ ->
194-
mod
195-
end
196-
end
188+
defp expand_alias([name | rest], server) when is_atom(name) do
189+
case Keyword.fetch(aliases_from_env(server), Module.concat(Elixir, name)) do
190+
{:ok, name} when rest == [] -> {:ok, name}
191+
{:ok, name} -> {:ok, Module.concat([name | rest])}
192+
:error -> {:ok, Module.concat([name | rest])}
197193
end
198194
end
195+
defp expand_alias([_ | _], _) do
196+
:error
197+
end
199198

200199
defp match_aliases(hint, server) do
201200
for {alias, _mod} <- aliases_from_env(server),
@@ -220,14 +219,6 @@ defmodule IEx.Autocomplete do
220219

221220
## Helpers
222221

223-
defp normalize_module(mod) do
224-
if is_list(mod) do
225-
Module.concat(mod)
226-
else
227-
mod
228-
end
229-
end
230-
231222
defp match_modules(hint, root) do
232223
get_modules(root)
233224
|> :lists.usort()

lib/iex/test/iex/autocomplete_test.exs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@ defmodule IEx.AutocompleteTest do
9090
assert expand('.') == {:no, '', []}
9191
assert expand('Xyz') == {:no, '', []}
9292
assert expand('x.Foo') == {:no, '', []}
93+
assert expand('x.Foo.get_by') == {:no, '', []}
9394
end
9495

9596
test "Elixir root submodule completion" do

0 commit comments

Comments
 (0)