11-module (elixir_fn ).
22-export ([fn /3 , capture /3 ]).
33-import (elixir_scope , [umergec /2 ]).
4+ -import (elixir_errors , [syntax_error /3 , syntax_error /4 , compile_error /4 ]).
45-include (" elixir.hrl" ).
56
7+ fn (Meta , Clauses , S ) ->
8+ Transformer = fun ({ ArgsWithGuards , CMeta , Expr }, Acc ) ->
9+ { Args , Guards } = elixir_clauses :extract_splat_guards (ArgsWithGuards ),
10+ elixir_clauses :assigns_block (? line (CMeta ), fun elixir_translator :translate /2 , Args , [Expr ], Guards , umergec (S , Acc ))
11+ end ,
12+
13+ { TClauses , NS } = lists :mapfoldl (Transformer , S , Clauses ),
14+ Arities = [length (Args ) || { clause , _Line , Args , _Guards , _Exprs } <- TClauses ],
15+
16+ case length (lists :usort (Arities )) of
17+ 1 ->
18+ { { 'fun' , ? line (Meta ), { clauses , TClauses } }, umergec (S , NS ) };
19+ _ ->
20+ syntax_error (Meta , S # elixir_scope .file ,
21+ " cannot mix clauses with different arities in function definition" )
22+ end .
23+
624capture (Meta , { '/' , _ , [{ { '.' , _ , [M , F ] }, _ , [] }, A ] }, S ) when is_atom (F ), is_integer (A ) ->
725 { [MF , FF , AF ], SF } = elixir_translator :translate_args ([M , F , A ], S ),
826 { { 'fun' , ? line (Meta ), { function , MF , FF , AF } }, SF };
@@ -19,24 +37,11 @@ capture(Meta, { '/', _, [{ F, _, C }, A] }, S) when is_atom(F), is_integer(A), i
1937 end ,
2038
2139 case elixir_dispatch :import_function (WrappedMeta , F , A , S ) of
22- false -> elixir_errors : compile_error (WrappedMeta , S # elixir_scope .file ,
23- " expected ~ts /~B to be a function, but it is a macro" , [F , A ]);
40+ false -> compile_error (WrappedMeta , S # elixir_scope .file ,
41+ " expected ~ts /~B to be a function, but it is a macro" , [F , A ]);
2442 Else -> Else
25- end .
26-
27- fn (Meta , Clauses , S ) ->
28- Transformer = fun ({ ArgsWithGuards , CMeta , Expr }, Acc ) ->
29- { Args , Guards } = elixir_clauses :extract_splat_guards (ArgsWithGuards ),
30- elixir_clauses :assigns_block (? line (CMeta ), fun elixir_translator :translate /2 , Args , [Expr ], Guards , umergec (S , Acc ))
31- end ,
43+ end ;
3244
33- { TClauses , NS } = lists :mapfoldl (Transformer , S , Clauses ),
34- Arities = [length (Args ) || { clause , _Line , Args , _Guards , _Exprs } <- TClauses ],
35-
36- case length (lists :usort (Arities )) of
37- 1 ->
38- { { 'fun' , ? line (Meta ), { clauses , TClauses } }, umergec (S , NS ) };
39- _ ->
40- elixir_errors :syntax_error (Meta , S # elixir_scope .file ,
41- " cannot mix clauses with different arities in function definition" )
42- end .
45+ capture (Meta , Arg , S ) ->
46+ syntax_error (Meta , S # elixir_scope .file ,
47+ " invalid args for &: ~ts " , ['Elixir.Macro' :to_string (Arg )]).
0 commit comments