Skip to content

Commit 5557e62

Browse files
author
José Valim
committed
Backwards incompatible change on before_compile and after_compile
Both callbacks now receive the environment as first argument instead of the module.
1 parent 683153e commit 5557e62

File tree

7 files changed

+26
-21
lines changed

7 files changed

+26
-21
lines changed

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@
1111
* bug fix
1212
* [Mix] Allow Mix projects to be generated with just one letter
1313

14+
* backwards incompatible changes
15+
* [Kernel] `before_compile` and `after_compile` callbacks now receive the environment as first argument instead of the module
16+
1417
* deprecations
1518
* [Kernel] Tidy up and clean `quote` API
1619
* [Kernel] Old `:local.(args)` syntax is deprecated

lib/elixir/src/elixir_def.erl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -110,8 +110,8 @@ run_on_definition_callbacks(Kind, Line, Module, Name, Args, Guards, Expr, S, CO)
110110
ok;
111111
_ ->
112112
Env = elixir_scope:to_ex_env({ Line, S }),
113-
Callbacks = 'Elixir.Module':get_attribute(Module, on_definition),
114-
[Mod:Fun(Env, Kind, Name, Args, Guards, Expr) || { Mod, Fun } <- Callbacks]
113+
elixir_module:eval_callbacks(Line, Module, on_definition,
114+
[Env, Kind, Name, Args, Guards, Expr], S)
115115
end.
116116

117117
%% Retrieve @file or fallback to default

lib/elixir/src/elixir_dispatch.erl

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,7 @@ expand_require(Meta, Receiver, { Name, Arity } = Tuple, Args, Module, Function,
155155
%% Expansion helpers
156156

157157
expand_macro_fun(Meta, Fun, Receiver, Name, Args, Module, Requires, SEnv) ->
158-
case (Receiver == Module) or is_element(Receiver, Requires) of
158+
case (Receiver == Module) or is_element(Receiver, Requires) or skip_requires(SEnv) of
159159
true -> ok;
160160
false ->
161161
Tuple = { unrequired_module, { Receiver, Name, length(Args), Requires } },
@@ -192,6 +192,9 @@ translate_expansion(Meta, Tree, S) ->
192192

193193
%% Helpers
194194

195+
skip_requires(#elixir_scope{check_requires=false}) -> true;
196+
skip_requires(_) -> false.
197+
195198
find_dispatch(Tuple, [{ Name, Values }|T]) ->
196199
case is_element(Tuple, Values) of
197200
true -> Name;

lib/elixir/src/elixir_module.erl

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
-module(elixir_module).
2-
-export([translate/4, compile/5, data_table/1, eval_quoted/4, format_error/1]).
2+
-export([translate/4, compile/5, data_table/1, eval_quoted/4,
3+
format_error/1, eval_callbacks/5]).
34
-include("elixir.hrl").
45
-compile({parse_transform, elixir_transform}).
56

@@ -133,7 +134,8 @@ eval_form(Line, Module, Block, Vars, RawS) ->
133134
S = scope_for_eval(Module, RawS),
134135
{ Value, NewS } = elixir_compiler:eval_forms([Block], Line, Vars, S),
135136
elixir_def_overridable:store_pending(Module),
136-
eval_callbacks(Line, Module, before_compile, [Module], NewS),
137+
Env = elixir_scope:to_ex_env({ Line, S }),
138+
eval_callbacks(Line, Module, before_compile, [Env], NewS),
137139
elixir_def_overridable:store_pending(Module),
138140
Value.
139141

@@ -238,7 +240,8 @@ spec_for_macro(Else) -> Else.
238240
load_form(Line, Forms, S) ->
239241
elixir_compiler:module(Forms, S, fun(Module, Binary) ->
240242
EvalS = scope_for_eval(Module, S),
241-
eval_callbacks(Line, Module, after_compile, [Module, Binary], EvalS),
243+
Env = elixir_scope:to_ex_env({ Line, EvalS }),
244+
eval_callbacks(Line, Module, after_compile, [Env, Binary], EvalS),
242245

243246
case get(elixir_compiled) of
244247
Current when is_list(Current) ->
@@ -321,20 +324,16 @@ else_clause() ->
321324
% HELPERS
322325

323326
eval_callbacks(Line, Module, Name, Args, RawS) ->
324-
S = RawS#elixir_scope{check_clauses=false},
327+
S = RawS#elixir_scope{check_clauses=false,check_requires=false},
325328
Binding = binding_for_eval(Module, []),
326329
Callbacks = lists:reverse(ets:lookup_element(data_table(Module), Name, 2)),
327-
Requires = S#elixir_scope.requires,
328330
Meta = [{line,Line}],
329331

330332
lists:foreach(fun({M,F}) ->
331-
Expr = { { '.', Meta, [M,F] }, Meta, Args },
332-
Scope = case ordsets:is_element(M, Requires) of
333-
true -> S;
334-
false -> S#elixir_scope{requires=ordsets:add_element(M, Requires)}
335-
end,
336-
337-
{ Tree, _ } = elixir_translator:translate_each(Expr, Scope),
333+
{ Tree, _ } = elixir_dispatch:dispatch_require(Meta, M, F, Args, S, fun() ->
334+
apply(M, F, Args),
335+
{ { nil, 0 }, S }
336+
end),
338337

339338
try
340339
erl_eval:exprs([Tree], Binding)

lib/elixir/test/elixir/kernel/errors_test.exs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -270,7 +270,7 @@ defmodule Kernel.ErrorsTest do
270270
end
271271

272272
test :macros_compiled_callback do
273-
assert [{Kernel.ErrorsTest,:__before_compile__,[Foo],_}|_] =
273+
assert [{Kernel.ErrorsTest,:__before_compile__,[Macro.Env[module: Foo]],_}|_] =
274274
rescue_stacktrace("defmodule Foo do\nModule.put_attribute(__MODULE__, :before_compile, Kernel.ErrorsTest)\nend")
275275
end
276276

lib/elixir/test/elixir/module_test.exs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,12 @@ defmodule ModuleTest.ToBeUsed do
1616
quote do: (def before_compile, do: true)
1717
end
1818

19-
defmacro __after_compile__(ModuleTest.ToUse, bin) when is_binary(bin) do
19+
defmacro __after_compile__(Macro.Env[module: ModuleTest.ToUse], bin) when is_binary(bin) do
2020
# IO.puts "HELLO"
2121
end
2222

23-
defmacro callback(target) do
24-
value = Module.get_attribute(target, :has_callback)
23+
defmacro callback(env) do
24+
value = Module.get_attribute(env.module, :has_callback)
2525
quote do
2626
name = :original_value
2727
args = [1]

lib/mix/lib/mix/project.ex

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,8 @@ defmodule Mix.Project do
4040

4141
# Invoked after each Mix.Project is compiled.
4242
@doc false
43-
def __after_compile__(module, _binary) do
44-
push module
43+
def __after_compile__(env, _binary) do
44+
push env.module
4545
end
4646

4747
# Push a project into the project stack. Only

0 commit comments

Comments
 (0)