diff options
author | Arjan Scherpenisse <arjan@scherpenisse.net> | 2017-05-09 17:10:59 +0200 |
---|---|---|
committer | José Valim <jose.valim@gmail.com> | 2017-05-09 17:10:59 +0200 |
commit | e7083819516949f9d75b931beeb95591d9989164 (patch) | |
tree | 7db7d0ecb10c49f3af19223839832fc306b75e46 | |
parent | 5390eac99ee2852e3ec55edf4775b54a105b4ae0 (diff) | |
download | elixir-e7083819516949f9d75b931beeb95591d9989164.tar.gz |
Skip autocompletion of module names that are invalid without being quoted (#6080)
-rw-r--r-- | lib/iex/lib/iex/autocomplete.ex | 13 | ||||
-rw-r--r-- | lib/iex/test/iex/autocomplete_test.exs | 16 |
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 |