[ruby/yarp] Fix nested multi assignment locations

https://github.com/ruby/yarp/commit/9a65f002dc
This commit is contained in:
Kevin Newton 2023-08-22 13:26:26 -04:00 committed by git
parent 20cf9e3ae8
commit 0c1a749eef
10 changed files with 57 additions and 45 deletions

View File

@ -114,6 +114,8 @@ ProgramNode(0...92)(
LambdaNode(53...72)( LambdaNode(53...72)(
[:foo], [:foo],
(53...55), (53...55),
(66...68),
(69...72),
BlockParametersNode(56...65)( BlockParametersNode(56...65)(
ParametersNode(56...65)( ParametersNode(56...65)(
[], [],
@ -148,6 +150,8 @@ ProgramNode(0...92)(
LambdaNode(74...92)( LambdaNode(74...92)(
[:foo], [:foo],
(74...76), (74...76),
(86...88),
(89...92),
BlockParametersNode(77...85)( BlockParametersNode(77...85)(
ParametersNode(77...85)( ParametersNode(77...85)(
[], [],

View File

@ -1,8 +1,8 @@
ProgramNode(2...9)( ProgramNode(0...9)(
[:a, :b], [:a, :b],
StatementsNode(2...9)( StatementsNode(0...9)(
[MultiWriteNode(2...9)( [MultiWriteNode(0...9)(
[MultiWriteNode(2...5)( [MultiWriteNode(1...6)(
[LocalVariableTargetNode(2...3)(:a, 0), [LocalVariableTargetNode(2...3)(:a, 0),
LocalVariableTargetNode(4...5)(:b, 0)], LocalVariableTargetNode(4...5)(:b, 0)],
nil, nil,

View File

@ -1,7 +1,7 @@
ProgramNode(1...12)( ProgramNode(0...12)(
[:a, :b], [:a, :b],
StatementsNode(1...12)( StatementsNode(0...12)(
[MultiWriteNode(1...12)( [MultiWriteNode(0...12)(
[LocalVariableTargetNode(1...2)(:a, 0), [LocalVariableTargetNode(1...2)(:a, 0),
LocalVariableTargetNode(4...5)(:b, 0)], LocalVariableTargetNode(4...5)(:b, 0)],
(7...8), (7...8),

View File

@ -2,7 +2,7 @@ ProgramNode(0...704)(
[:a, :b, :foo, :c, :x], [:a, :b, :foo, :c, :x],
StatementsNode(0...704)( StatementsNode(0...704)(
[GlobalVariableWriteNode(0...6)((0...2), (3...4), IntegerNode(5...6)()), [GlobalVariableWriteNode(0...6)((0...2), (3...4), IntegerNode(5...6)()),
MultiWriteNode(8...24)( MultiWriteNode(7...24)(
[GlobalVariableTargetNode(8...10)(), [GlobalVariableTargetNode(8...10)(),
GlobalVariableTargetNode(12...14)()], GlobalVariableTargetNode(12...14)()],
(16...17), (16...17),
@ -14,8 +14,8 @@ ProgramNode(0...704)(
(7...8), (7...8),
(14...15) (14...15)
), ),
MultiWriteNode(27...38)( MultiWriteNode(25...38)(
[MultiWriteNode(27...29)( [MultiWriteNode(26...30)(
[LocalVariableTargetNode(27...28)(:a, 0), [LocalVariableTargetNode(27...28)(:a, 0),
SplatNode(28...29)((28...29), nil)], SplatNode(28...29)((28...29), nil)],
nil, nil,
@ -29,7 +29,7 @@ ProgramNode(0...704)(
(25...26), (25...26),
(33...34) (33...34)
), ),
MultiWriteNode(40...48)( MultiWriteNode(39...48)(
[SplatNode(40...42)( [SplatNode(40...42)(
(40...41), (40...41),
LocalVariableTargetNode(41...42)(:a, 0) LocalVariableTargetNode(41...42)(:a, 0)
@ -39,7 +39,7 @@ ProgramNode(0...704)(
(39...40), (39...40),
(42...43) (42...43)
), ),
MultiWriteNode(50...64)( MultiWriteNode(49...64)(
[SplatNode(50...54)( [SplatNode(50...54)(
(50...51), (50...51),
LocalVariableTargetNode(51...54)(:foo, 0) LocalVariableTargetNode(51...54)(:foo, 0)
@ -53,7 +53,7 @@ ProgramNode(0...704)(
(49...50), (49...50),
(54...55) (54...55)
), ),
MultiWriteNode(66...84)( MultiWriteNode(65...84)(
[ClassVariableTargetNode(66...69)(), [ClassVariableTargetNode(66...69)(),
ClassVariableTargetNode(71...74)()], ClassVariableTargetNode(71...74)()],
(76...77), (76...77),
@ -65,7 +65,7 @@ ProgramNode(0...704)(
(65...66), (65...66),
(74...75) (74...75)
), ),
MultiWriteNode(86...102)( MultiWriteNode(85...102)(
[InstanceVariableTargetNode(86...88)(), [InstanceVariableTargetNode(86...88)(),
InstanceVariableTargetNode(90...92)()], InstanceVariableTargetNode(90...92)()],
(94...95), (94...95),
@ -77,9 +77,9 @@ ProgramNode(0...704)(
(85...86), (85...86),
(92...93) (92...93)
), ),
MultiWriteNode(104...128)( MultiWriteNode(103...128)(
[LocalVariableTargetNode(104...105)(:a, 0), [LocalVariableTargetNode(104...105)(:a, 0),
MultiWriteNode(108...113)( MultiWriteNode(107...113)(
[LocalVariableTargetNode(108...109)(:b, 0), [LocalVariableTargetNode(108...109)(:b, 0),
LocalVariableTargetNode(111...112)(:c, 0)], LocalVariableTargetNode(111...112)(:c, 0)],
nil, nil,
@ -101,7 +101,7 @@ ProgramNode(0...704)(
(103...104), (103...104),
(113...114) (113...114)
), ),
MultiWriteNode(130...144)( MultiWriteNode(129...144)(
[LocalVariableTargetNode(130...131)(:a, 0), [LocalVariableTargetNode(130...131)(:a, 0),
SplatNode(133...134)((133...134), nil)], SplatNode(133...134)((133...134), nil)],
(136...137), (136...137),
@ -113,7 +113,7 @@ ProgramNode(0...704)(
(129...130), (129...130),
(134...135) (134...135)
), ),
MultiWriteNode(146...163)( MultiWriteNode(145...163)(
[LocalVariableTargetNode(146...147)(:a, 0), [LocalVariableTargetNode(146...147)(:a, 0),
SplatNode(149...153)( SplatNode(149...153)(
(149...150), (149...150),
@ -128,7 +128,7 @@ ProgramNode(0...704)(
(145...146), (145...146),
(153...154) (153...154)
), ),
MultiWriteNode(165...179)( MultiWriteNode(164...179)(
[LocalVariableTargetNode(165...166)(:a, 0), [LocalVariableTargetNode(165...166)(:a, 0),
LocalVariableTargetNode(168...169)(:b, 0)], LocalVariableTargetNode(168...169)(:b, 0)],
(171...172), (171...172),
@ -140,7 +140,7 @@ ProgramNode(0...704)(
(164...165), (164...165),
(169...170) (169...170)
), ),
MultiWriteNode(181...192)( MultiWriteNode(180...192)(
[LocalVariableTargetNode(181...182)(:a, 0), [LocalVariableTargetNode(181...182)(:a, 0),
LocalVariableTargetNode(184...185)(:b, 0)], LocalVariableTargetNode(184...185)(:b, 0)],
(187...188), (187...188),
@ -148,7 +148,7 @@ ProgramNode(0...704)(
(180...181), (180...181),
(185...186) (185...186)
), ),
MultiWriteNode(194...203)( MultiWriteNode(193...203)(
[LocalVariableTargetNode(194...195)(:a, 0), [LocalVariableTargetNode(194...195)(:a, 0),
SplatNode(195...196)((195...196), nil)], SplatNode(195...196)((195...196), nil)],
(198...199), (198...199),
@ -156,7 +156,7 @@ ProgramNode(0...704)(
(193...194), (193...194),
(196...197) (196...197)
), ),
MultiWriteNode(205...227)( MultiWriteNode(204...227)(
[CallNode(205...210)( [CallNode(205...210)(
LocalVariableReadNode(205...206)(:a, 0), LocalVariableReadNode(205...206)(:a, 0),
(206...207), (206...207),
@ -188,7 +188,7 @@ ProgramNode(0...704)(
(204...205), (204...205),
(217...218) (217...218)
), ),
MultiWriteNode(229...252)( MultiWriteNode(228...252)(
[CallNode(229...236)( [CallNode(229...236)(
LocalVariableReadNode(229...230)(:a, 0), LocalVariableReadNode(229...230)(:a, 0),
nil, nil,
@ -225,7 +225,7 @@ ProgramNode(0...704)(
(228...229), (228...229),
(242...243) (242...243)
), ),
MultiWriteNode(254...274)( MultiWriteNode(253...274)(
[CallNode(254...258)( [CallNode(254...258)(
LocalVariableReadNode(254...255)(:a, 0), LocalVariableReadNode(254...255)(:a, 0),
nil, nil,
@ -257,7 +257,7 @@ ProgramNode(0...704)(
(253...254), (253...254),
(264...265) (264...265)
), ),
MultiWriteNode(276...287)( MultiWriteNode(275...287)(
[SplatNode(276...282)( [SplatNode(276...282)(
(276...277), (276...277),
CallNode(277...282)( CallNode(277...282)(
@ -322,8 +322,8 @@ ProgramNode(0...704)(
:a, :a,
0, 0,
ParenthesesNode(355...367)( ParenthesesNode(355...367)(
StatementsNode(357...366)( StatementsNode(356...366)(
[MultiWriteNode(357...366)( [MultiWriteNode(356...366)(
[LocalVariableTargetNode(357...358)(:b, 0), [LocalVariableTargetNode(357...358)(:b, 0),
LocalVariableTargetNode(360...361)(:c, 0)], LocalVariableTargetNode(360...361)(:c, 0)],
(363...364), (363...364),

View File

@ -16,8 +16,8 @@ ProgramNode(0...56)(
DefinedNode(29...56)( DefinedNode(29...56)(
(37...38), (37...38),
ParenthesesNode(38...55)( ParenthesesNode(38...55)(
StatementsNode(40...54)( StatementsNode(39...54)(
[MultiWriteNode(40...54)( [MultiWriteNode(39...54)(
[LocalVariableTargetNode(40...41)(:a, 0), [LocalVariableTargetNode(40...41)(:a, 0),
LocalVariableTargetNode(43...44)(:b, 0)], LocalVariableTargetNode(43...44)(:b, 0)],
(46...47), (46...47),

View File

@ -10,8 +10,8 @@ ProgramNode(0...999)(
(11...14), (11...14),
(15...18), (15...18),
ParenthesesNode(19...31)( ParenthesesNode(19...31)(
StatementsNode(21...30)( StatementsNode(20...30)(
[MultiWriteNode(21...30)( [MultiWriteNode(20...30)(
[LocalVariableTargetNode(21...22)(:a, 0), [LocalVariableTargetNode(21...22)(:a, 0),
LocalVariableTargetNode(24...25)(:_, 0)], LocalVariableTargetNode(24...25)(:_, 0)],
(27...28), (27...28),

View File

@ -148,7 +148,7 @@ ProgramNode(0...293)(
), ),
MultiWriteNode(231...258)( MultiWriteNode(231...258)(
[LocalVariableTargetNode(231...234)(:foo, 0), [LocalVariableTargetNode(231...234)(:foo, 0),
MultiWriteNode(237...246)( MultiWriteNode(236...246)(
[LocalVariableTargetNode(237...240)(:bar, 0), [LocalVariableTargetNode(237...240)(:bar, 0),
LocalVariableTargetNode(242...245)(:baz, 0)], LocalVariableTargetNode(242...245)(:baz, 0)],
nil, nil,

View File

@ -1,7 +1,7 @@
ProgramNode(1...56)( ProgramNode(0...56)(
[:foo, :bar, :baz], [:foo, :bar, :baz],
StatementsNode(1...56)( StatementsNode(0...56)(
[MultiWriteNode(1...17)( [MultiWriteNode(0...17)(
[LocalVariableTargetNode(1...4)(:foo, 0), [LocalVariableTargetNode(1...4)(:foo, 0),
LocalVariableTargetNode(6...9)(:bar, 0)], LocalVariableTargetNode(6...9)(:bar, 0)],
(11...12), (11...12),

View File

@ -1,8 +1,8 @@
ProgramNode(2...30)( ProgramNode(0...30)(
[:b, :a, :c], [:b, :a, :c],
StatementsNode(2...30)( StatementsNode(0...30)(
[MultiWriteNode(2...13)( [MultiWriteNode(0...13)(
[MultiWriteNode(2...4)( [MultiWriteNode(1...6)(
[LocalVariableTargetNode(2...3)(:b, 0), [LocalVariableTargetNode(2...3)(:b, 0),
SplatNode(3...4)((3...4), nil)], SplatNode(3...4)((3...4), nil)],
nil, nil,
@ -17,7 +17,7 @@ ProgramNode(2...30)(
), ),
MultiWriteNode(15...30)( MultiWriteNode(15...30)(
[LocalVariableTargetNode(15...16)(:a, 0), [LocalVariableTargetNode(15...16)(:a, 0),
MultiWriteNode(19...24)( MultiWriteNode(18...24)(
[LocalVariableTargetNode(19...20)(:b, 0), [LocalVariableTargetNode(19...20)(:b, 0),
LocalVariableTargetNode(22...23)(:c, 0)], LocalVariableTargetNode(22...23)(:c, 0)],
nil, nil,

View File

@ -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) { *node = (yp_multi_write_node_t) {
{ {
.type = YP_NODE_MULTI_WRITE_NODE, .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), .operator_loc = YP_OPTIONAL_LOCATION_TOKEN_VALUE(operator),
.value = value, .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)) { if (YP_NODE_TYPE_P(child_target, YP_NODE_MULTI_WRITE_NODE)) {
target = (yp_multi_write_node_t *) child_target; 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->lparen_loc = (yp_location_t) { .start = lparen.start, .end = lparen.end };
target->rparen_loc = (yp_location_t) { .start = rparen.start, .end = rparen.end }; target->rparen_loc = (yp_location_t) { .start = rparen.start, .end = rparen.end };
} else { } 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); yp_multi_write_node_targets_append(target, child_target);
} }
target->base.location.start = lparen.start;
target->base.location.end = rparen.end; target->base.location.end = rparen.end;
yp_multi_write_node_targets_append(result, (yp_node_t *) target); 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:
case YP_TOKEN_PARENTHESIS_LEFT_PARENTHESES: { 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); parser_lex(parser);
yp_token_t opening = parser->previous;
while (accept_any(parser, 2, YP_TOKEN_SEMICOLON, YP_TOKEN_NEWLINE)); 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 // 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 // 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. // node, and we can check which kind of node we should return.
if (match_type_p(parser, YP_TOKEN_PARENTHESIS_RIGHT)) { 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); lex_state_set(parser, YP_LEX_STATE_ENDARG);
} }
parser_lex(parser); 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) { if (multi_statement->lparen_loc.start == NULL) {
multi_write = (yp_multi_write_node_t *) statement; 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->lparen_loc = lparen_loc;
multi_write->rparen_loc = rparen_loc; multi_write->rparen_loc = rparen_loc;
} else { } else {
@ -10781,6 +10787,8 @@ parse_expression_prefix(yp_parser_t *parser, yp_binding_power_t binding_power) {
yp_accepts_block_stack_pop(parser); yp_accepts_block_stack_pop(parser);
expect(parser, YP_TOKEN_PARENTHESIS_RIGHT, "Expected a closing parenthesis."); 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); return (yp_node_t *) yp_parentheses_node_create(parser, &opening, (yp_node_t *) statements, &parser->previous);
} }
case YP_TOKEN_BRACE_LEFT: { case YP_TOKEN_BRACE_LEFT: {