11% % Compiler backend to Erlang.
22-module (elixir_erl ).
3- -export ([elixir_to_erl /1 , definition_to_anonymous /6 , compile /1 ,
3+ -export ([elixir_to_erl /1 , definition_to_anonymous /5 , compile /1 ,
44 get_ann /1 , remote /4 , add_beam_chunks /2 , debug_info /4 ,
5- definition_scope /5 ]).
5+ definition_scope /3 ]).
66-include (" elixir.hrl" ).
77
88% % TODO: Remove extra chunk functionality when OTP 20+.
@@ -61,8 +61,8 @@ remote(Ann, Module, Function, Args) when is_atom(Module), is_atom(Function), is_
6161
6262% % Converts an Elixir definition to an anonymous function.
6363
64- definition_to_anonymous (File , Module , { Name , Arity }, Kind , Meta , Clauses ) ->
65- ErlClauses = [translate_clause (Kind , Name , Arity , Clause , File ) || Clause <- Clauses ],
64+ definition_to_anonymous (File , Module , Kind , Meta , Clauses ) ->
65+ ErlClauses = [translate_clause (Kind , Clause , File ) || Clause <- Clauses ],
6666 Fun = {'fun' , ? ann (Meta ), {clauses , ErlClauses }},
6767 LocalHandler = fun (LocalName , LocalArgs ) -> invoke_local (Module , LocalName , LocalArgs ) end ,
6868 {value , Result , _Binding } = erl_eval :expr (Fun , [], {value , LocalHandler }),
@@ -137,14 +137,14 @@ elixir_to_erl_cons2([], Acc) ->
137137
138138% % Returns a definition scope for translation.
139139
140- definition_scope (Meta , Kind , Name , Arity , File ) ->
140+ definition_scope (Meta , Kind , File ) ->
141141 % % TODO: We only need to do this dance because some
142142 % % warnings are raised in elixir_erl_pass. Once we remove
143143 % % all warnings from the Erlang pass, we can remove the
144144 % % file field from #elixir_erl and clean up the code.
145145 case lists :keyfind (location , 1 , Meta ) of
146- {location , {F , _ }} -> # elixir_erl {def = { Kind , Name , Arity }, file = F };
147- false -> # elixir_erl {def = { Kind , Name , Arity }, file = File }
146+ {location , {F , _ }} -> # elixir_erl {def = Kind ,file = F };
147+ false -> # elixir_erl {def = Kind ,file = File }
148148 end .
149149
150150% % Compilation hook.
@@ -167,9 +167,15 @@ split_definition([{Tuple, def, Meta, Clauses} | T], File, Unreachable,
167167 split_definition (T , File , Unreachable , [Tuple | Def ], Defmacro , [{N , A } | Exports ],
168168 add_definition (Meta , Function , Functions ));
169169
170- split_definition ([{Tuple , defp , Meta , Clauses } | T ], File , Unreachable ,
170+ split_definition ([{Tuple , defmacro , Meta , Clauses } | T ], File , Unreachable ,
171171 Def , Defmacro , Exports , Functions ) ->
172- Function = translate_definition (defp , Meta , File , Tuple , Clauses ),
172+ {_ , _ , N , A , _ } = Function = translate_definition (defmacro , Meta , File , Tuple , Clauses ),
173+ split_definition (T , File , Unreachable , Def , [Tuple | Defmacro ], [{N , A } | Exports ],
174+ add_definition (Meta , Function , Functions ));
175+
176+ split_definition ([{Tuple , Kind , Meta , Clauses } | T ], File , Unreachable ,
177+ Def , Defmacro , Exports , Functions ) ->
178+ Function = translate_definition (Kind , Meta , File , Tuple , Clauses ),
173179 case lists :member (Tuple , Unreachable ) of
174180 false ->
175181 split_definition (T , File , Unreachable , Def , Defmacro , Exports ,
@@ -178,16 +184,6 @@ split_definition([{Tuple, defp, Meta, Clauses} | T], File, Unreachable,
178184 split_definition (T , File , Unreachable , Def , Defmacro , Exports , Functions )
179185 end ;
180186
181- split_definition ([{Tuple , defmacro , Meta , Clauses } | T ], File , Unreachable ,
182- Def , Defmacro , Exports , Functions ) ->
183- {_ , _ , N , A , _ } = Function = translate_definition (defmacro , Meta , File , Tuple , Clauses ),
184- split_definition (T , File , Unreachable , Def , [Tuple | Defmacro ], [{N , A } | Exports ],
185- add_definition (Meta , Function , Functions ));
186-
187- split_definition ([{_ , defmacrop , _Meta , _Clauses } | T ], File , Unreachable ,
188- Def , Defmacro , Exports , Functions ) ->
189- split_definition (T , File , Unreachable , Def , Defmacro , Exports , Functions );
190-
191187split_definition ([], _File , _Unreachable , Def , Defmacro , Exports , {Head , Tail }) ->
192188 {Def , Defmacro , Exports , Head ++ Tail }.
193189
@@ -206,15 +202,15 @@ add_definition(Meta, Body, {Head, Tail}) ->
206202 end .
207203
208204translate_definition (Kind , Meta , File , {Name , Arity }, Clauses ) ->
209- ErlClauses = [translate_clause (Kind , Name , Arity , Clause , File ) || Clause <- Clauses ],
205+ ErlClauses = [translate_clause (Kind , Clause , File ) || Clause <- Clauses ],
210206
211207 case is_macro (Kind ) of
212208 true -> {function , ? ann (Meta ), elixir_utils :macro_name (Name ), Arity + 1 , ErlClauses };
213209 false -> {function , ? ann (Meta ), Name , Arity , ErlClauses }
214210 end .
215211
216- translate_clause (Kind , Name , Arity , {Meta , Args , Guards , Body }, File ) ->
217- S = definition_scope (Meta , Kind , Name , Arity , File ),
212+ translate_clause (Kind , {Meta , Args , Guards , Body }, File ) ->
213+ S = definition_scope (Meta , Kind , File ),
218214
219215 {TClause , TS } = elixir_erl_clauses :clause (Meta ,
220216 fun elixir_erl_pass :translate_args /2 , Args , Body , Guards , S ),
0 commit comments