summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArjan Scherpenisse <arjan@scherpenisse.net>2017-05-09 17:10:59 +0200
committerJosé Valim <jose.valim@gmail.com>2017-05-09 17:10:59 +0200
commite7083819516949f9d75b931beeb95591d9989164 (patch)
tree7db7d0ecb10c49f3af19223839832fc306b75e46
parent5390eac99ee2852e3ec55edf4775b54a105b4ae0 (diff)
downloadelixir-e7083819516949f9d75b931beeb95591d9989164.tar.gz
Skip autocompletion of module names that are invalid without being quoted (#6080)
-rw-r--r--lib/iex/lib/iex/autocomplete.ex13
-rw-r--r--lib/iex/test/iex/autocomplete_test.exs16
2 files changed, 26 insertions, 3 deletions
diff --git a/lib/iex/lib/iex/autocomplete.ex b/lib/iex/lib/iex/autocomplete.ex
index 626e307b0..b3d823653 100644
--- a/lib/iex/lib/iex/autocomplete.ex
+++ b/lib/iex/lib/iex/autocomplete.ex
@@ -173,7 +173,8 @@ defmodule IEx.Autocomplete do
end
defp match_erlang_modules(hint) do
- for mod <- match_modules(hint, true) do
+ for mod <- match_modules(hint, true),
+ usable_as_unquoted_atom?(mod) do
%{kind: :module, name: mod, type: :erlang}
end
end
@@ -225,14 +226,20 @@ defmodule IEx.Autocomplete do
for mod <- match_modules(base, module === Elixir),
parts = String.split(mod, "."),
- depth <= length(parts) do
- %{kind: :module, type: :elixir, name: Enum.at(parts, depth - 1)}
+ depth <= length(parts),
+ name = Enum.at(parts, depth - 1),
+ usable_as_unquoted_atom?("Elixir." <> name) do
+ %{kind: :module, type: :elixir, name: name}
end
|> Enum.uniq
end
## Helpers
+ defp usable_as_unquoted_atom?(name) do
+ not String.starts_with?(inspect(String.to_atom(name)), ":\"")
+ end
+
defp match_modules(hint, root) do
get_modules(root)
|> :lists.usort()
diff --git a/lib/iex/test/iex/autocomplete_test.exs b/lib/iex/test/iex/autocomplete_test.exs
index 81f39f8da..bbf119e8d 100644
--- a/lib/iex/test/iex/autocomplete_test.exs
+++ b/lib/iex/test/iex/autocomplete_test.exs
@@ -285,4 +285,20 @@ defmodule IEx.AutocompleteTest do
eval("struct = %IEx.AutocompleteTest.MyStruct{}")
assert expand('struct.my') == {:yes, '_val', []}
end
+
+ test "ignore invalid Elixir module literals" do
+ defmodule :"Elixir.IEx.AutocompleteTest.Unicodé", do: nil
+ assert expand('IEx.AutocompleteTest.Unicod') == {:no, '', []}
+ after
+ :code.purge(:"Elixir.IEx.AutocompleteTest.Unicodé")
+ :code.delete(:"Elixir.IEx.AutocompleteTest.Unicodé")
+ end
+
+ test "ignore invalid Erlang module literals" do
+ defmodule :"iex_autocomplete_unicodé", do: nil
+ assert expand(':iex_autocomplete_unicod') == {:no, '', []}
+ after
+ :code.purge(:"iex_autocomplete_unicodé")
+ :code.delete(:"iex_autocomplete_unicodé")
+ end
end