From a0eef07958ca68becd7e8aefcb2d6c9e256187b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Valim?= Date: Sat, 21 Dec 2013 22:00:42 +0100 Subject: [PATCH] No need to require for requires for all expansions --- lib/elixir/src/elixir_dispatch.erl | 34 +++++++++++++------------- lib/elixir/src/elixir_exp_dispatch.erl | 33 ++++++++++++------------- 2 files changed, 33 insertions(+), 34 deletions(-) diff --git a/lib/elixir/src/elixir_dispatch.erl b/lib/elixir/src/elixir_dispatch.erl index 60cd92dca1..1a86443d81 100644 --- a/lib/elixir/src/elixir_dispatch.erl +++ b/lib/elixir/src/elixir_dispatch.erl @@ -123,7 +123,7 @@ expand_import(Meta, { Name, Arity } = Tuple, Args, S, Extra) -> %% Dispatch to the local. _ -> elixir_tracker:record_local(Tuple, Module, Function), - { ok, Module, expand_macro_fun(Meta, Local(), Module, Name, Args, Module, S) } + { ok, Module, expand_macro_fun(Meta, Local(), Module, Name, Args, S) } end. do_expand_import(Meta, { Name, Arity } = Tuple, Args, Module, S, Result) -> @@ -139,7 +139,7 @@ do_expand_import(Meta, { Name, Arity } = Tuple, Args, Module, S, Result) -> { macro, Receiver } -> elixir_lexical:record_import(Receiver, S#elixir_scope.lexical_tracker), elixir_tracker:record_import(Tuple, Receiver, Module, S#elixir_scope.function), - { ok, Receiver, expand_macro_named(Meta, Receiver, Name, Arity, Args, Module, S) }; + { ok, Receiver, expand_macro_named(Meta, Receiver, Name, Arity, Args, S) }; { import, Receiver } -> case expand_require([{require,false}|Meta], Receiver, Tuple, Args, S) of { ok, _, _ } = Response -> Response; @@ -155,23 +155,23 @@ expand_require(Meta, Receiver, { Name, Arity } = Tuple, Args, S) -> case is_element(Tuple, get_optional_macros(Receiver)) of true -> - elixir_lexical:record_remote(Receiver, S#elixir_scope.lexical_tracker), - elixir_tracker:record_remote(Tuple, Receiver, Module, Function), - { ok, Receiver, expand_macro_named(Meta, Receiver, Name, Arity, Args, Module, S) }; - false -> error + Requires = S#elixir_scope.requires, + case (Receiver == Module) orelse is_element(Receiver, Requires) orelse skip_require(Meta) of + true -> + elixir_lexical:record_remote(Receiver, S#elixir_scope.lexical_tracker), + elixir_tracker:record_remote(Tuple, Receiver, Module, Function), + { ok, Receiver, expand_macro_named(Meta, Receiver, Name, Arity, Args, S) }; + false -> + Tuple = { unrequired_module, { Receiver, Name, length(Args), Requires } }, + elixir_errors:form_error(Meta, S#elixir_scope.file, ?MODULE, Tuple) + end; + false -> + error end. %% Expansion helpers -expand_macro_fun(Meta, Fun, Receiver, Name, Args, Module, S) -> - Requires = S#elixir_scope.requires, - case (Receiver == Module) or is_element(Receiver, Requires) or skip_require(Meta) of - true -> ok; - false -> - Tuple = { unrequired_module, { Receiver, Name, length(Args), Requires } }, - elixir_errors:form_error(Meta, S#elixir_scope.file, ?MODULE, Tuple) - end, - +expand_macro_fun(Meta, Fun, Receiver, Name, Args, S) -> Line = ?line(Meta), SArg = {Line,S}, @@ -183,11 +183,11 @@ expand_macro_fun(Meta, Fun, Receiver, Name, Args, Module, S) -> erlang:raise(Kind, Reason, prune_stacktrace(Info, erlang:get_stacktrace(), SArg)) end. -expand_macro_named(Meta, Receiver, Name, Arity, Args, Module, S) -> +expand_macro_named(Meta, Receiver, Name, Arity, Args, S) -> ProperName = ?elixir_macro(Name), ProperArity = Arity + 1, Fun = fun Receiver:ProperName/ProperArity, - expand_macro_fun(Meta, Fun, Receiver, Name, Args, Module, S). + expand_macro_fun(Meta, Fun, Receiver, Name, Args, S). translate_expansion(Meta, Receiver, Tree, S) -> Line = ?line(Meta), diff --git a/lib/elixir/src/elixir_exp_dispatch.erl b/lib/elixir/src/elixir_exp_dispatch.erl index ddb7191325..6ade5d442c 100644 --- a/lib/elixir/src/elixir_exp_dispatch.erl +++ b/lib/elixir/src/elixir_exp_dispatch.erl @@ -78,7 +78,7 @@ expand_import(Meta, { Name, Arity } = Tuple, Args, E, Extra) -> %% Dispatch to the local. _ -> elixir_tracker:record_local(Tuple, Module, Function), - { ok, Module, expand_macro_fun(Meta, Local(), Module, Name, Args, Module, E) } + { ok, Module, expand_macro_fun(Meta, Local(), Module, Name, Args, E) } end. do_expand_import(Meta, { Name, Arity } = Tuple, Args, Module, E, Result) -> @@ -94,7 +94,7 @@ do_expand_import(Meta, { Name, Arity } = Tuple, Args, Module, E, Result) -> { macro, Receiver } -> elixir_lexical:record_import(Receiver, E#elixir_env.lexical_tracker), elixir_tracker:record_import(Tuple, Receiver, Module, E#elixir_env.function), - { ok, Receiver, expand_macro_named(Meta, Receiver, Name, Arity, Args, Module, E) }; + { ok, Receiver, expand_macro_named(Meta, Receiver, Name, Arity, Args, E) }; { import, Receiver } -> case expand_require([{require,false}|Meta], Receiver, Tuple, Args, E) of { ok, _, _ } = Response -> Response; @@ -109,24 +109,23 @@ expand_require(Meta, Receiver, { Name, Arity } = Tuple, Args, E) -> Function = E#elixir_env.function, case is_element(Tuple, get_optional_macros(Receiver)) of - true -> - elixir_lexical:record_remote(Receiver, E#elixir_env.lexical_tracker), - elixir_tracker:record_remote(Tuple, Receiver, Module, Function), - { ok, Receiver, expand_macro_named(Meta, Receiver, Name, Arity, Args, Module, E) }; + true -> + Requires = E#elixir_env.requires, + case (Receiver == Module) orelse is_element(Receiver, Requires) orelse skip_require(Meta) of + true -> + elixir_lexical:record_remote(Receiver, E#elixir_env.lexical_tracker), + elixir_tracker:record_remote(Tuple, Receiver, Module, Function), + { ok, Receiver, expand_macro_named(Meta, Receiver, Name, Arity, Args, E) }; + false -> + Tuple = { unrequired_module, { Receiver, Name, length(Args), Requires } }, + elixir_errors:form_error(Meta, E#elixir_env.file, ?MODULE, Tuple) + end; false -> error end. %% Expansion helpers -expand_macro_fun(Meta, Fun, Receiver, Name, Args, Module, E) -> - Requires = E#elixir_env.requires, - case (Receiver == Module) or is_element(Receiver, Requires) or skip_require(Meta) of - true -> ok; - false -> - Tuple = { unrequired_module, { Receiver, Name, length(Args), Requires } }, - elixir_errors:form_error(Meta, E#elixir_env.file, ?MODULE, Tuple) - end, - +expand_macro_fun(Meta, Fun, Receiver, Name, Args, E) -> Line = ?line(Meta), EArg = #elixir_env{line=Line}, @@ -138,11 +137,11 @@ expand_macro_fun(Meta, Fun, Receiver, Name, Args, Module, E) -> erlang:raise(Kind, Reason, prune_stacktrace(Info, erlang:get_stacktrace(), EArg)) end. -expand_macro_named(Meta, Receiver, Name, Arity, Args, Module, E) -> +expand_macro_named(Meta, Receiver, Name, Arity, Args, E) -> ProperName = ?elixir_macro(Name), ProperArity = Arity + 1, Fun = fun Receiver:ProperName/ProperArity, - expand_macro_fun(Meta, Fun, Receiver, Name, Args, Module, E). + expand_macro_fun(Meta, Fun, Receiver, Name, Args, E). translate_expansion(Meta, Receiver, Tree, E) -> Line = ?line(Meta),