diff --git a/lib/elixir/src/elixir_lexical.erl b/lib/elixir/src/elixir_lexical.erl index 28d0316e11..1b256c0af9 100644 --- a/lib/elixir/src/elixir_lexical.erl +++ b/lib/elixir/src/elixir_lexical.erl @@ -99,7 +99,17 @@ warn_unused_imports(Pid, E) -> ok. warn_unused_requires(Pid, E) -> - [elixir_errors:file_warn(Meta, ?key(E, file), ?MODULE, {unused_require, Module}) + [case lists:keyfind(opts, 1, Meta) of + {opts, Opts} -> + case lists:keyfind(as, 1, Opts) of + {as, Alias} when is_atom(Alias) -> + elixir_errors:file_warn(Meta, ?key(E, file), ?MODULE, {unused_require, Module, Alias}); + _ -> + elixir_errors:file_warn(Meta, ?key(E, file), ?MODULE, {unused_require, Module}) + end; + _ -> + elixir_errors:file_warn(Meta, ?key(E, file), ?MODULE, {unused_require, Module}) + end || {Module, Meta} <- ?tracker:collect_unused_requires(Pid)], ok. @@ -121,4 +131,7 @@ format_error({unused_import, {Module, Function, Arity}}) -> format_error({unused_import, Module}) -> io_lib:format("unused import ~ts", [elixir_aliases:inspect(Module)]); format_error({unused_require, Module}) -> - io_lib:format("unused require ~ts", [elixir_aliases:inspect(Module)]). + io_lib:format("unused require ~ts", [elixir_aliases:inspect(Module)]); +format_error({unused_require, Module, Alias}) -> + io_lib:format("unused require ~ts. Consider using alias ~ts, as: ~ts instead", + [elixir_aliases:inspect(Module), elixir_aliases:inspect(Module), elixir_aliases:inspect(Alias)]). diff --git a/lib/elixir/test/elixir/kernel/lexical_tracker_test.exs b/lib/elixir/test/elixir/kernel/lexical_tracker_test.exs index bac56067f6..7170d0f9f4 100644 --- a/lib/elixir/test/elixir/kernel/lexical_tracker_test.exs +++ b/lib/elixir/test/elixir/kernel/lexical_tracker_test.exs @@ -138,6 +138,22 @@ defmodule Kernel.LexicalTrackerTest do assert D.collect_unused_requires(config[:pid]) == [{String, [module: TestModule, opts: []]}] end + test "unused require with as option - module not used", config do + D.add_require(config[:pid], Application, module: TestModule, opts: [as: Foo]) + + assert D.collect_unused_requires(config[:pid]) == [ + {Application, [module: TestModule, opts: [as: Foo]]} + ] + end + + test "unused require with as option - module used via alias", config do + D.add_require(config[:pid], Application, module: TestModule, opts: [as: Foo]) + + assert D.collect_unused_requires(config[:pid]) == [ + {Application, [module: TestModule, opts: [as: Foo]]} + ] + end + test "imports with no warn are not unused", config do D.add_import(config[:pid], String, [], 1, false) assert D.collect_unused_imports(config[:pid]) == [] diff --git a/lib/elixir/test/elixir/kernel/warning_test.exs b/lib/elixir/test/elixir/kernel/warning_test.exs index c33a681689..798bc51362 100644 --- a/lib/elixir/test/elixir/kernel/warning_test.exs +++ b/lib/elixir/test/elixir/kernel/warning_test.exs @@ -2290,6 +2290,23 @@ defmodule Kernel.WarningTest do purge(Sample) end + test "unused require with as: suggest alias" do + assert_warn_compile( + [ + "nofile:2:3", + "unused require Application. Consider using alias Application, as: Foo instead" + ], + """ + defmodule Sample do + require Application, as: Foo + def a, do: Foo.app_dir(:bar) + end + """ + ) + after + purge(Sample) + end + defp purge(module) when is_atom(module) do :code.purge(module) :code.delete(module)