@@ -60,7 +60,8 @@ import_function(Meta, Name, Arity, E) ->
60
60
end .
61
61
62
62
require_function (Meta , Receiver , Name , Arity , E ) ->
63
- case is_element ({Name , Arity }, get_optional_macros (Receiver )) of
63
+ Required = is_element (Receiver , ? m (E , requires )),
64
+ case is_element ({Name , Arity }, get_macros (Receiver , Required )) of
64
65
true -> false ;
65
66
false ->
66
67
elixir_lexical :record_remote (Receiver , ? m (E , function ), ? m (E , lexical_tracker )),
@@ -146,7 +147,7 @@ do_expand_import(Meta, {Name, Arity} = Tuple, Args, Module, E, Result) ->
146
147
elixir_locals :record_import (Tuple , Receiver , Module , ? m (E , function )),
147
148
{ok , Receiver , expand_macro_named (Meta , Receiver , Name , Arity , Args , E )};
148
149
{import , Receiver } ->
149
- case expand_require ([{require , false } | Meta ], Receiver , Tuple , Args , E ) of
150
+ case expand_require ([{required , true } | Meta ], Receiver , Tuple , Args , E ) of
150
151
{ok , _ , _ } = Response -> Response ;
151
152
error -> {ok , Receiver , Name , Args }
152
153
end ;
@@ -161,19 +162,15 @@ do_expand_import(Meta, {Name, Arity} = Tuple, Args, Module, E, Result) ->
161
162
162
163
expand_require (Meta , Receiver , {Name , Arity } = Tuple , Args , E ) ->
163
164
check_deprecation (Meta , Receiver , Name , Arity , E ),
164
- Module = ? m (E , module ),
165
+ Required = ( Receiver == ? m (E , module )) orelse is_element ( Receiver , ? m ( E , requires )) orelse required ( Meta ),
165
166
166
- case is_element (Tuple , get_optional_macros (Receiver )) of
167
+ case is_element (Tuple , get_macros (Receiver , Required )) of
168
+ true when Required ->
169
+ elixir_lexical :record_remote (Receiver , Name , Arity , nil , ? line (Meta ), ? m (E , lexical_tracker )),
170
+ {ok , Receiver , expand_macro_named (Meta , Receiver , Name , Arity , Args , E )};
167
171
true ->
168
- Requires = ? m (E , requires ),
169
- case (Receiver == Module ) orelse is_element (Receiver , Requires ) orelse skip_require (Meta ) of
170
- true ->
171
- elixir_lexical :record_remote (Receiver , Name , Arity , nil , ? line (Meta ), ? m (E , lexical_tracker )),
172
- {ok , Receiver , expand_macro_named (Meta , Receiver , Name , Arity , Args , E )};
173
- false ->
174
- Info = {unrequired_module , {Receiver , Name , length (Args ), Requires }},
175
- elixir_errors :form_error (Meta , ? m (E , file ), ? MODULE , Info )
176
- end ;
172
+ Info = {unrequired_module , {Receiver , Name , length (Args ), ? m (E , requires )}},
173
+ elixir_errors :form_error (Meta , ? m (E , file ), ? MODULE , Info );
177
174
false ->
178
175
error
179
176
end .
@@ -220,8 +217,8 @@ caller(Line, E) ->
220
217
221
218
% % Helpers
222
219
223
- skip_require (Meta ) ->
224
- lists :keyfind (require , 1 , Meta ) == {require , false }.
220
+ required (Meta ) ->
221
+ lists :keyfind (required , 1 , Meta ) == {required , true }.
225
222
226
223
find_dispatch (Meta , Tuple , Extra , E ) ->
227
224
case is_import (Meta ) of
@@ -289,9 +286,20 @@ format_error({ambiguous_call, {Mod1, Mod2, Name, Arity}}) ->
289
286
% % INTROSPECTION
290
287
291
288
% % Do not try to get macros from Erlang. Speeds up compilation a bit.
292
- get_optional_macros (erlang ) -> [];
289
+ get_macros (erlang , _ ) -> [];
290
+
291
+ get_macros (Receiver , false ) ->
292
+ case code :is_loaded (Receiver ) of
293
+ {file , _ } ->
294
+ try
295
+ Receiver :'__info__' (macros )
296
+ catch
297
+ error :undef -> []
298
+ end ;
299
+ false -> []
300
+ end ;
293
301
294
- get_optional_macros (Receiver ) ->
302
+ get_macros (Receiver , true ) ->
295
303
case code :ensure_loaded (Receiver ) of
296
304
{module , Receiver } ->
297
305
try
0 commit comments