Skip to content

Commit 6c06817

Browse files
lukaszsamsonjosevalim
authored andcommitted
Emit consistent position meta on fn capture traces (#12033)
1 parent 1faf846 commit 6c06817

File tree

4 files changed

+38
-17
lines changed

4 files changed

+38
-17
lines changed

lib/elixir/src/elixir_expand.erl

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -536,14 +536,14 @@ resolve_super(Meta, Arity, E) ->
536536

537537
expand_fn_capture(Meta, Arg, S, E) ->
538538
case elixir_fn:capture(Meta, Arg, S, E) of
539-
{{remote, Remote, Fun, Arity}, SE, EE} ->
539+
{{remote, Remote, Fun, Arity}, RemoteMeta, SE, EE} ->
540540
is_atom(Remote) andalso
541-
elixir_env:trace({remote_function, Meta, Remote, Fun, Arity}, E),
541+
elixir_env:trace({remote_function, RemoteMeta, Remote, Fun, Arity}, E),
542542
AttachedMeta = attach_context_module(Remote, Meta, E),
543543
{{'&', AttachedMeta, [{'/', [], [{{'.', [], [Remote, Fun]}, [], []}, Arity]}]}, SE, EE};
544-
{{local, Fun, Arity}, _SE, #{function := nil}} ->
544+
{{local, Fun, Arity}, _LocalMeta, _SE, #{function := nil}} ->
545545
form_error(Meta, E, ?MODULE, {undefined_local_capture, Fun, Arity});
546-
{{local, Fun, Arity}, SE, EE} ->
546+
{{local, Fun, Arity}, _LocalMeta, SE, EE} ->
547547
{{'&', Meta, [{'/', [], [{Fun, [], nil}, Arity]}]}, SE, EE};
548548
{expand, Expr, SE, EE} ->
549549
expand(Expr, SE, EE)

lib/elixir/src/elixir_fn.erl

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -38,14 +38,14 @@ fn_arity(Args) -> length(Args).
3838

3939
%% Capture
4040

41-
capture(Meta, {'/', _, [{{'.', _, [M, F]} = Dot, DotMeta, []}, A]}, S, E) when is_atom(F), is_integer(A) ->
41+
capture(Meta, {'/', _, [{{'.', _, [M, F]} = Dot, RequireMeta, []}, A]}, S, E) when is_atom(F), is_integer(A) ->
4242
Args = args_from_arity(Meta, A, E),
43-
handle_capture_possible_warning(Meta, DotMeta, M, F, A, E),
44-
capture_require(Meta, {Dot, Meta, Args}, S, E, true);
43+
handle_capture_possible_warning(Meta, RequireMeta, M, F, A, E),
44+
capture_require(Meta, {Dot, RequireMeta, Args}, S, E, true);
4545

46-
capture(Meta, {'/', _, [{F, _, C}, A]}, S, E) when is_atom(F), is_integer(A), is_atom(C) ->
46+
capture(Meta, {'/', _, [{F, ImportMeta, C}, A]}, S, E) when is_atom(F), is_integer(A), is_atom(C) ->
4747
Args = args_from_arity(Meta, A, E),
48-
capture_import(Meta, {F, Meta, Args}, S, E, true);
48+
capture_import(Meta, {F, ImportMeta, Args}, S, E, true);
4949

5050
capture(Meta, {{'.', _, [_, Fun]}, _, Args} = Expr, S, E) when is_atom(Fun), is_list(Args) ->
5151
capture_require(Meta, Expr, S, E, is_sequential_and_not_empty(Args));
@@ -94,7 +94,7 @@ capture_require(Meta, {{'.', DotMeta, [Left, Right]}, RequireMeta, Args}, S, E,
9494
end,
9595

9696
Dot = {{'.', DotMeta, [ELeft, Right]}, RequireMeta, Args},
97-
handle_capture(Res, Meta, Dot, SE, EE, Sequential);
97+
handle_capture(Res, RequireMeta, Dot, SE, EE, Sequential);
9898

9999
{EscLeft, Escaped} ->
100100
Dot = {{'.', DotMeta, [EscLeft, Right]}, RequireMeta, Args},
@@ -103,8 +103,8 @@ capture_require(Meta, {{'.', DotMeta, [Left, Right]}, RequireMeta, Args}, S, E,
103103

104104
handle_capture(false, Meta, Expr, S, E, Sequential) ->
105105
capture_expr(Meta, Expr, S, E, Sequential);
106-
handle_capture(LocalOrRemote, _Meta, _Expr, S, E, _Sequential) ->
107-
{LocalOrRemote, S, E}.
106+
handle_capture(LocalOrRemote, Meta, _Expr, S, E, _Sequential) ->
107+
{LocalOrRemote, Meta, S, E}.
108108

109109
capture_expr(Meta, Expr, S, E, Sequential) ->
110110
capture_expr(Meta, Expr, S, E, [], Sequential).

lib/elixir/test/elixir/kernel/expansion_test.exs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1081,7 +1081,8 @@ defmodule Kernel.ExpansionTest do
10811081
fn -> 17 end
10821082
end
10831083

1084-
assert expand(before_expansion) == after_expansion
1084+
assert clean_meta(expand(before_expansion), [:import, :context, :no_parens]) ==
1085+
after_expansion
10851086
end
10861087

10871088
test "fails on non-continuous" do

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

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,26 @@ defmodule Kernel.TracersTest do
8383
assert meta[:column] == 11
8484
end
8585

86+
test "traces imports via capture" do
87+
compile_string("""
88+
import Integer, only: [is_odd: 1, parse: 1]
89+
&is_odd/1
90+
&parse/1
91+
""")
92+
93+
assert_receive {{:import, meta, Integer, only: [is_odd: 1, parse: 1]}, _}
94+
assert meta[:line] == 1
95+
assert meta[:column] == 1
96+
97+
assert_receive {{:imported_macro, meta, Integer, :is_odd, 1}, _}
98+
assert meta[:line] == 2
99+
assert meta[:column] == 2
100+
101+
assert_receive {{:imported_function, meta, Integer, :parse, 1}, _}
102+
assert meta[:line] == 3
103+
assert meta[:column] == 2
104+
end
105+
86106
test "traces structs" do
87107
compile_string("""
88108
%URI{path: "/"}
@@ -118,11 +138,11 @@ defmodule Kernel.TracersTest do
118138

119139
assert_receive {{:remote_macro, meta, Integer, :is_odd, 1}, _}
120140
assert meta[:line] == 2
121-
assert meta[:column] == 1
141+
assert meta[:column] == 10
122142

123143
assert_receive {{:remote_function, meta, Integer, :parse, 1}, _}
124144
assert meta[:line] == 3
125-
assert meta[:column] == 1
145+
assert meta[:column] == 10
126146
end
127147

128148
test "traces locals" do
@@ -157,11 +177,11 @@ defmodule Kernel.TracersTest do
157177

158178
assert_receive {{:local_macro, meta, :foo, 1}, _}
159179
assert meta[:line] == 4
160-
assert meta[:column] == 20
180+
assert meta[:column] == 21
161181

162182
assert_receive {{:local_function, meta, :bar, 1}, _}
163183
assert meta[:line] == 4
164-
assert meta[:column] == 28
184+
assert meta[:column] == 29
165185
after
166186
:code.purge(Sample)
167187
:code.delete(Sample)

0 commit comments

Comments
 (0)