[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)(
[: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)(
[],

View File

@ -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,

View File

@ -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),

View File

@ -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),

View File

@ -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),

View File

@ -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),

View File

@ -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,

View File

@ -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),

View File

@ -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,

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) {
{
.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: {