|
1 | 1 | %% Compiler backend to Erlang. |
2 | 2 | -module(elixir_erl). |
3 | 3 | -export([elixir_to_erl/1, definition_to_anonymous/4, compile/1, consolidate/3, |
4 | | - get_ann/1, debug_info/4, scope/1, format_error/1]). |
| 4 | + get_ann/1, debug_info/4, scope/2, format_error/1]). |
5 | 5 | -include("elixir.hrl"). |
6 | 6 | -define(typespecs, 'Elixir.Kernel.Typespec'). |
7 | 7 |
|
@@ -48,7 +48,7 @@ get_ann([], Gen, Line) -> erl_anno:set_generated(Gen, Line). |
48 | 48 | %% Converts an Elixir definition to an anonymous function. |
49 | 49 |
|
50 | 50 | definition_to_anonymous(Module, Kind, Meta, Clauses) -> |
51 | | - ErlClauses = [translate_clause(Kind, Clause) || Clause <- Clauses], |
| 51 | + ErlClauses = [translate_clause(Kind, Clause, true) || Clause <- Clauses], |
52 | 52 | Fun = {'fun', ?ann(Meta), {clauses, ErlClauses}}, |
53 | 53 | LocalHandler = fun(LocalName, LocalArgs) -> invoke_local(Module, LocalName, LocalArgs) end, |
54 | 54 | {value, Result, _Binding} = erl_eval:expr(Fun, [], {value, LocalHandler}), |
@@ -117,8 +117,8 @@ elixir_to_erl_cons(T) -> elixir_to_erl(T). |
117 | 117 |
|
118 | 118 | %% Returns a scope for translation. |
119 | 119 |
|
120 | | -scope(_Meta) -> |
121 | | - #elixir_erl{}. |
| 120 | +scope(_Meta, ExpandCaptures) -> |
| 121 | + #elixir_erl{expand_captures=ExpandCaptures}. |
122 | 122 |
|
123 | 123 | %% Static compilation hook, used in protocol consolidation |
124 | 124 |
|
@@ -220,15 +220,15 @@ add_definition(Meta, Body, {Head, Tail}) -> |
220 | 220 | end. |
221 | 221 |
|
222 | 222 | translate_definition(Kind, Meta, {Name, Arity}, Clauses) -> |
223 | | - ErlClauses = [translate_clause(Kind, Clause) || Clause <- Clauses], |
| 223 | + ErlClauses = [translate_clause(Kind, Clause, false) || Clause <- Clauses], |
224 | 224 |
|
225 | 225 | case is_macro(Kind) of |
226 | 226 | true -> {function, ?ann(Meta), elixir_utils:macro_name(Name), Arity + 1, ErlClauses}; |
227 | 227 | false -> {function, ?ann(Meta), Name, Arity, ErlClauses} |
228 | 228 | end. |
229 | 229 |
|
230 | | -translate_clause(Kind, {Meta, Args, Guards, Body}) -> |
231 | | - S = scope(Meta), |
| 230 | +translate_clause(Kind, {Meta, Args, Guards, Body}, ExpandCaptures) -> |
| 231 | + S = scope(Meta, ExpandCaptures), |
232 | 232 |
|
233 | 233 | {TClause, TS} = elixir_erl_clauses:clause(Meta, |
234 | 234 | fun elixir_erl_pass:translate_args/2, Args, Body, Guards, S), |
|
0 commit comments