Skip to content

Commit afe4704

Browse files
committed
Trace on definition callbacks, closes #14427
1 parent c51acfc commit afe4704

File tree

2 files changed

+35
-3
lines changed

2 files changed

+35
-3
lines changed

lib/elixir/src/elixir_def.erl

+6-3
Original file line numberDiff line numberDiff line change
@@ -222,7 +222,7 @@ store_definition(Meta, Kind, CheckClauses, Name, Arity, DefaultsArgs, Guards, Bo
222222
[store_definition(none, Kind, Meta, Name, length(DefaultArgs), File,
223223
Module, 0, [Default]) || {_, DefaultArgs, _, _} = Default <- Defaults],
224224

225-
run_on_definition_callbacks(Kind, Module, Name, DefaultsArgs, Guards, Body, E),
225+
run_on_definition_callbacks(Meta, Kind, Module, Name, DefaultsArgs, Guards, Body, E),
226226
Tuple.
227227

228228
env_for_expansion(Kind, Tuple, E) when Kind =:= defmacro; Kind =:= defmacrop ->
@@ -267,10 +267,13 @@ def_to_clauses(Kind, Meta, Args, Guards, Body, E) ->
267267
elixir_errors:file_error(Meta, E, elixir_expand, {missing_option, Kind, [do]})
268268
end.
269269

270-
run_on_definition_callbacks(Kind, Module, Name, Args, Guards, Body, E) ->
270+
run_on_definition_callbacks(Meta, Kind, Module, Name, Args, Guards, Body, E) ->
271271
{_, Bag} = elixir_module:data_tables(Module),
272272
Callbacks = ets:lookup_element(Bag, {accumulate, on_definition}, 2),
273-
_ = [Mod:Fun(E, Kind, Name, Args, Guards, Body) || {Mod, Fun} <- lists:reverse(Callbacks)],
273+
_ = [begin
274+
elixir_env:trace({remote_function, Meta, Mod, Fun, 6}, E),
275+
Mod:Fun(E, Kind, Name, Args, Guards, Body)
276+
end || {Mod, Fun} <- lists:reverse(Callbacks)],
274277
ok.
275278

276279
store_definition(CheckClauses, Kind, Meta, Name, Arity, File, Module, Defaults, Clauses)

lib/elixir/test/elixir/kernel/tracers_test.exs

+29
Original file line numberDiff line numberDiff line change
@@ -295,6 +295,35 @@ defmodule Kernel.TracersTest do
295295
assert meta[:line] == 1
296296
end
297297

298+
def __before_compile__(_), do: :ok
299+
def __after_compile__(_, _), do: :ok
300+
def __after_verify__(_), do: :ok
301+
def __on_definition__(_, _, _, _, _, _), do: :ok
302+
303+
test "traces compile time attributes" do
304+
compile_string("""
305+
defmodule TracerCompileAttributes do
306+
@before_compile Kernel.TracersTest
307+
@after_compile Kernel.TracersTest
308+
@on_definition Kernel.TracersTest
309+
@after_verify Kernel.TracersTest
310+
def hello, do: :world
311+
end
312+
""")
313+
314+
assert_received {{:remote_function, meta, __MODULE__, :__before_compile__, 1}, _}
315+
assert meta[:line] == 1
316+
317+
assert_received {{:remote_function, meta, __MODULE__, :__after_compile__, 2}, _}
318+
assert meta[:line] == 1
319+
320+
assert_received {{:remote_function, meta, __MODULE__, :__after_verify__, 1}, _}
321+
assert meta[:line] == 1
322+
323+
assert_received {{:remote_function, meta, __MODULE__, :__on_definition__, 6}, _}
324+
assert meta[:line] == 6
325+
end
326+
298327
test "traces super" do
299328
compile_string("""
300329
defmodule TracerOverridable do

0 commit comments

Comments
 (0)