From 0c1a749eef476045e0b098467a564e888ef03c47 Mon Sep 17 00:00:00 2001 From: Kevin Newton Date: Tue, 22 Aug 2023 13:26:26 -0400 Subject: [PATCH] [ruby/yarp] Fix nested multi assignment locations https://github.com/ruby/yarp/commit/9a65f002dc --- test/yarp/snapshots/lambda.txt | 4 ++ .../seattlerb/masgn_double_paren.txt | 8 ++-- test/yarp/snapshots/seattlerb/masgn_paren.txt | 6 +-- .../unparser/corpus/literal/assignment.txt | 40 +++++++++---------- .../unparser/corpus/literal/defined.txt | 4 +- .../unparser/corpus/literal/send.txt | 4 +- test/yarp/snapshots/variables.txt | 2 +- test/yarp/snapshots/whitequark/masgn.txt | 6 +-- .../snapshots/whitequark/masgn_nested.txt | 10 ++--- yarp/yarp.c | 18 ++++++--- 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: {