Skip to content

Commit 51de0e0

Browse files
committed
Add line numbers of first expression to lists
1 parent 9b38e4e commit 51de0e0

File tree

2 files changed

+51
-13
lines changed

2 files changed

+51
-13
lines changed

lib/elixir/src/elixir_erl_pass.erl

Lines changed: 25 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -257,11 +257,11 @@ translate({{'.', _, [Expr]}, Meta, Args}, S) when is_list(Args) ->
257257
%% Literals
258258

259259
translate(List, S) when is_list(List) ->
260-
translate_list(List, S, []);
260+
translate_list(List, S, [], 0);
261261

262262
translate({Left, Right}, S) ->
263-
{TArgs, SE} = translate_args([Left, Right], S),
264-
{{tuple, 0, TArgs}, SE};
263+
{[TLeft, TRight], SE} = translate_args([Left, Right], S),
264+
{{tuple, binary_ann(TLeft, TRight), [TLeft, TRight]}, SE};
265265

266266
translate(Other, S) ->
267267
{elixir_erl:elixir_to_erl(Other), S}.
@@ -274,20 +274,32 @@ translate_case(Meta, Expr, Opts, S) ->
274274
{TClauses, SC} = elixir_erl_clauses:clauses(Clauses, SE),
275275
{{'case', ?ann(Meta), TExpr, TClauses}, SC}.
276276

277-
translate_list([{'|', _, [_, _]=Args}], Acc, List) ->
277+
translate_list([{'|', _, [_, _]=Args}], Acc, List, Ann) ->
278278
{[TLeft, TRight], TAcc} = lists:mapfoldl(fun translate/2, Acc, Args),
279-
{build_list([TLeft | List], TRight), TAcc};
280-
translate_list([H | T], Acc, List) ->
279+
TAnn = if Ann == 0 -> binary_ann(TLeft, TRight); true -> Ann end,
280+
{build_list([TLeft | List], TRight, TAnn), TAcc};
281+
translate_list([H | T], Acc, List, Ann) ->
281282
{TH, TAcc} = translate(H, Acc),
282-
translate_list(T, TAcc, [TH | List]);
283-
translate_list([], Acc, List) ->
284-
{build_list(List, {nil, 0}), Acc}.
285-
286-
build_list([H | T], Acc) ->
287-
build_list(T, {cons, 0, H, Acc});
288-
build_list([], Acc) ->
283+
TAnn = if Ann == 0 -> element(2, TH); true -> Ann end,
284+
translate_list(T, TAcc, [TH | List], TAnn);
285+
translate_list([], Acc, List, Ann) ->
286+
{build_list(List, {nil, 0}, Ann), Acc}.
287+
288+
build_list([H | T], Acc, Ann) ->
289+
build_list(T, {cons, Ann, H, Acc}, Ann);
290+
build_list([], Acc, _Ann) ->
289291
Acc.
290292

293+
binary_ann(Left, Right) ->
294+
AnnLeft = element(2, Right),
295+
AnnRight = element(2, Left),
296+
297+
if
298+
AnnLeft /= 0 -> AnnLeft;
299+
AnnRight /= 0 -> AnnRight;
300+
true -> 0
301+
end.
302+
291303
%% Pack a list of expressions from a block.
292304
unblock({'block', _, Exprs}) -> Exprs;
293305
unblock(Expr) -> [Expr].

lib/elixir/test/elixir/kernel/parser_test.exs

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -780,6 +780,32 @@ defmodule Kernel.ParserTest do
780780
end
781781
end
782782

783+
describe "down to Erlang" do
784+
test "contains of non-literals" do
785+
assert to_erl!("{:ok, make_ref()}") ==
786+
{:tuple, 1,
787+
[
788+
{:atom, 0, :ok},
789+
{:call, 1, {:remote, 1, {:atom, 0, :erlang}, {:atom, 1, :make_ref}}, []}
790+
]}
791+
792+
assert to_erl!("[:ok, make_ref()]") ==
793+
{:cons, 1, {:atom, 0, :ok},
794+
{:cons, 1,
795+
{:call, 1, {:remote, 1, {:atom, 0, :erlang}, {:atom, 1, :make_ref}}, []},
796+
{nil, 0}}}
797+
end
798+
799+
defp to_erl!(code) do
800+
{expr, _, _} =
801+
code
802+
|> Code.string_to_quoted!()
803+
|> :elixir.quoted_to_erl(:elixir.env_for_eval([]))
804+
805+
expr
806+
end
807+
end
808+
783809
defp parse!(string), do: Code.string_to_quoted!(string)
784810

785811
defp assert_token_missing(given_message, string) do

0 commit comments

Comments
 (0)