Skip to content

Commit 90e1826

Browse files
committed
Include meta information in blocks from do-end blocks
Closes #14689.
1 parent 02968a4 commit 90e1826

File tree

3 files changed

+37
-43
lines changed

3 files changed

+37
-43
lines changed

lib/elixir/src/elixir_parser.yrl

Lines changed: 18 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -320,13 +320,13 @@ bracket_at_expr -> at_op_eol access_expr bracket_arg :
320320
%% Blocks
321321

322322
do_block -> do_eoe 'end' :
323-
{do_end_meta('$1', '$2'), [[{handle_literal(do, '$1'), {'__block__', [], []}}]]}.
323+
{do_end_meta('$1', '$2'), [[{handle_literal(do, '$1'), {'__block__', meta_from_token('$1'), []}}]]}.
324324
do_block -> do_eoe stab_eoe 'end' :
325-
{do_end_meta('$1', '$3'), [[{handle_literal(do, '$1'), build_stab('$2')}]]}.
325+
{do_end_meta('$1', '$3'), [[{handle_literal(do, '$1'), build_stab('$2', meta_from_token('$1'))}]]}.
326326
do_block -> do_eoe block_list 'end' :
327-
{do_end_meta('$1', '$3'), [[{handle_literal(do, '$1'), {'__block__', [], []}} | '$2']]}.
327+
{do_end_meta('$1', '$3'), [[{handle_literal(do, '$1'), {'__block__', meta_from_token('$1'), []}} | '$2']]}.
328328
do_block -> do_eoe stab_eoe block_list 'end' :
329-
{do_end_meta('$1', '$4'), [[{handle_literal(do, '$1'), build_stab('$2')} | '$3']]}.
329+
{do_end_meta('$1', '$4'), [[{handle_literal(do, '$1'), build_stab('$2', meta_from_token('$1'))} | '$3']]}.
330330

331331
eoe -> eol : '$1'.
332332
eoe -> ';' : '$1'.
@@ -366,7 +366,7 @@ stab_op_eol_and_expr -> stab_op_eol expr : {'$1', '$2'}.
366366
stab_op_eol_and_expr -> stab_op_eol : warn_empty_stab_clause('$1'), {'$1', handle_literal(nil, '$1')}.
367367

368368
block_item -> block_eoe stab_eoe :
369-
{handle_literal(?exprs('$1'), '$1'), build_stab('$2')}.
369+
{handle_literal(?exprs('$1'), '$1'), build_stab('$2', [])}.
370370
block_item -> block_eoe :
371371
{handle_literal(?exprs('$1'), '$1'), {'__block__', [], []}}.
372372

@@ -793,27 +793,21 @@ build_map_update(Left, {Pipe, Struct, Map}, Right, Extra) ->
793793

794794
%% Blocks
795795

796-
build_block(Exprs) -> build_block(Exprs, none).
796+
build_block(Exprs) -> build_block(Exprs, []).
797797

798-
build_block([{unquote_splicing, _, [_]}]=Exprs, BeforeAfter) ->
799-
{'__block__', block_meta(BeforeAfter), Exprs};
800-
build_block([{Op, ExprMeta, Args}], {Before, After}) ->
798+
build_block([{unquote_splicing, _, [_]}]=Exprs, Meta) ->
799+
{'__block__', Meta, Exprs};
800+
build_block([{Op, ExprMeta, Args}], Meta) ->
801801
ExprMetaWithExtra =
802802
case ?token_metadata() of
803-
true ->
804-
ParensEntry = meta_from_token(Before) ++ [{closing, meta_from_token(After)}],
805-
[{parens, ParensEntry} | ExprMeta];
806-
false ->
807-
ExprMeta
803+
true when Meta /= [] -> [{parens, Meta} | ExprMeta];
804+
_ -> ExprMeta
808805
end,
809806
{Op, ExprMetaWithExtra, Args};
810-
build_block([Expr], _BeforeAfter) ->
807+
build_block([Expr], _Meta) ->
811808
Expr;
812-
build_block(Exprs, BeforeAfter) ->
813-
{'__block__', block_meta(BeforeAfter), Exprs}.
814-
815-
block_meta(none) -> [];
816-
block_meta({Before, After}) -> meta_from_token_with_closing(Before, After).
809+
build_block(Exprs, Meta) ->
810+
{'__block__', Meta, Exprs}.
817811

818812
%% Newlines
819813

@@ -1115,17 +1109,17 @@ check_stab([_], Meta) -> error_invalid_stab(Meta);
11151109
check_stab([{'->', Meta, [_, _]} | T], _) -> check_stab(T, Meta);
11161110
check_stab([_ | T], MaybeMeta) -> check_stab(T, MaybeMeta).
11171111

1118-
build_stab(Stab) ->
1112+
build_stab(Stab, BlockMeta) ->
11191113
case check_stab(Stab, none) of
1120-
block -> build_block(reverse(Stab));
1114+
block -> build_block(reverse(Stab), BlockMeta);
11211115
stab -> collect_stab(Stab, [], [])
11221116
end.
11231117

11241118
build_paren_stab(_Before, [{Op, _, [_]}]=Exprs, _After) when ?rearrange_uop(Op) ->
11251119
{'__block__', [], Exprs};
11261120
build_paren_stab(Before, Stab, After) ->
11271121
case check_stab(Stab, none) of
1128-
block -> build_block(reverse(Stab), {Before, After});
1122+
block -> build_block(reverse(Stab), meta_from_token_with_closing(Before, After));
11291123
stab -> handle_literal(collect_stab(Stab, [], []), Before, newlines_pair(Before, After))
11301124
end.
11311125

@@ -1162,7 +1156,7 @@ unwrap_when(Args) ->
11621156
parens_meta({Open, Close}) ->
11631157
case ?token_metadata() of
11641158
true ->
1165-
ParensEntry = meta_from_token(Open) ++ [{closing, meta_from_token(Close)}],
1159+
ParensEntry = [{closing, meta_from_token(Close)} | meta_from_token(Open)],
11661160
[{parens, ParensEntry}];
11671161
false ->
11681162
[]

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

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -78,9 +78,9 @@ defmodule Kernel.ParserTest do
7878
:..//,
7979
[line: 1],
8080
[
81-
{:foo, [line: 1], [[do: {:__block__, [], []}]]},
82-
{:bar, [line: 1], [[do: {:__block__, [], []}]]},
83-
{:baz, [line: 1], [[do: {:__block__, [], []}]]}
81+
{:foo, [line: 1], [[do: {:__block__, [line: 1], []}]]},
82+
{:bar, [line: 1], [[do: {:__block__, [line: 1], []}]]},
83+
{:baz, [line: 1], [[do: {:__block__, [line: 1], []}]]}
8484
]
8585
}
8686
end
@@ -91,7 +91,7 @@ defmodule Kernel.ParserTest do
9191
[line: 1],
9292
[
9393
1,
94-
{:foo, [line: 1], [[do: {:__block__, [], []}]]},
94+
{:foo, [line: 1], [[do: {:__block__, [line: 1], []}]]},
9595
{:bar, [line: 1], [{:bat, [line: 1], nil}]}
9696
]
9797
}
@@ -664,7 +664,7 @@ defmodule Kernel.ParserTest do
664664

665665
assert string_to_quoted.("foo(\n) do\nend") ==
666666
{:foo, [do: [line: 2], end: [line: 3], newlines: 1, closing: [line: 2], line: 1],
667-
[[do: {:__block__, [], []}]]}
667+
[[do: {:__block__, [line: 2], []}]]}
668668

669669
assert string_to_quoted.("foo(\n)(\n)") ==
670670
{{:foo, [newlines: 1, closing: [line: 2], line: 1], []},
@@ -680,7 +680,7 @@ defmodule Kernel.ParserTest do
680680
1,
681681
{:+,
682682
[
683-
parens: [line: 1, column: 5, closing: [line: 1, column: 11]],
683+
parens: [closing: [line: 1, column: 11], line: 1, column: 5],
684684
line: 1,
685685
column: 8
686686
], [2, 3]}
@@ -694,8 +694,8 @@ defmodule Kernel.ParserTest do
694694
1,
695695
{:+,
696696
[
697-
parens: [line: 1, column: 5, closing: [line: 1, column: 13]],
698-
parens: [line: 1, column: 6, closing: [line: 1, column: 12]],
697+
parens: [closing: [line: 1, column: 13], line: 1, column: 5],
698+
parens: [closing: [line: 1, column: 12], line: 1, column: 6],
699699
line: 1,
700700
column: 9
701701
], [2, 3]}
@@ -727,15 +727,15 @@ defmodule Kernel.ParserTest do
727727
file = "()"
728728

729729
assert string_to_quoted.(file) ==
730-
{:__block__, [parens: [line: 1, column: 1, closing: [line: 1, column: 2]]], []}
730+
{:__block__, [parens: [closing: [line: 1, column: 2], line: 1, column: 1]], []}
731731

732732
file = "(())"
733733

734734
assert string_to_quoted.(file) ==
735735
{:__block__,
736736
[
737-
parens: [line: 1, column: 1, closing: [line: 1, column: 4]],
738-
parens: [line: 1, column: 2, closing: [line: 1, column: 3]]
737+
parens: [closing: [line: 1, column: 4], line: 1, column: 1],
738+
parens: [closing: [line: 1, column: 3], line: 1, column: 2]
739739
], []}
740740

741741
file = """
@@ -751,9 +751,9 @@ defmodule Kernel.ParserTest do
751751
{:__block__,
752752
[
753753
end_of_expression: [newlines: 1, line: 6, column: 2],
754-
parens: [line: 1, column: 1, closing: [line: 6, column: 1]],
754+
parens: [closing: [line: 6, column: 1], line: 1, column: 1],
755755
end_of_expression: [newlines: 1, line: 5, column: 4],
756-
parens: [line: 3, column: 3, closing: [line: 5, column: 3]]
756+
parens: [closing: [line: 5, column: 3], line: 3, column: 3]
757757
], []}
758758
end
759759

@@ -765,7 +765,7 @@ defmodule Kernel.ParserTest do
765765
[
766766
{:->,
767767
[
768-
parens: [line: 1, column: 4, closing: [line: 1, column: 5]],
768+
parens: [closing: [line: 1, column: 5], line: 1, column: 4],
769769
line: 1,
770770
column: 7
771771
], [[], {:x, [line: 1, column: 10], nil}]}
@@ -780,7 +780,7 @@ defmodule Kernel.ParserTest do
780780
[
781781
{:->,
782782
[
783-
parens: [line: 1, column: 4, closing: [line: 1, column: 9]],
783+
parens: [closing: [line: 1, column: 9], line: 1, column: 4],
784784
line: 1,
785785
column: 11
786786
],
@@ -808,7 +808,7 @@ defmodule Kernel.ParserTest do
808808
do: [
809809
{:->,
810810
[
811-
parens: [line: 1, column: 12, closing: [line: 1, column: 17]],
811+
parens: [closing: [line: 1, column: 17], line: 1, column: 12],
812812
line: 1,
813813
column: 19
814814
],
@@ -865,7 +865,7 @@ defmodule Kernel.ParserTest do
865865
[
866866
{:__block__,
867867
[
868-
parens: [line: 1, closing: [line: 1]],
868+
parens: [closing: [line: 1], line: 1],
869869
token: "1",
870870
line: 1
871871
], [1]}
@@ -875,7 +875,7 @@ defmodule Kernel.ParserTest do
875875
]}
876876

877877
assert string_to_quoted.("(1)") ==
878-
{:__block__, [parens: [line: 1, closing: [line: 1]], token: "1", line: 1], [1]}
878+
{:__block__, [parens: [closing: [line: 1], line: 1], token: "1", line: 1], [1]}
879879
end
880880

881881
test "adds identifier_location for qualified identifiers" do

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -499,7 +499,7 @@ defmodule Kernel.WarningTest do
499499
)
500500

501501
assert_warn_eval(
502-
["nofile:1\n", message],
502+
["nofile:1:5\n", message],
503503
"""
504504
try do
505505
"oops"

0 commit comments

Comments
 (0)