5
5
-export ([default_macros /0 , default_functions /0 , default_requires /0 ,
6
6
dispatch_require /6 , dispatch_import /5 ,
7
7
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 ,
9
9
format_error /1 , in_erlang_functions /0 , in_erlang_macros /0 ]).
10
10
-include (" elixir.hrl" ).
11
11
-compile ({parse_transform , elixir_transform }).
@@ -23,7 +23,7 @@ default_requires() ->
23
23
find_import (Meta , Name , Arity , S ) ->
24
24
Tuple = { Name , Arity },
25
25
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
27
27
{ function , Receiver } -> Receiver ;
28
28
{ macro , Receiver } -> Receiver ;
29
29
nomatch -> false
@@ -33,7 +33,7 @@ find_import(Meta, Name, Arity, S) ->
33
33
34
34
import_function (Meta , Name , Arity , S ) ->
35
35
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
37
37
{ function , Receiver } ->
38
38
elixir_import :record (import , Tuple , Receiver , S # elixir_scope .module ),
39
39
remote_function (Meta , Receiver , Name , Arity , S );
@@ -58,7 +58,7 @@ dispatch_import(Meta, Name, Args, S, Callback) ->
58
58
Arity = length (Args ),
59
59
Tuple = { Name , Arity },
60
60
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
62
62
{ function , Receiver } ->
63
63
elixir_import :record (import , Tuple , Receiver , Module ),
64
64
Endpoint = case (Receiver == ? BUILTIN ) andalso is_element (Tuple , in_erlang_functions ()) of
@@ -67,8 +67,7 @@ dispatch_import(Meta, Name, Args, S, Callback) ->
67
67
end ,
68
68
elixir_translator :translate_each ({ { '.' , Meta , [Endpoint , Name ] }, Meta , Args }, S );
69
69
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
72
71
{ error , noexpansion } ->
73
72
Callback ();
74
73
{ error , internal } ->
@@ -88,8 +87,7 @@ dispatch_require(Meta, Receiver, Name, Args, S, Callback) ->
88
87
true ->
89
88
elixir_translator :translate_each ({ { '.' , Meta , [erlang , Name ] }, Meta , Args }, S );
90
89
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
93
91
{ error , noexpansion } ->
94
92
Callback ();
95
93
{ error , internal } ->
@@ -101,84 +99,85 @@ dispatch_require(Meta, Receiver, Name, Args, S, Callback) ->
101
99
102
100
% % Macros expansion
103
101
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 ) ->
105
107
case Result of
106
108
{ macro , ? BUILTIN } ->
107
109
case is_element (Tuple , in_erlang_macros ()) of
108
110
true -> { error , internal };
109
111
false ->
110
112
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 ) }
112
114
end ;
113
115
{ macro , Receiver } ->
114
116
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 ) };
116
118
_ ->
117
- Fun = (Function /= Tuple ) andalso
119
+ Fun = (S # elixir_scope . function /= Tuple ) andalso
118
120
elixir_def_local :macro_for (Tuple , true , Module ),
119
121
case Fun of
120
122
false -> { error , noexpansion };
121
123
_ ->
122
124
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 ) }
124
126
end
125
127
end .
126
128
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 ) ->
132
130
case is_element (Tuple , in_erlang_macros ()) of
133
131
true -> { error , internal };
134
132
false ->
135
133
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 ) };
137
135
false -> { error , noexpansion }
138
136
end
139
137
end ;
140
138
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
143
141
elixir_def_local :macro_for (Tuple , false , Module ),
144
142
145
143
case Fun of
146
144
false ->
147
145
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 ) };
149
147
false -> { error , noexpansion }
150
148
end ;
151
149
_ ->
152
150
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 ) }
154
152
end .
155
153
156
154
% % Expansion helpers
157
155
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
160
159
true -> ok ;
161
160
false ->
162
161
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 )
164
163
end ,
165
164
166
165
Line = ? line (Meta ),
167
- SArg = {Line ,SEnv },
166
+ SArg = {Line ,S },
168
167
169
168
try
170
169
apply (Fun , [SArg |Args ])
171
170
catch
172
171
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 }] },
174
173
erlang :raise (Kind , Reason , munge_stacktrace (Info , erlang :get_stacktrace (), SArg ))
175
174
end .
176
175
177
- expand_macro_named (Meta , Receiver , Name , Arity , Args , Module , Requires , SEnv ) ->
176
+ expand_macro_named (Meta , Receiver , Name , Arity , Args , Module , S ) ->
178
177
ProperName = ? elixir_macro (Name ),
179
178
ProperArity = Arity + 1 ,
180
179
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 ).
182
181
183
182
translate_expansion (Meta , Tree , S ) ->
184
183
{ TR , TS } = elixir_translator :translate_each (
@@ -197,10 +196,20 @@ merge_aliases(A1, A2) ->
197
196
198
197
% % Helpers
199
198
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 ).
202
208
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 ,
204
213
FunMatch = find_dispatch (Tuple , Functions ),
205
214
MacMatch = find_dispatch (Tuple , Macros ),
206
215
0 commit comments