[ruby/yarp] Fix nested multi assignment locations
https://github.com/ruby/yarp/commit/9a65f002dc
This commit is contained in:
parent
20cf9e3ae8
commit
0c1a749eef
@ -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)(
|
||||
[],
|
||||
|
@ -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,
|
||||
|
@ -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),
|
||||
|
@ -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),
|
||||
|
@ -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),
|
||||
|
@ -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),
|
||||
|
@ -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,
|
||||
|
@ -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),
|
||||
|
@ -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,
|
||||
|
18
yarp/yarp.c
18
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: {
|
||||
|
Loading…
x
Reference in New Issue
Block a user