Skip to content

Commit f1ad481

Browse files
committed
Trace on definition callbacks, closes #14427
1 parent c20222b commit f1ad481

File tree

2 files changed

+35
-3
lines changed

2 files changed

+35
-3
lines changed

lib/elixir/src/elixir_def.erl

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -226,7 +226,7 @@ store_definition(Meta, Kind, CheckClauses, Name, Arity, DefaultsArgs, Guards, Bo
226226
[store_definition(none, Kind, Meta, Name, length(DefaultArgs), File,
227227
Module, 0, [Default]) || {_, DefaultArgs, _, _} = Default <- Defaults],
228228

229-
run_on_definition_callbacks(Kind, Module, Name, DefaultsArgs, Guards, Body, E),
229+
run_on_definition_callbacks(Meta, Kind, Module, Name, DefaultsArgs, Guards, Body, E),
230230
Tuple.
231231

232232
env_for_expansion(Kind, Tuple, E) when Kind =:= defmacro; Kind =:= defmacrop ->
@@ -271,10 +271,13 @@ def_to_clauses(Kind, Meta, Args, Guards, Body, E) ->
271271
elixir_errors:file_error(Meta, E, elixir_expand, {missing_option, Kind, [do]})
272272
end.
273273

274-
run_on_definition_callbacks(Kind, Module, Name, Args, Guards, Body, E) ->
274+
run_on_definition_callbacks(Meta, Kind, Module, Name, Args, Guards, Body, E) ->
275275
{_, Bag} = elixir_module:data_tables(Module),
276276
Callbacks = ets:lookup_element(Bag, {accumulate, on_definition}, 2),
277-
_ = [Mod:Fun(E, Kind, Name, Args, Guards, Body) || {Mod, Fun} <- lists:reverse(Callbacks)],
277+
_ = [begin
278+
elixir_env:trace({remote_function, Meta, Mod, Fun, 6}, E),
279+
Mod:Fun(E, Kind, Name, Args, Guards, Body)
280+
end || {Mod, Fun} <- lists:reverse(Callbacks)],
278281
ok.
279282

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

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

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -299,6 +299,35 @@ defmodule Kernel.TracersTest do
299299
assert meta[:line] == 1
300300
end
301301

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

0 commit comments

Comments
 (0)