summaryrefslogtreecommitdiff
path: root/lib/elixir/src/elixir_fn.erl
diff options
context:
space:
mode:
authorJosé Valim <jose.valim@plataformatec.com.br>2013-12-23 18:23:08 +0100
committerJosé Valim <jose.valim@plataformatec.com.br>2013-12-23 18:23:08 +0100
commitf81a15b7cb1dbba4d7ef4203fdd4e3ed3a9ddd7d (patch)
tree70a42b472518c90faaa01899977ec0a50849f1cf /lib/elixir/src/elixir_fn.erl
parent51aef55c830b770d85c1add1eccd6dcb440fd018 (diff)
downloadelixir-f81a15b7cb1dbba4d7ef4203fdd4e3ed3a9ddd7d.tar.gz
Expand fn
Diffstat (limited to 'lib/elixir/src/elixir_fn.erl')
-rw-r--r--lib/elixir/src/elixir_fn.erl14
1 files changed, 11 insertions, 3 deletions
diff --git a/lib/elixir/src/elixir_fn.erl b/lib/elixir/src/elixir_fn.erl
index f48642a89..20b6cc320 100644
--- a/lib/elixir/src/elixir_fn.erl
+++ b/lib/elixir/src/elixir_fn.erl
@@ -1,5 +1,5 @@
-module(elixir_fn).
--export([fn/3, capture/3]).
+-export([fn/3, capture/3, expand/3]).
-import(elixir_scope, [umergec/2]).
-import(elixir_errors, [syntax_error/3, compile_error/4]).
-include("elixir.hrl").
@@ -25,6 +25,16 @@ translate_fn_match(Arg, S) ->
{ TArg, TS } = elixir_translator:translate(Arg, S#elixir_scope{extra=fn_match}),
{ TArg, TS#elixir_scope{extra=S#elixir_scope.extra} }.
+%% Expansion
+
+expand(Meta, Clauses, E) ->
+ Transformer = fun(Clause, Acc) ->
+ { EClause, EC } = elixir_exp_clauses:expand_clause(fun elixir_exp:expand_many/2, Clause, Acc),
+ { EClause, elixir_env:mergec(E, EC) }
+ end,
+ { EClauses, _ } = lists:mapfoldl(Transformer, E, Clauses),
+ { { fn, Meta, EClauses }, E }.
+
%% Capture
capture(Meta, { '/', _, [{ { '.', _, [_, F] } = Dot, RequireMeta , [] }, A] }, E) when is_atom(F), is_integer(A) ->
@@ -72,8 +82,6 @@ capture(Meta, Arg, E) when is_integer(Arg) ->
capture(Meta, Arg, E) ->
invalid_capture(Meta, Arg, E).
-%% Helpers
-
capture_import(Meta, { Atom, ImportMeta, Args } = Expr, E, Sequential) ->
Res = Sequential andalso
elixir_exp_dispatch:import_function(ImportMeta, Atom, length(Args), E),