@@ -32,6 +32,8 @@ find_import(Meta, Name, Arity, E) ->
32
32
{macro , Receiver } ->
33
33
elixir_env :trace ({imported_macro , Meta , Receiver , Name , Arity }, E ),
34
34
Receiver ;
35
+ {ambiguous , _ } = Ambiguous ->
36
+ elixir_errors :file_error (Meta , E , ? MODULE , {import , Ambiguous , Name , Arity });
35
37
_ ->
36
38
false
37
39
end .
@@ -75,6 +77,8 @@ import_function(Meta, Name, Arity, E) ->
75
77
false ;
76
78
{import , Receiver } ->
77
79
require_function (Meta , Receiver , Name , Arity , E );
80
+ {ambiguous , Ambiguous } ->
81
+ elixir_errors :file_error (Meta , E , ? MODULE , {import , Ambiguous , Name , Arity });
78
82
false ->
79
83
case elixir_import :special_form (Name , Arity ) of
80
84
true ->
@@ -130,8 +134,10 @@ dispatch_import(Meta, Name, Args, S, E, Callback) ->
130
134
expand_quoted (Meta , Receiver , Name , Arity , Expander (Args , S ), S , E );
131
135
{function , Receiver , NewName } ->
132
136
elixir_expand :expand ({{'.' , Meta , [Receiver , NewName ]}, Meta , Args }, S , E );
133
- error ->
134
- Callback ()
137
+ not_found ->
138
+ Callback ();
139
+ Error ->
140
+ elixir_errors :file_error (Meta , E , ? MODULE , {import , Error , Name , Arity })
135
141
end .
136
142
137
143
dispatch_require (Meta , Receiver , Name , Args , S , E , Callback ) when is_atom (Receiver ) ->
@@ -164,17 +170,20 @@ expand_import(Meta, Name, Arity, E, Extra, AllowLocals, Trace) ->
164
170
Dispatch = find_import_by_name_arity (Meta , Tuple , Extra , E ),
165
171
166
172
case Dispatch of
173
+ {ambiguous , Ambiguous } ->
174
+ {ambiguous , Ambiguous };
175
+
167
176
{import , _ } ->
168
177
do_expand_import (Dispatch , Meta , Name , Arity , Module , E , Trace );
178
+
169
179
_ ->
170
180
Local = AllowLocals andalso elixir_def :local_for (Meta , Name , Arity , [defmacro , defmacrop ], E ),
171
181
172
182
case Dispatch of
173
183
% % There is a local and an import. This is a conflict unless
174
184
% % the receiver is the same as module (happens on bootstrap).
175
185
{_ , Receiver } when Local /= false , Receiver /= Module ->
176
- Error = {macro_conflict , {Receiver , Name , Arity }},
177
- elixir_errors :file_error (Meta , E , ? MODULE , Error );
186
+ {conflict , Receiver };
178
187
179
188
% % There is no local. Dispatch the import.
180
189
_ when Local == false ->
@@ -212,10 +221,10 @@ do_expand_import(Result, Meta, Name, Arity, Module, E, Trace) ->
212
221
false when Module == ? kernel ->
213
222
case elixir_rewrite :inline (Module , Name , Arity ) of
214
223
{AR , AN } -> {function , AR , AN };
215
- false -> error
224
+ false -> not_found
216
225
end ;
217
226
false ->
218
- error
227
+ not_found
219
228
end .
220
229
221
230
expand_require (Meta , Receiver , Name , Arity , E , Trace ) ->
@@ -286,7 +295,7 @@ find_imports_by_name([], Acc, _Name, _Meta, _E) ->
286
295
find_imports_by_name (Name , [{Name , Arity } | Imports ], Acc , Mod , Meta , E ) ->
287
296
case Acc of
288
297
#{Arity := OtherMod } ->
289
- Error = {ambiguous_call , {Mod , OtherMod , Name , Arity } },
298
+ Error = {import , {ambiguous , [ Mod , OtherMod ]} , Name , Arity },
290
299
elixir_errors :file_error (Meta , E , ? MODULE , Error );
291
300
292
301
#{} ->
@@ -311,11 +320,7 @@ find_import_by_name_arity(Meta, {_Name, Arity} = Tuple, Extra, E) ->
311
320
{[], [Receiver ]} -> {macro , Receiver };
312
321
{[Receiver ], []} -> {function , Receiver };
313
322
{[], []} -> false ;
314
- _ ->
315
- {Name , Arity } = Tuple ,
316
- [First , Second | _ ] = FunMatch ++ MacMatch ,
317
- Error = {ambiguous_call , {First , Second , Name , Arity }},
318
- elixir_errors :file_error (Meta , E , ? MODULE , Error )
323
+ _ -> {ambiguous , FunMatch ++ MacMatch }
319
324
end
320
325
end .
321
326
@@ -352,11 +357,11 @@ prune_stacktrace([], _MFA, Info, _E) ->
352
357
353
358
% % ERROR HANDLING
354
359
355
- format_error ({macro_conflict , {Receiver , Name , Arity } }) ->
360
+ format_error ({import , {conflict , Receiver } , Name , Arity }) ->
356
361
io_lib :format (" call to local macro ~ts /~B conflicts with imported ~ts .~ts /~B , "
357
362
" please rename the local macro or remove the conflicting import" ,
358
363
[Name , Arity , elixir_aliases :inspect (Receiver ), Name , Arity ]);
359
- format_error ({ambiguous_call , {Mod1 , Mod2 , Name , Arity } }) ->
364
+ format_error ({import , {ambiguous , [ Mod1 , Mod2 | _ ]} , Name , Arity }) ->
360
365
io_lib :format (" function ~ts /~B imported from both ~ts and ~ts , call is ambiguous" ,
361
366
[Name , Arity , elixir_aliases :inspect (Mod1 ), elixir_aliases :inspect (Mod2 )]);
362
367
format_error ({compile_env , Name , Arity }) ->
0 commit comments