summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKevin Newton <kddnewton@gmail.com>2023-08-22 13:26:26 -0400
committergit <svn-admin@ruby-lang.org>2023-08-25 21:10:16 +0000
commit0c1a749eef476045e0b098467a564e888ef03c47 (patch)
treeb5f6f395cd6dca1c2e6634f914eb9d3432639a1a
parent20cf9e3ae8ef05d7fc44e2fda8c5b8233e8eb03e (diff)
[ruby/yarp] Fix nested multi assignment locations
https://github.com/ruby/yarp/commit/9a65f002dc
-rw-r--r--test/yarp/snapshots/lambda.txt4
-rw-r--r--test/yarp/snapshots/seattlerb/masgn_double_paren.txt8
-rw-r--r--test/yarp/snapshots/seattlerb/masgn_paren.txt6
-rw-r--r--test/yarp/snapshots/unparser/corpus/literal/assignment.txt40
-rw-r--r--test/yarp/snapshots/unparser/corpus/literal/defined.txt4
-rw-r--r--test/yarp/snapshots/unparser/corpus/literal/send.txt4
-rw-r--r--test/yarp/snapshots/variables.txt2
-rw-r--r--test/yarp/snapshots/whitequark/masgn.txt6
-rw-r--r--test/yarp/snapshots/whitequark/masgn_nested.txt10
-rw-r--r--yarp/yarp.c18
10 files changed, 57 insertions, 45 deletions
diff --git a/test/yarp/snapshots/lambda.txt b/test/yarp/snapshots/lambda.txt
index 0832abf4e8..6640b585c3 100644
--- a/test/yarp/snapshots/lambda.txt
+++ b/test/yarp/snapshots/lambda.txt
@@ -114,6 +114,8 @@ ProgramNode(0...92)(
LambdaNode(53...72)(
[:foo],
(53...55),
+ (66...68),
+ (69...72),
BlockParametersNode(56...65)(
ParametersNode(56...65)(
[],
@@ -148,6 +150,8 @@ ProgramNode(0...92)(
LambdaNode(74...92)(
[:foo],
(74...76),
+ (86...88),
+ (89...92),
BlockParametersNode(77...85)(
ParametersNode(77...85)(
[],
diff --git a/test/yarp/snapshots/seattlerb/masgn_double_paren.txt b/test/yarp/snapshots/seattlerb/masgn_double_paren.txt
index 72f0237aba..3d0c2cf7ab 100644
--- a/test/yarp/snapshots/seattlerb/masgn_double_paren.txt
+++ b/test/yarp/snapshots/seattlerb/masgn_double_paren.txt
@@ -1,8 +1,8 @@
-ProgramNode(2...9)(
+ProgramNode(0...9)(
[:a, :b],
- StatementsNode(2...9)(
- [MultiWriteNode(2...9)(
- [MultiWriteNode(2...5)(
+ StatementsNode(0...9)(
+ [MultiWriteNode(0...9)(
+ [MultiWriteNode(1...6)(
[LocalVariableTargetNode(2...3)(:a, 0),
LocalVariableTargetNode(4...5)(:b, 0)],
nil,
diff --git a/test/yarp/snapshots/seattlerb/masgn_paren.txt b/test/yarp/snapshots/seattlerb/masgn_paren.txt
index 20301dff96..91dd386d8c 100644
--- a/test/yarp/snapshots/seattlerb/masgn_paren.txt
+++ b/test/yarp/snapshots/seattlerb/masgn_paren.txt
@@ -1,7 +1,7 @@
-ProgramNode(1...12)(
+ProgramNode(0...12)(
[:a, :b],
- StatementsNode(1...12)(
- [MultiWriteNode(1...12)(
+ StatementsNode(0...12)(
+ [MultiWriteNode(0...12)(
[LocalVariableTargetNode(1...2)(:a, 0),
LocalVariableTargetNode(4...5)(:b, 0)],
(7...8),
diff --git a/test/yarp/snapshots/unparser/corpus/literal/assignment.txt b/test/yarp/snapshots/unparser/corpus/literal/assignment.txt
index 6ee980d7c0..bcf853886f 100644
--- a/test/yarp/snapshots/unparser/corpus/literal/assignment.txt
+++ b/test/yarp/snapshots/unparser/corpus/literal/assignment.txt
@@ -2,7 +2,7 @@ ProgramNode(0...704)(
[:a, :b, :foo, :c, :x],
StatementsNode(0...704)(
[GlobalVariableWriteNode(0...6)((0...2), (3...4), IntegerNode(5...6)()),
- MultiWriteNode(8...24)(
+ MultiWriteNode(7...24)(
[GlobalVariableTargetNode(8...10)(),
GlobalVariableTargetNode(12...14)()],
(16...17),
@@ -14,8 +14,8 @@ ProgramNode(0...704)(
(7...8),
(14...15)
),
- MultiWriteNode(27...38)(
- [MultiWriteNode(27...29)(
+ MultiWriteNode(25...38)(
+ [MultiWriteNode(26...30)(
[LocalVariableTargetNode(27...28)(:a, 0),
SplatNode(28...29)((28...29), nil)],
nil,
@@ -29,7 +29,7 @@ ProgramNode(0...704)(
(25...26),
(33...34)
),
- MultiWriteNode(40...48)(
+ MultiWriteNode(39...48)(
[SplatNode(40...42)(
(40...41),
LocalVariableTargetNode(41...42)(:a, 0)
@@ -39,7 +39,7 @@ ProgramNode(0...704)(
(39...40),
(42...43)
),
- MultiWriteNode(50...64)(
+ MultiWriteNode(49...64)(
[SplatNode(50...54)(
(50...51),
LocalVariableTargetNode(51...54)(:foo, 0)
@@ -53,7 +53,7 @@ ProgramNode(0...704)(
(49...50),
(54...55)
),
- MultiWriteNode(66...84)(
+ MultiWriteNode(65...84)(
[ClassVariableTargetNode(66...69)(),
ClassVariableTargetNode(71...74)()],
(76...77),
@@ -65,7 +65,7 @@ ProgramNode(0...704)(
(65...66),
(74...75)
),
- MultiWriteNode(86...102)(
+ MultiWriteNode(85...102)(
[InstanceVariableTargetNode(86...88)(),
InstanceVariableTargetNode(90...92)()],
(94...95),
@@ -77,9 +77,9 @@ ProgramNode(0...704)(
(85...86),
(92...93)
),
- MultiWriteNode(104...128)(
+ MultiWriteNode(103...128)(
[LocalVariableTargetNode(104...105)(:a, 0),
- MultiWriteNode(108...113)(
+ MultiWriteNode(107...113)(
[LocalVariableTargetNode(108...109)(:b, 0),
LocalVariableTargetNode(111...112)(:c, 0)],
nil,
@@ -101,7 +101,7 @@ ProgramNode(0...704)(
(103...104),
(113...114)
),
- MultiWriteNode(130...144)(
+ MultiWriteNode(129...144)(
[LocalVariableTargetNode(130...131)(:a, 0),
SplatNode(133...134)((133...134), nil)],
(136...137),
@@ -113,7 +113,7 @@ ProgramNode(0...704)(
(129...130),
(134...135)
),
- MultiWriteNode(146...163)(
+ MultiWriteNode(145...163)(
[LocalVariableTargetNode(146...147)(:a, 0),
SplatNode(149...153)(
(149...150),
@@ -128,7 +128,7 @@ ProgramNode(0...704)(
(145...146),
(153...154)
),
- MultiWriteNode(165...179)(
+ MultiWriteNode(164...179)(
[LocalVariableTargetNode(165...166)(:a, 0),
LocalVariableTargetNode(168...169)(:b, 0)],
(171...172),
@@ -140,7 +140,7 @@ ProgramNode(0...704)(
(164...165),
(169...170)
),
- MultiWriteNode(181...192)(
+ MultiWriteNode(180...192)(
[LocalVariableTargetNode(181...182)(:a, 0),
LocalVariableTargetNode(184...185)(:b, 0)],
(187...188),
@@ -148,7 +148,7 @@ ProgramNode(0...704)(
(180...181),
(185...186)
),
- MultiWriteNode(194...203)(
+ MultiWriteNode(193...203)(
[LocalVariableTargetNode(194...195)(:a, 0),
SplatNode(195...196)((195...196), nil)],
(198...199),
@@ -156,7 +156,7 @@ ProgramNode(0...704)(
(193...194),
(196...197)
),
- MultiWriteNode(205...227)(
+ MultiWriteNode(204...227)(
[CallNode(205...210)(
LocalVariableReadNode(205...206)(:a, 0),
(206...207),
@@ -188,7 +188,7 @@ ProgramNode(0...704)(
(204...205),
(217...218)
),
- MultiWriteNode(229...252)(
+ MultiWriteNode(228...252)(
[CallNode(229...236)(
LocalVariableReadNode(229...230)(:a, 0),
nil,
@@ -225,7 +225,7 @@ ProgramNode(0...704)(
(228...229),
(242...243)
),
- MultiWriteNode(254...274)(
+ MultiWriteNode(253...274)(
[CallNode(254...258)(
LocalVariableReadNode(254...255)(:a, 0),
nil,
@@ -257,7 +257,7 @@ ProgramNode(0...704)(
(253...254),
(264...265)
),
- MultiWriteNode(276...287)(
+ MultiWriteNode(275...287)(
[SplatNode(276...282)(
(276...277),
CallNode(277...282)(
@@ -322,8 +322,8 @@ ProgramNode(0...704)(
:a,
0,
ParenthesesNode(355...367)(
- StatementsNode(357...366)(
- [MultiWriteNode(357...366)(
+ StatementsNode(356...366)(
+ [MultiWriteNode(356...366)(
[LocalVariableTargetNode(357...358)(:b, 0),
LocalVariableTargetNode(360...361)(:c, 0)],
(363...364),
diff --git a/test/yarp/snapshots/unparser/corpus/literal/defined.txt b/test/yarp/snapshots/unparser/corpus/literal/defined.txt
index 7ba02da908..c2d6a71bb1 100644
--- a/test/yarp/snapshots/unparser/corpus/literal/defined.txt
+++ b/test/yarp/snapshots/unparser/corpus/literal/defined.txt
@@ -16,8 +16,8 @@ ProgramNode(0...56)(
DefinedNode(29...56)(
(37...38),
ParenthesesNode(38...55)(
- StatementsNode(40...54)(
- [MultiWriteNode(40...54)(
+ StatementsNode(39...54)(
+ [MultiWriteNode(39...54)(
[LocalVariableTargetNode(40...41)(:a, 0),
LocalVariableTargetNode(43...44)(:b, 0)],
(46...47),
diff --git a/test/yarp/snapshots/unparser/corpus/literal/send.txt b/test/yarp/snapshots/unparser/corpus/literal/send.txt
index ca65b7d58d..1d3cd313b7 100644
--- a/test/yarp/snapshots/unparser/corpus/literal/send.txt
+++ b/test/yarp/snapshots/unparser/corpus/literal/send.txt
@@ -10,8 +10,8 @@ ProgramNode(0...999)(
(11...14),
(15...18),
ParenthesesNode(19...31)(
- StatementsNode(21...30)(
- [MultiWriteNode(21...30)(
+ StatementsNode(20...30)(
+ [MultiWriteNode(20...30)(
[LocalVariableTargetNode(21...22)(:a, 0),
LocalVariableTargetNode(24...25)(:_, 0)],
(27...28),
diff --git a/test/yarp/snapshots/variables.txt b/test/yarp/snapshots/variables.txt
index 5d96122709..35b90dbae3 100644
--- a/test/yarp/snapshots/variables.txt
+++ b/test/yarp/snapshots/variables.txt
@@ -148,7 +148,7 @@ ProgramNode(0...293)(
),
MultiWriteNode(231...258)(
[LocalVariableTargetNode(231...234)(:foo, 0),
- MultiWriteNode(237...246)(
+ MultiWriteNode(236...246)(
[LocalVariableTargetNode(237...240)(:bar, 0),
LocalVariableTargetNode(242...245)(:baz, 0)],
nil,
diff --git a/test/yarp/snapshots/whitequark/masgn.txt b/test/yarp/snapshots/whitequark/masgn.txt
index 466758f3ab..69667e1a38 100644
--- a/test/yarp/snapshots/whitequark/masgn.txt
+++ b/test/yarp/snapshots/whitequark/masgn.txt
@@ -1,7 +1,7 @@
-ProgramNode(1...56)(
+ProgramNode(0...56)(
[:foo, :bar, :baz],
- StatementsNode(1...56)(
- [MultiWriteNode(1...17)(
+ StatementsNode(0...56)(
+ [MultiWriteNode(0...17)(
[LocalVariableTargetNode(1...4)(:foo, 0),
LocalVariableTargetNode(6...9)(:bar, 0)],
(11...12),
diff --git a/test/yarp/snapshots/whitequark/masgn_nested.txt b/test/yarp/snapshots/whitequark/masgn_nested.txt
index 3b08777135..b1601b8aa7 100644
--- a/test/yarp/snapshots/whitequark/masgn_nested.txt
+++ b/test/yarp/snapshots/whitequark/masgn_nested.txt
@@ -1,8 +1,8 @@
-ProgramNode(2...30)(
+ProgramNode(0...30)(
[:b, :a, :c],
- StatementsNode(2...30)(
- [MultiWriteNode(2...13)(
- [MultiWriteNode(2...4)(
+ StatementsNode(0...30)(
+ [MultiWriteNode(0...13)(
+ [MultiWriteNode(1...6)(
[LocalVariableTargetNode(2...3)(:b, 0),
SplatNode(3...4)((3...4), nil)],
nil,
@@ -17,7 +17,7 @@ ProgramNode(2...30)(
),
MultiWriteNode(15...30)(
[LocalVariableTargetNode(15...16)(:a, 0),
- MultiWriteNode(19...24)(
+ MultiWriteNode(18...24)(
[LocalVariableTargetNode(19...20)(:b, 0),
LocalVariableTargetNode(22...23)(:c, 0)],
nil,
diff --git a/yarp/yarp.c b/yarp/yarp.c
index 87d6a16cfa..497a660ed9 100644
--- a/yarp/yarp.c
+++ b/yarp/yarp.c
@@ -3164,7 +3164,10 @@ yp_multi_write_node_create(yp_parser_t *parser, const yp_token_t *operator, yp_n
*node = (yp_multi_write_node_t) {
{
.type = YP_NODE_MULTI_WRITE_NODE,
- .location = { .start = NULL, .end = NULL },
+ .location = {
+ .start = lparen_loc->start,
+ .end = value == NULL ? rparen_loc->end : value->location.end
+ },
},
.operator_loc = YP_OPTIONAL_LOCATION_TOKEN_VALUE(operator),
.value = value,
@@ -8202,6 +8205,8 @@ parse_targets(yp_parser_t *parser, yp_node_t *first_target, yp_binding_power_t b
if (YP_NODE_TYPE_P(child_target, YP_NODE_MULTI_WRITE_NODE)) {
target = (yp_multi_write_node_t *) child_target;
+ target->base.location.start = lparen.start;
+ target->base.location.end = rparen.end;
target->lparen_loc = (yp_location_t) { .start = lparen.start, .end = lparen.end };
target->rparen_loc = (yp_location_t) { .start = rparen.start, .end = rparen.end };
} else {
@@ -8218,6 +8223,7 @@ parse_targets(yp_parser_t *parser, yp_node_t *first_target, yp_binding_power_t b
yp_multi_write_node_targets_append(target, child_target);
}
+ target->base.location.start = lparen.start;
target->base.location.end = rparen.end;
yp_multi_write_node_targets_append(result, (yp_node_t *) target);
}
@@ -10690,10 +10696,8 @@ parse_expression_prefix(yp_parser_t *parser, yp_binding_power_t binding_power) {
}
case YP_TOKEN_PARENTHESIS_LEFT:
case YP_TOKEN_PARENTHESIS_LEFT_PARENTHESES: {
- yp_token_type_t current_token_type = parser->current.type;
+ yp_token_t opening = parser->current;
parser_lex(parser);
-
- yp_token_t opening = parser->previous;
while (accept_any(parser, 2, YP_TOKEN_SEMICOLON, YP_TOKEN_NEWLINE));
// If this is the end of the file or we match a right parenthesis, then
@@ -10712,7 +10716,7 @@ parse_expression_prefix(yp_parser_t *parser, yp_binding_power_t binding_power) {
// If we hit a right parenthesis, then we're done parsing the parentheses
// node, and we can check which kind of node we should return.
if (match_type_p(parser, YP_TOKEN_PARENTHESIS_RIGHT)) {
- if (current_token_type == YP_TOKEN_PARENTHESIS_LEFT_PARENTHESES) {
+ if (opening.type == YP_TOKEN_PARENTHESIS_LEFT_PARENTHESES) {
lex_state_set(parser, YP_LEX_STATE_ENDARG);
}
parser_lex(parser);
@@ -10730,6 +10734,8 @@ parse_expression_prefix(yp_parser_t *parser, yp_binding_power_t binding_power) {
if (multi_statement->lparen_loc.start == NULL) {
multi_write = (yp_multi_write_node_t *) statement;
+ multi_write->base.location.start = lparen_loc.start;
+ multi_write->base.location.end = rparen_loc.end;
multi_write->lparen_loc = lparen_loc;
multi_write->rparen_loc = rparen_loc;
} else {
@@ -10781,6 +10787,8 @@ parse_expression_prefix(yp_parser_t *parser, yp_binding_power_t binding_power) {
yp_accepts_block_stack_pop(parser);
expect(parser, YP_TOKEN_PARENTHESIS_RIGHT, "Expected a closing parenthesis.");
+
+
return (yp_node_t *) yp_parentheses_node_create(parser, &opening, (yp_node_t *) statements, &parser->previous);
}
case YP_TOKEN_BRACE_LEFT: {