From df11a08d933bc0efa754ccb944d1c8997c56ee7d Mon Sep 17 00:00:00 2001 From: Kevin Newton Date: Mon, 21 Aug 2023 18:07:32 -0400 Subject: [PATCH] [ruby/yarp] Add closing_loc to UntilNode https://github.com/ruby/yarp/commit/4362cecc2c --- test/yarp/snapshots/method_calls.txt | 1 + .../seattlerb/parse_until_not_canonical.txt | 1 + .../parse_until_not_noncanonical.txt | 1 + .../unparser/corpus/literal/send.txt | 1 + .../unparser/corpus/literal/while.txt | 12 ++++- .../unparser/corpus/semantic/while.txt | 4 ++ test/yarp/snapshots/until.txt | 6 +++ test/yarp/snapshots/whitequark/until.txt | 2 + test/yarp/snapshots/whitequark/until_mod.txt | 1 + test/yarp/snapshots/whitequark/until_post.txt | 1 + yarp/config.yml | 2 + yarp/yarp.c | 54 ++++++++++--------- 12 files changed, 60 insertions(+), 26 deletions(-) diff --git a/test/yarp/snapshots/method_calls.txt b/test/yarp/snapshots/method_calls.txt index ebda131feb..a6e6709045 100644 --- a/test/yarp/snapshots/method_calls.txt +++ b/test/yarp/snapshots/method_calls.txt @@ -1418,6 +1418,7 @@ ProgramNode(0...1237)( ), UntilNode(1121...1153)( (1121...1126), + (1150...1153), CallNode(1127...1128)( nil, nil, diff --git a/test/yarp/snapshots/seattlerb/parse_until_not_canonical.txt b/test/yarp/snapshots/seattlerb/parse_until_not_canonical.txt index acac8dd857..e84c4bf8a9 100644 --- a/test/yarp/snapshots/seattlerb/parse_until_not_canonical.txt +++ b/test/yarp/snapshots/seattlerb/parse_until_not_canonical.txt @@ -3,6 +3,7 @@ ProgramNode(0...30)( StatementsNode(0...30)( [UntilNode(0...30)( (0...5), + (27...30), CallNode(6...18)( CallNode(10...18)( CallNode(10...13)( diff --git a/test/yarp/snapshots/seattlerb/parse_until_not_noncanonical.txt b/test/yarp/snapshots/seattlerb/parse_until_not_noncanonical.txt index acac8dd857..e84c4bf8a9 100644 --- a/test/yarp/snapshots/seattlerb/parse_until_not_noncanonical.txt +++ b/test/yarp/snapshots/seattlerb/parse_until_not_noncanonical.txt @@ -3,6 +3,7 @@ ProgramNode(0...30)( StatementsNode(0...30)( [UntilNode(0...30)( (0...5), + (27...30), CallNode(6...18)( CallNode(10...18)( CallNode(10...13)( diff --git a/test/yarp/snapshots/unparser/corpus/literal/send.txt b/test/yarp/snapshots/unparser/corpus/literal/send.txt index b448ea3e14..54262865df 100644 --- a/test/yarp/snapshots/unparser/corpus/literal/send.txt +++ b/test/yarp/snapshots/unparser/corpus/literal/send.txt @@ -281,6 +281,7 @@ ProgramNode(0...999)( CallNode(255...272)( UntilNode(255...268)( (255...260), + (265...268), CallNode(261...264)( nil, nil, diff --git a/test/yarp/snapshots/unparser/corpus/literal/while.txt b/test/yarp/snapshots/unparser/corpus/literal/while.txt index dae7e0f0f3..6807dec9e4 100644 --- a/test/yarp/snapshots/unparser/corpus/literal/while.txt +++ b/test/yarp/snapshots/unparser/corpus/literal/while.txt @@ -165,6 +165,7 @@ ProgramNode(0...620)( StatementsNode(159...178)( [UntilNode(159...178)( (169...174), + nil, LocalVariableReadNode(175...178)(:foo, 0), StatementsNode(159...168)( [LocalVariableWriteNode(159...168)( @@ -460,6 +461,7 @@ ProgramNode(0...620)( ), UntilNode(429...460)( (451...456), + nil, CallNode(457...460)( nil, nil, @@ -585,15 +587,23 @@ ProgramNode(0...620)( ), 0 ), - UntilNode(557...572)((557...562), FalseNode(563...568)(), nil, 0), + UntilNode(557...572)( + (557...562), + (569...572), + FalseNode(563...568)(), + nil, + 0 + ), UntilNode(573...592)( (573...578), + (589...592), FalseNode(579...584)(), StatementsNode(587...588)([IntegerNode(587...588)()]), 0 ), UntilNode(593...620)( (593...598), + (617...620), ParenthesesNode(599...608)( StatementsNode(600...607)( [CallNode(600...607)( diff --git a/test/yarp/snapshots/unparser/corpus/semantic/while.txt b/test/yarp/snapshots/unparser/corpus/semantic/while.txt index 148db33da6..171447dc67 100644 --- a/test/yarp/snapshots/unparser/corpus/semantic/while.txt +++ b/test/yarp/snapshots/unparser/corpus/semantic/while.txt @@ -3,6 +3,7 @@ ProgramNode(0...188)( StatementsNode(0...188)( [UntilNode(0...13)( (2...7), + nil, CallNode(8...13)( nil, nil, @@ -21,6 +22,7 @@ ProgramNode(0...188)( ), UntilNode(15...34)( (15...20), + (31...34), CallNode(21...26)( nil, nil, @@ -63,6 +65,7 @@ ProgramNode(0...188)( ), UntilNode(57...75)( (59...64), + nil, AndNode(65...75)( CallNode(65...66)(nil, nil, (65...66), nil, nil, nil, nil, 2, "b"), CallNode(70...75)( @@ -97,6 +100,7 @@ ProgramNode(0...188)( ), UntilNode(98...130)( (100...105), + nil, CallNode(106...130)( nil, nil, diff --git a/test/yarp/snapshots/until.txt b/test/yarp/snapshots/until.txt index 3218ce2d42..6a93708e5b 100644 --- a/test/yarp/snapshots/until.txt +++ b/test/yarp/snapshots/until.txt @@ -3,36 +3,42 @@ ProgramNode(0...109)( StatementsNode(0...109)( [UntilNode(0...18)( (0...5), + (15...18), TrueNode(6...10)(), StatementsNode(12...13)([IntegerNode(12...13)()]), 0 ), UntilNode(20...32)( (22...27), + nil, TrueNode(28...32)(), StatementsNode(20...21)([IntegerNode(20...21)()]), 0 ), UntilNode(34...50)( (40...45), + nil, TrueNode(46...50)(), StatementsNode(34...39)([BreakNode(34...39)(nil, (34...39))]), 0 ), UntilNode(52...67)( (57...62), + nil, TrueNode(63...67)(), StatementsNode(52...56)([NextNode(52...56)(nil, (52...56))]), 0 ), UntilNode(69...86)( (76...81), + nil, TrueNode(82...86)(), StatementsNode(69...75)([ReturnNode(69...75)((69...75), nil)]), 0 ), UntilNode(88...109)( (99...104), + nil, CallNode(105...109)( nil, nil, diff --git a/test/yarp/snapshots/whitequark/until.txt b/test/yarp/snapshots/whitequark/until.txt index 2eae2d5307..5a40a615bd 100644 --- a/test/yarp/snapshots/whitequark/until.txt +++ b/test/yarp/snapshots/whitequark/until.txt @@ -3,6 +3,7 @@ ProgramNode(0...42)( StatementsNode(0...42)( [UntilNode(0...21)( (0...5), + (18...21), CallNode(6...9)(nil, nil, (6...9), nil, nil, nil, nil, 2, "foo"), StatementsNode(13...17)( [CallNode(13...17)( @@ -21,6 +22,7 @@ ProgramNode(0...42)( ), UntilNode(23...42)( (23...28), + (39...42), CallNode(29...32)(nil, nil, (29...32), nil, nil, nil, nil, 2, "foo"), StatementsNode(34...38)( [CallNode(34...38)( diff --git a/test/yarp/snapshots/whitequark/until_mod.txt b/test/yarp/snapshots/whitequark/until_mod.txt index 62f9d4992e..ab5acaf4b3 100644 --- a/test/yarp/snapshots/whitequark/until_mod.txt +++ b/test/yarp/snapshots/whitequark/until_mod.txt @@ -3,6 +3,7 @@ ProgramNode(0...14)( StatementsNode(0...14)( [UntilNode(0...14)( (5...10), + nil, CallNode(11...14)(nil, nil, (11...14), nil, nil, nil, nil, 2, "foo"), StatementsNode(0...4)( [CallNode(0...4)(nil, nil, (0...4), nil, nil, nil, nil, 2, "meth")] diff --git a/test/yarp/snapshots/whitequark/until_post.txt b/test/yarp/snapshots/whitequark/until_post.txt index 27e0a60e40..87a0fa3a12 100644 --- a/test/yarp/snapshots/whitequark/until_post.txt +++ b/test/yarp/snapshots/whitequark/until_post.txt @@ -3,6 +3,7 @@ ProgramNode(0...24)( StatementsNode(0...24)( [UntilNode(0...24)( (15...20), + nil, CallNode(21...24)(nil, nil, (21...24), nil, nil, nil, nil, 2, "foo"), StatementsNode(0...14)( [BeginNode(0...14)( diff --git a/yarp/config.yml b/yarp/config.yml index d7269f336d..d9c0891c7a 100644 --- a/yarp/config.yml +++ b/yarp/config.yml @@ -2141,6 +2141,8 @@ nodes: child_nodes: - name: keyword_loc type: location + - name: closing_loc + type: location? - name: predicate type: node - name: statements diff --git a/yarp/yarp.c b/yarp/yarp.c index 29846998a4..a5981c3d6e 100644 --- a/yarp/yarp.c +++ b/yarp/yarp.c @@ -4209,34 +4209,43 @@ yp_unless_node_end_keyword_loc_set(yp_unless_node_t *node, const yp_token_t *end // Allocate a new UntilNode node. static yp_until_node_t * -yp_until_node_create(yp_parser_t *parser, const yp_token_t *keyword, yp_node_t *predicate, yp_statements_node_t *statements, yp_node_flags_t flags) { +yp_until_node_create(yp_parser_t *parser, const yp_token_t *keyword, const yp_token_t *closing, yp_node_t *predicate, yp_statements_node_t *statements, yp_node_flags_t flags) { yp_until_node_t *node = YP_ALLOC_NODE(parser, yp_until_node_t); - bool has_statements = (statements != NULL) && (statements->body.size != 0); - - const char *start = NULL; - if (has_statements && (keyword->start > statements->base.location.start)) { - start = statements->base.location.start; - } else { - start = keyword->start; - } - - const char *end = NULL; - if (has_statements && (predicate->location.end < statements->base.location.end)) { - end = statements->base.location.end; - } else { - end = predicate->location.end; - } *node = (yp_until_node_t) { { .type = YP_NODE_UNTIL_NODE, .flags = flags, .location = { - .start = start, - .end = end, + .start = keyword->start, + .end = closing->end, }, }, .keyword_loc = YP_LOCATION_TOKEN_VALUE(keyword), + .closing_loc = YP_OPTIONAL_LOCATION_TOKEN_VALUE(closing), + .predicate = predicate, + .statements = statements + }; + + return node; +} + +// Allocate a new UntilNode node. +static yp_until_node_t * +yp_until_node_modifier_create(yp_parser_t *parser, const yp_token_t *keyword, yp_node_t *predicate, yp_statements_node_t *statements, yp_node_flags_t flags) { + yp_until_node_t *node = YP_ALLOC_NODE(parser, yp_until_node_t); + + *node = (yp_until_node_t) { + { + .type = YP_NODE_UNTIL_NODE, + .flags = flags, + .location = { + .start = statements->base.location.start, + .end = predicate->location.end, + }, + }, + .keyword_loc = YP_LOCATION_TOKEN_VALUE(keyword), + .closing_loc = YP_OPTIONAL_LOCATION_NOT_PROVIDED_VALUE, .predicate = predicate, .statements = statements }; @@ -11882,12 +11891,7 @@ parse_expression_prefix(yp_parser_t *parser, yp_binding_power_t binding_power) { expect(parser, YP_TOKEN_KEYWORD_END, "Expected `end` to close `until` statement."); } - yp_until_node_t *until_node = yp_until_node_create(parser, &keyword, predicate, statements, 0); - if (parser->previous.type == YP_TOKEN_KEYWORD_END) { - until_node->base.location.end = parser->previous.end; - } - - return (yp_node_t *) until_node; + return (yp_node_t *) yp_until_node_create(parser, &keyword, &parser->previous, predicate, statements, 0); } case YP_TOKEN_KEYWORD_WHILE: { yp_do_loop_stack_push(parser, true); @@ -13185,7 +13189,7 @@ parse_expression_infix(yp_parser_t *parser, yp_node_t *node, yp_binding_power_t yp_statements_node_body_append(statements, node); yp_node_t *predicate = parse_expression(parser, binding_power, "Expected a predicate after 'until'"); - return (yp_node_t *) yp_until_node_create(parser, &token, predicate, statements, YP_NODE_TYPE_P(node, YP_NODE_BEGIN_NODE) ? YP_LOOP_FLAGS_BEGIN_MODIFIER : 0); + return (yp_node_t *) yp_until_node_modifier_create(parser, &token, predicate, statements, YP_NODE_TYPE_P(node, YP_NODE_BEGIN_NODE) ? YP_LOOP_FLAGS_BEGIN_MODIFIER : 0); } case YP_TOKEN_KEYWORD_WHILE_MODIFIER: { parser_lex(parser);