55-export ([default_macros /0 , default_functions /0 , default_requires /0 ,
66 dispatch_require /6 , dispatch_import /5 ,
77 require_function /5 , import_function /4 ,
8- expand_import /9 , expand_require /8 , find_import /4 ,
8+ expand_import /6 , expand_require /6 , find_import /4 ,
99 format_error /1 , in_erlang_functions /0 , in_erlang_macros /0 ]).
1010-include (" elixir.hrl" ).
1111-compile ({parse_transform , elixir_transform }).
@@ -23,7 +23,7 @@ default_requires() ->
2323find_import (Meta , Name , Arity , S ) ->
2424 Tuple = { Name , Arity },
2525
26- case find_dispatch (Meta , Tuple , S # elixir_scope . functions , S # elixir_scope . macros , S # elixir_scope . file ) of
26+ case find_dispatch (Meta , Tuple , S ) of
2727 { function , Receiver } -> Receiver ;
2828 { macro , Receiver } -> Receiver ;
2929 nomatch -> false
@@ -33,7 +33,7 @@ find_import(Meta, Name, Arity, S) ->
3333
3434import_function (Meta , Name , Arity , S ) ->
3535 Tuple = { Name , Arity },
36- case find_dispatch (Meta , Tuple , S # elixir_scope . functions , S # elixir_scope . macros , S # elixir_scope . file ) of
36+ case find_dispatch (Meta , Tuple , S ) of
3737 { function , Receiver } ->
3838 elixir_import :record (import , Tuple , Receiver , S # elixir_scope .module ),
3939 remote_function (Meta , Receiver , Name , Arity , S );
@@ -58,7 +58,7 @@ dispatch_import(Meta, Name, Args, S, Callback) ->
5858 Arity = length (Args ),
5959 Tuple = { Name , Arity },
6060
61- case find_dispatch (Meta , Tuple , S # elixir_scope . functions , S # elixir_scope . macros , S # elixir_scope . file ) of
61+ case find_dispatch (Meta , Tuple , S ) of
6262 { function , Receiver } ->
6363 elixir_import :record (import , Tuple , Receiver , Module ),
6464 Endpoint = case (Receiver == ? BUILTIN ) andalso is_element (Tuple , in_erlang_functions ()) of
@@ -67,8 +67,7 @@ dispatch_import(Meta, Name, Args, S, Callback) ->
6767 end ,
6868 elixir_translator :translate_each ({ { '.' , Meta , [Endpoint , Name ] }, Meta , Args }, S );
6969 Result ->
70- case expand_import (Meta , Tuple , Args , Module , S # elixir_scope .function ,
71- S # elixir_scope .requires , S , Result ) of
70+ case do_expand_import (Meta , Tuple , Args , Module , S , Result ) of
7271 { error , noexpansion } ->
7372 Callback ();
7473 { error , internal } ->
@@ -88,8 +87,7 @@ dispatch_require(Meta, Receiver, Name, Args, S, Callback) ->
8887 true ->
8988 elixir_translator :translate_each ({ { '.' , Meta , [erlang , Name ] }, Meta , Args }, S );
9089 false ->
91- case expand_require (Meta , Receiver , Tuple , Args , Module ,
92- S # elixir_scope .function , S # elixir_scope .requires , S ) of
90+ case expand_require (Meta , Receiver , Tuple , Args , Module , S ) of
9391 { error , noexpansion } ->
9492 Callback ();
9593 { error , internal } ->
@@ -101,84 +99,85 @@ dispatch_require(Meta, Receiver, Name, Args, S, Callback) ->
10199
102100% % Macros expansion
103101
104- expand_import (Meta , { Name , Arity } = Tuple , Args , Module , Function , Requires , SEnv , Result ) ->
102+ expand_import (Meta , Tuple , Args , Module , Extra , S ) ->
103+ Result = find_dispatch (Meta , Tuple , Extra , S ),
104+ do_expand_import (Meta , Tuple , Args , Module , S , Result ).
105+
106+ do_expand_import (Meta , { Name , Arity } = Tuple , Args , Module , S , Result ) ->
105107 case Result of
106108 { macro , ? BUILTIN } ->
107109 case is_element (Tuple , in_erlang_macros ()) of
108110 true -> { error , internal };
109111 false ->
110112 elixir_import :record (import , Tuple , ? BUILTIN , Module ),
111- { ok , ? BUILTIN , expand_macro_named (Meta , ? BUILTIN , Name , Arity , Args , Module , Requires , SEnv ) }
113+ { ok , ? BUILTIN , expand_macro_named (Meta , ? BUILTIN , Name , Arity , Args , Module , S ) }
112114 end ;
113115 { macro , Receiver } ->
114116 elixir_import :record (import , Tuple , Receiver , Module ),
115- { ok , Receiver , expand_macro_named (Meta , Receiver , Name , Arity , Args , Module , Requires , SEnv ) };
117+ { ok , Receiver , expand_macro_named (Meta , Receiver , Name , Arity , Args , Module , S ) };
116118 _ ->
117- Fun = (Function /= Tuple ) andalso
119+ Fun = (S # elixir_scope . function /= Tuple ) andalso
118120 elixir_def_local :macro_for (Tuple , true , Module ),
119121 case Fun of
120122 false -> { error , noexpansion };
121123 _ ->
122124 elixir_import :record (import , Tuple , Module , Module ),
123- { ok , Module , expand_macro_fun (Meta , Fun , Module , Name , Args , Module , Requires , SEnv ) }
125+ { ok , Module , expand_macro_fun (Meta , Fun , Module , Name , Args , Module , S ) }
124126 end
125127 end .
126128
127- expand_import (Meta , Tuple , Args , Module , Function , Requires , Functions , Macros , SEnv ) ->
128- Result = find_dispatch (Meta , Tuple , Functions , Macros , elixir_scope :filename (SEnv )),
129- expand_import (Meta , Tuple , Args , Module , Function , Requires , SEnv , Result ).
130-
131- expand_require (Meta , ? BUILTIN , { Name , Arity } = Tuple , Args , Module , _Function , Requires , SEnv ) ->
129+ expand_require (Meta , ? BUILTIN , { Name , Arity } = Tuple , Args , Module , S ) ->
132130 case is_element (Tuple , in_erlang_macros ()) of
133131 true -> { error , internal };
134132 false ->
135133 case is_element (Tuple , in_elixir_macros ()) of
136- true -> { ok , expand_macro_named (Meta , ? BUILTIN , Name , Arity , Args , Module , Requires , SEnv ) };
134+ true -> { ok , expand_macro_named (Meta , ? BUILTIN , Name , Arity , Args , Module , S ) };
137135 false -> { error , noexpansion }
138136 end
139137 end ;
140138
141- expand_require (Meta , Receiver , { Name , Arity } = Tuple , Args , Module , Function , Requires , SEnv ) ->
142- Fun = (Module == Receiver ) andalso (Function /= Tuple ) andalso
139+ expand_require (Meta , Receiver , { Name , Arity } = Tuple , Args , Module , S ) ->
140+ Fun = (Module == Receiver ) andalso (S # elixir_scope . function /= Tuple ) andalso
143141 elixir_def_local :macro_for (Tuple , false , Module ),
144142
145143 case Fun of
146144 false ->
147145 case is_element (Tuple , get_optional_macros (Receiver )) of
148- true -> { ok , expand_macro_named (Meta , Receiver , Name , Arity , Args , Module , Requires , SEnv ) };
146+ true -> { ok , expand_macro_named (Meta , Receiver , Name , Arity , Args , Module , S ) };
149147 false -> { error , noexpansion }
150148 end ;
151149 _ ->
152150 elixir_import :record (import , Tuple , Receiver , Module ),
153- { ok , expand_macro_fun (Meta , Fun , Receiver , Name , Args , Module , Requires , SEnv ) }
151+ { ok , expand_macro_fun (Meta , Fun , Receiver , Name , Args , Module , S ) }
154152 end .
155153
156154% % Expansion helpers
157155
158- expand_macro_fun (Meta , Fun , Receiver , Name , Args , Module , Requires , SEnv ) ->
159- case (Receiver == Module ) or is_element (Receiver , Requires ) or skip_requires (SEnv ) of
156+ expand_macro_fun (Meta , Fun , Receiver , Name , Args , Module , S ) ->
157+ Requires = S # elixir_scope .requires ,
158+ case (Receiver == Module ) or is_element (Receiver , Requires ) or not (S # elixir_scope .check_requires ) of
160159 true -> ok ;
161160 false ->
162161 Tuple = { unrequired_module , { Receiver , Name , length (Args ), Requires } },
163- elixir_errors :form_error (Meta , elixir_scope : filename ( SEnv ) , ? MODULE , Tuple )
162+ elixir_errors :form_error (Meta , S # elixir_scope . file , ? MODULE , Tuple )
164163 end ,
165164
166165 Line = ? line (Meta ),
167- SArg = {Line ,SEnv },
166+ SArg = {Line ,S },
168167
169168 try
170169 apply (Fun , [SArg |Args ])
171170 catch
172171 Kind :Reason ->
173- Info = { Receiver , Name , length (Args ), [{ file , elixir_scope : filename ( SEnv ) }, { line , Line }] },
172+ Info = { Receiver , Name , length (Args ), [{ file , S # elixir_scope . file }, { line , Line }] },
174173 erlang :raise (Kind , Reason , munge_stacktrace (Info , erlang :get_stacktrace (), SArg ))
175174 end .
176175
177- expand_macro_named (Meta , Receiver , Name , Arity , Args , Module , Requires , SEnv ) ->
176+ expand_macro_named (Meta , Receiver , Name , Arity , Args , Module , S ) ->
178177 ProperName = ? elixir_macro (Name ),
179178 ProperArity = Arity + 1 ,
180179 Fun = fun Receiver :ProperName /ProperArity ,
181- expand_macro_fun (Meta , Fun , Receiver , Name , Args , Module , Requires , SEnv ).
180+ expand_macro_fun (Meta , Fun , Receiver , Name , Args , Module , S ).
182181
183182translate_expansion (Meta , Tree , S ) ->
184183 { TR , TS } = elixir_translator :translate_each (
@@ -197,10 +196,20 @@ merge_aliases(A1, A2) ->
197196
198197% % Helpers
199198
200- skip_requires (# elixir_scope {check_requires = false }) -> true ;
201- skip_requires (_ ) -> false .
199+ % case lists:keyfind(import, 1, Meta) of
200+ % { import, Receiver } ->
201+ % { TRes, TS } = translate_each({ { '.', Meta, [Receiver, Atom] }, Meta, Args },
202+ % S#elixir_scope{check_requires=false}),
203+ % { TRes, TS#elixir_scope{check_requires=S#elixir_scope.check_requires} };
204+ % false ->
205+
206+ find_dispatch (Meta , Tuple , S ) ->
207+ find_dispatch (Meta , Tuple , [], S ).
202208
203- find_dispatch (Meta , Tuple , Functions , Macros , File ) ->
209+ find_dispatch (Meta , Tuple , Extra , S ) ->
210+ Functions = S # elixir_scope .functions ,
211+ Macros = Extra ++ S # elixir_scope .macros ,
212+ File = S # elixir_scope .file ,
204213 FunMatch = find_dispatch (Tuple , Functions ),
205214 MacMatch = find_dispatch (Tuple , Macros ),
206215
0 commit comments