Track {module, function, arity} imports and warn on unused ones

Example:

Say, there's following file:

    # example.exs
    import String, only: [upcase: 1, downcase: 1]
    import Enum

    IO.puts upcase("Hello")

Before this patch:

    # $ elixir example.exs
    # HELLO
    # warning.exs:2: warning: unused import Enum

After this patch:

    # $ elixir example.exs
    # HELLO
    # example.exs:1: warning: unused import String.downcase/1
    # example.exs:2: warning: unused import Enum
This commit is contained in:
Wojtek Mach
2016-02-28 19:53:02 +01:00
parent b1b10af132
commit 743e8c7ed1
9 changed files with 105 additions and 27 deletions
+5 -5
View File
@@ -26,11 +26,11 @@ find_import(Meta, Name, Arity, E) ->
case find_dispatch(Meta, Tuple, [], E) of
{function, Receiver} ->
elixir_lexical:record_import(Receiver, ?m(E, lexical_tracker)),
elixir_lexical:record_import({Receiver, Name, Arity}, ?m(E, lexical_tracker)),
%% elixir_locals:record_import(Tuple, Receiver, ?m(E, module), ?m(E, function)),
Receiver;
{macro, Receiver} ->
elixir_lexical:record_import(Receiver, ?m(E, lexical_tracker)),
elixir_lexical:record_import({Receiver, Name, Arity}, ?m(E, lexical_tracker)),
%% elixir_locals:record_import(Tuple, Receiver, ?m(E, module), ?m(E, function)),
Receiver;
_ ->
@@ -43,7 +43,7 @@ import_function(Meta, Name, Arity, E) ->
Tuple = {Name, Arity},
case find_dispatch(Meta, Tuple, [], E) of
{function, Receiver} ->
elixir_lexical:record_import(Receiver, ?m(E, lexical_tracker)),
elixir_lexical:record_import({Receiver, Name, Arity}, ?m(E, lexical_tracker)),
elixir_locals:record_import(Tuple, Receiver, ?m(E, module), ?m(E, function)),
remote_function(Meta, Receiver, Name, Arity, E);
{macro, _Receiver} ->
@@ -137,12 +137,12 @@ expand_import(Meta, {Name, Arity} = Tuple, Args, E, Extra, External) ->
do_expand_import(Meta, {Name, Arity} = Tuple, Args, Module, E, Result) ->
case Result of
{function, Receiver} ->
elixir_lexical:record_import(Receiver, ?m(E, lexical_tracker)),
elixir_lexical:record_import({Receiver, Name, Arity}, ?m(E, lexical_tracker)),
elixir_locals:record_import(Tuple, Receiver, Module, ?m(E, function)),
{ok, Receiver, Name, Args};
{macro, Receiver} ->
check_deprecation(Meta, Receiver, Name, Arity, E),
elixir_lexical:record_import(Receiver, ?m(E, lexical_tracker)),
elixir_lexical:record_import({Receiver, Name, Arity}, ?m(E, lexical_tracker)),
elixir_locals:record_import(Tuple, Receiver, Module, ?m(E, function)),
{ok, Receiver, expand_macro_named(Meta, Receiver, Name, Arity, Args, E)};
{import, Receiver} ->