Perform return type inference and application across local calls (#13984)
This commit is contained in:
@@ -55,7 +55,7 @@ import_function(Meta, Name, Arity, E) ->
|
||||
case find_import_by_name_arity(Meta, Tuple, [], E) of
|
||||
{function, Receiver} ->
|
||||
elixir_env:trace({imported_function, Meta, Receiver, Name, Arity}, E),
|
||||
elixir_locals:record_import(Tuple, Receiver, ?key(E, module), ?key(E, function)),
|
||||
elixir_import:record(Tuple, Receiver, ?key(E, module), ?key(E, function)),
|
||||
remote_function(Meta, Receiver, Name, Arity, E);
|
||||
{macro, _Receiver} ->
|
||||
false;
|
||||
@@ -74,7 +74,6 @@ import_function(Meta, Name, Arity, E) ->
|
||||
elixir_def:local_for(Meta, Name, Arity, [defmacro, defmacrop], E) of
|
||||
false ->
|
||||
elixir_env:trace({local_function, Meta, Name, Arity}, E),
|
||||
elixir_locals:record_local(Tuple, ?key(E, module), ?key(E, function), Meta, false),
|
||||
{local, Name, Arity};
|
||||
_ ->
|
||||
false
|
||||
@@ -183,10 +182,7 @@ expand_import(Meta, Name, Arity, E, Extra, AllowLocals, Trace) ->
|
||||
|
||||
%% Dispatch to the local.
|
||||
_ ->
|
||||
Trace andalso begin
|
||||
elixir_env:trace({local_macro, Meta, Name, Arity}, E),
|
||||
elixir_locals:record_local(Tuple, Module, ?key(E, function), Meta, true)
|
||||
end,
|
||||
Trace andalso elixir_env:trace({local_macro, Meta, Name, Arity}, E),
|
||||
{macro, Module, expander_macro_fun(Meta, Local, Module, Name, E)}
|
||||
end
|
||||
end.
|
||||
@@ -196,13 +192,13 @@ do_expand_import(Result, Meta, Name, Arity, Module, E, Trace) ->
|
||||
{function, Receiver} ->
|
||||
Trace andalso begin
|
||||
elixir_env:trace({imported_function, Meta, Receiver, Name, Arity}, E),
|
||||
elixir_locals:record_import({Name, Arity}, Receiver, Module, ?key(E, function))
|
||||
elixir_import:record({Name, Arity}, Receiver, Module, ?key(E, function))
|
||||
end,
|
||||
{function, Receiver, Name};
|
||||
{macro, Receiver} ->
|
||||
Trace andalso begin
|
||||
elixir_env:trace({imported_macro, Meta, Receiver, Name, Arity}, E),
|
||||
elixir_locals:record_import({Name, Arity}, Receiver, Module, ?key(E, function))
|
||||
elixir_import:record({Name, Arity}, Receiver, Module, ?key(E, function))
|
||||
end,
|
||||
{macro, Receiver, expander_macro_named(Meta, Receiver, Name, Arity, E)};
|
||||
{import, Receiver} ->
|
||||
|
||||
Reference in New Issue
Block a user