Skip to content

Commit a050c00

Browse files
author
José Valim
committed
Use meta on rewrites, closes #9714
1 parent d395c3e commit a050c00

File tree

2 files changed

+36
-28
lines changed

2 files changed

+36
-28
lines changed

lib/elixir/src/elixir_rewrite.erl

Lines changed: 26 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
-module(elixir_rewrite).
2-
-compile({inline, [inner_inline/4, inner_rewrite/4]}).
2+
-compile({inline, [inner_inline/4, inner_rewrite/5]}).
33
-export([erl_to_ex/3, inline/3, rewrite/5, match_rewrite/5, guard_rewrite/5, format_error/1]).
44
-include("elixir.hrl").
55

@@ -34,13 +34,13 @@
3434

3535
-define(
3636
rewrite(ExMod, ExFun, ExArgs, ErlMod, ErlFun, ErlArgs),
37-
inner_rewrite(ex_to_erl, ExMod, ExFun, ExArgs) -> {ErlMod, ErlFun, ErlArgs};
38-
inner_rewrite(erl_to_ex, ErlMod, ErlFun, ErlArgs) -> {ExMod, ExFun, ExArgs}
37+
inner_rewrite(ex_to_erl, _Meta, ExMod, ExFun, ExArgs) -> {ErlMod, ErlFun, ErlArgs};
38+
inner_rewrite(erl_to_ex, _Meta, ErlMod, ErlFun, ErlArgs) -> {ExMod, ExFun, ExArgs}
3939
).
4040

4141
erl_to_ex(Mod, Fun, Args) ->
4242
case inner_inline(erl_to_ex, Mod, Fun, length(Args)) of
43-
false -> inner_rewrite(erl_to_ex, Mod, Fun, Args);
43+
false -> inner_rewrite(erl_to_ex, [], Mod, Fun, Args);
4444
{ExMod, ExFun} -> {ExMod, ExFun, Args}
4545
end.
4646

@@ -228,7 +228,7 @@ rewrite(?string_chars, _, to_string, _, [String]) when is_binary(String) ->
228228
rewrite(?string_chars, _, to_string, _, [{{'.', _, [?kernel, inspect]}, _, _} = Call]) ->
229229
Call;
230230
rewrite(Receiver, DotMeta, Right, Meta, Args) ->
231-
{EReceiver, ERight, EArgs} = inner_rewrite(ex_to_erl, Receiver, Right, Args),
231+
{EReceiver, ERight, EArgs} = inner_rewrite(ex_to_erl, DotMeta, Receiver, Right, Args),
232232
{{'.', DotMeta, [EReceiver, ERight]}, Meta, EArgs}.
233233

234234
?rewrite(?atom, to_string, [Arg], erlang, atom_to_binary, [Arg, utf8]);
@@ -248,39 +248,39 @@ rewrite(Receiver, DotMeta, Right, Meta, Args) ->
248248
?rewrite(?string, to_existing_atom, [Arg], erlang, binary_to_existing_atom, [Arg, utf8]);
249249
?rewrite(?tuple, duplicate, [Data, Size], erlang, make_tuple, [Size, Data]);
250250

251-
inner_rewrite(ex_to_erl, ?tuple, delete_at, [Tuple, Index]) ->
252-
{erlang, delete_element, [increment(Index), Tuple]};
253-
inner_rewrite(ex_to_erl, ?tuple, insert_at, [Tuple, Index, Term]) ->
254-
{erlang, insert_element, [increment(Index), Tuple, Term]};
255-
inner_rewrite(ex_to_erl, ?kernel, elem, [Tuple, Index]) ->
256-
{erlang, element, [increment(Index), Tuple]};
257-
inner_rewrite(ex_to_erl, ?kernel, put_elem, [Tuple, Index, Value]) ->
258-
{erlang, setelement, [increment(Index), Tuple, Value]};
251+
inner_rewrite(ex_to_erl, Meta, ?tuple, delete_at, [Tuple, Index]) ->
252+
{erlang, delete_element, [increment(Meta, Index), Tuple]};
253+
inner_rewrite(ex_to_erl, Meta, ?tuple, insert_at, [Tuple, Index, Term]) ->
254+
{erlang, insert_element, [increment(Meta, Index), Tuple, Term]};
255+
inner_rewrite(ex_to_erl, Meta, ?kernel, elem, [Tuple, Index]) ->
256+
{erlang, element, [increment(Meta, Index), Tuple]};
257+
inner_rewrite(ex_to_erl, Meta, ?kernel, put_elem, [Tuple, Index, Value]) ->
258+
{erlang, setelement, [increment(Meta, Index), Tuple, Value]};
259259

260-
inner_rewrite(erl_to_ex, erlang, delete_element, [Index, Tuple]) when is_number(Index) ->
260+
inner_rewrite(erl_to_ex, _Meta, erlang, delete_element, [Index, Tuple]) when is_number(Index) ->
261261
{?tuple, delete_at, [Tuple, Index - 1]};
262-
inner_rewrite(erl_to_ex, erlang, insert_element, [Index, Tuple, Term]) when is_number(Index) ->
262+
inner_rewrite(erl_to_ex, _Meta, erlang, insert_element, [Index, Tuple, Term]) when is_number(Index) ->
263263
{?tuple, insert_at, [Tuple, Index - 1, Term]};
264-
inner_rewrite(erl_to_ex, erlang, element, [Index, Tuple]) when is_number(Index) ->
264+
inner_rewrite(erl_to_ex, _Meta, erlang, element, [Index, Tuple]) when is_number(Index) ->
265265
{?kernel, elem, [Tuple, Index - 1]};
266-
inner_rewrite(erl_to_ex, erlang, setelement, [Index, Tuple, Value]) when is_number(Index) ->
266+
inner_rewrite(erl_to_ex, _Meta, erlang, setelement, [Index, Tuple, Value]) when is_number(Index) ->
267267
{?kernel, put_elem, [Tuple, Index - 1, Value]};
268268

269-
inner_rewrite(erl_to_ex, erlang, delete_element, [{{'.', _, [erlang, '+']}, _, [Index, 1]}, Tuple]) ->
269+
inner_rewrite(erl_to_ex, _Meta, erlang, delete_element, [{{'.', _, [erlang, '+']}, _, [Index, 1]}, Tuple]) ->
270270
{?tuple, delete_at, [Tuple, Index]};
271-
inner_rewrite(erl_to_ex, erlang, insert_element, [{{'.', _, [erlang, '+']}, _, [Index, 1]}, Tuple, Term]) ->
271+
inner_rewrite(erl_to_ex, _Meta, erlang, insert_element, [{{'.', _, [erlang, '+']}, _, [Index, 1]}, Tuple, Term]) ->
272272
{?tuple, insert_at, [Tuple, Index, Term]};
273-
inner_rewrite(erl_to_ex, erlang, element, [{{'.', _, [erlang, '+']}, _, [Index, 1]}, Tuple]) ->
273+
inner_rewrite(erl_to_ex, _Meta, erlang, element, [{{'.', _, [erlang, '+']}, _, [Index, 1]}, Tuple]) ->
274274
{?kernel, elem, [Tuple, Index]};
275-
inner_rewrite(erl_to_ex, erlang, setelement, [{{'.', _, [erlang, '+']}, _, [Index, 1]}, Tuple, Value]) ->
275+
inner_rewrite(erl_to_ex, _Meta, erlang, setelement, [{{'.', _, [erlang, '+']}, _, [Index, 1]}, Tuple, Value]) ->
276276
{?kernel, put_elem, [Tuple, Index, Value]};
277277

278-
inner_rewrite(_To, Mod, Fun, Args) -> {Mod, Fun, Args}.
278+
inner_rewrite(_To, _Meta, Mod, Fun, Args) -> {Mod, Fun, Args}.
279279

280-
increment(Number) when is_number(Number) ->
280+
increment(_Meta, Number) when is_number(Number) ->
281281
Number + 1;
282-
increment(Other) ->
283-
{{'.', [], [erlang, '+']}, [], [Other, 1]}.
282+
increment(Meta, Other) ->
283+
{{'.', Meta, [erlang, '+']}, Meta, [Other, 1]}.
284284

285285
%% Match rewrite
286286
%%
@@ -312,7 +312,7 @@ static_append(_, _, _) -> throw(impossible).
312312
%% it also verifies the resulting function is supported in
313313
%% guard context - only certain BIFs and operators are.
314314
guard_rewrite(Receiver, DotMeta, Right, Meta, Args) ->
315-
case inner_rewrite(ex_to_erl, Receiver, Right, Args) of
315+
case inner_rewrite(ex_to_erl, DotMeta, Receiver, Right, Args) of
316316
{erlang, RRight, RArgs} ->
317317
case allowed_guard(RRight, length(RArgs)) of
318318
true -> {ok, {{'.', DotMeta, [erlang, RRight]}, Meta, RArgs}};

lib/elixir/test/elixir/kernel/warning_test.exs

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -903,7 +903,7 @@ defmodule Kernel.WarningTest do
903903
purge(Sample)
904904
end
905905

906-
test "badarg warning" do
906+
test "eval failure warning" do
907907
assert capture_err(fn ->
908908
assert_raise ArgumentError, fn ->
909909
Code.eval_string("""
@@ -912,7 +912,15 @@ defmodule Kernel.WarningTest do
912912
end
913913
""")
914914
end
915-
end) =~ "this expression will fail with ArgumentError"
915+
end) =~ ~r"this expression will fail with ArgumentError\n.*nofile:2"
916+
917+
assert capture_err(fn ->
918+
Code.eval_string("""
919+
defmodule Sample do
920+
def foo, do: 1 + nil
921+
end
922+
""")
923+
end) =~ ~r"this expression will fail with ArithmeticError\n.*nofile:2"
916924
after
917925
purge([Sample])
918926
end

0 commit comments

Comments
 (0)