There was an error while loading. Please reload this page.
1 parent 9b22b6d commit cba7c5bCopy full SHA for cba7c5b
lib/elixir/lib/macro.ex
@@ -658,8 +658,13 @@ defmodule Macro do
658
659
defp do_expand_once({ :__ENV__, _, atom }, env) when is_atom(atom),
660
do: { { :{}, [], tuple_to_list(env) }, true }
661
- defp do_expand_once({ { :., _, [{ :__ENV__, _, atom }, field] }, _, [] }, env) when is_atom(atom) and is_atom(field),
662
- do: { apply(env, field, []), true }
+ defp do_expand_once({ { :., _, [{ :__ENV__, _, atom }, field] }, _, [] } = original, env) when
+ is_atom(atom) and is_atom(field) do
663
+ case :erlang.function_exported(Macro.Env, field, 1) do
664
+ true -> { apply(env, field, []), true }
665
+ false -> { original, false }
666
+ end
667
668
669
# Expand possible macro import invocation
670
defp do_expand_once({ atom, meta, context } = original, env)
lib/elixir/src/elixir_code_server.erl
@@ -27,6 +27,7 @@ start_link() ->
27
gen_server:start_link({local, ?MODULE}, ?MODULE, ok, []).
28
29
init(ok) ->
30
+ code:ensure_loaded('Elixir.Macro.Env'),
31
code:ensure_loaded('Elixir.Module.LocalsTracker'),
32
code:ensure_loaded('Elixir.Kernel.LexicalTracker'),
33
{ ok, #elixir_code_server{} }.
lib/elixir/src/elixir_exp.erl
@@ -132,8 +132,12 @@ expand({ '__CALLER__', _, Atom } = Caller, E) when is_atom(Atom) ->
132
expand({ '__ENV__', Meta, Atom }, E) when is_atom(Atom) ->
133
Env = elixir_env:env_to_ex({ ?line(Meta), E }),
134
{ { '{}', [], tuple_to_list(Env) }, E };
135
-expand({ { '.', _, [{ '__ENV__', Meta, Atom }, Field] }, _, [] }, E) when is_atom(Atom), is_atom(Field) ->
136
- { (elixir_env:env_to_ex({ ?line(Meta), E })):Field(), E };
+expand({ { '.', DotMeta, [{ '__ENV__', Meta, Atom }, Field] }, CallMeta, [] }, E) when is_atom(Atom), is_atom(Field) ->
+ Env = elixir_env:env_to_ex({ ?line(Meta), E }),
137
+ case erlang:function_exported('Elixir.Macro.Env', Field, 1) of
138
+ true -> { Env:Field(), E };
139
+ false -> { { { '.', DotMeta, [{ '{}', [], tuple_to_list(Env) }, Field] }, CallMeta, [] }, E }
140
+ end;
141
142
%% Quote
143
lib/elixir/test/elixir/kernel/expansion_test.exs
@@ -104,7 +104,10 @@ defmodule Kernel.ExpansionTest do
104
end
105
106
test "__ENV__.accessor" do
107
- assert expand(quote(do: __ENV__.file)) == __ENV__.file
+ env = __ENV__
108
+ assert expand_env(quote(do: __ENV__.file), env) == { __ENV__.file, env }
109
+ assert expand_env(quote(do: __ENV__.unknown), env) ==
110
+ { quote(do: unquote({ :{}, [], tuple_to_list(env.line(0)) }).unknown), env }
111
112
113
## Super
lib/elixir/test/elixir/macro_test.exs
@@ -150,6 +150,13 @@ defmodule MacroTest do
150
assert Macro.expand_once(quote(do: :foo), __ENV__) == :foo
151
152
153
+ test :expand_once_env do
154
155
+ assert Macro.expand_once(quote(do: __ENV__), env) == { :{}, [], tuple_to_list(env) }
156
+ assert Macro.expand_once(quote(do: __ENV__.file), env) == env.file
157
+ assert Macro.expand_once(quote(do: __ENV__.unkown), env) == quote(do: __ENV__.unkown)
158
159
+
160
defmacro local_macro do
161
:local_macro
162
0 commit comments