summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKevin Newton <kddnewton@gmail.com>2023-08-21 18:07:32 -0400
committergit <svn-admin@ruby-lang.org>2023-08-25 21:10:11 +0000
commitdf11a08d933bc0efa754ccb944d1c8997c56ee7d (patch)
tree12d21508d5a4b6727ff0d41a6cbe7973bb09d4ee
parent74780c3e7f58e2c098f11f481c9ea0302a6a05de (diff)
[ruby/yarp] Add closing_loc to UntilNode
https://github.com/ruby/yarp/commit/4362cecc2c
-rw-r--r--test/yarp/snapshots/method_calls.txt1
-rw-r--r--test/yarp/snapshots/seattlerb/parse_until_not_canonical.txt1
-rw-r--r--test/yarp/snapshots/seattlerb/parse_until_not_noncanonical.txt1
-rw-r--r--test/yarp/snapshots/unparser/corpus/literal/send.txt1
-rw-r--r--test/yarp/snapshots/unparser/corpus/literal/while.txt12
-rw-r--r--test/yarp/snapshots/unparser/corpus/semantic/while.txt4
-rw-r--r--test/yarp/snapshots/until.txt6
-rw-r--r--test/yarp/snapshots/whitequark/until.txt2
-rw-r--r--test/yarp/snapshots/whitequark/until_mod.txt1
-rw-r--r--test/yarp/snapshots/whitequark/until_post.txt1
-rw-r--r--yarp/config.yml2
-rw-r--r--yarp/yarp.c50
12 files changed, 58 insertions, 24 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;
- }
+ *node = (yp_until_node_t) {
+ {
+ .type = YP_NODE_UNTIL_NODE,
+ .flags = flags,
+ .location = {
+ .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
+ };
- const char *end = NULL;
- if (has_statements && (predicate->location.end < statements->base.location.end)) {
- end = statements->base.location.end;
- } else {
- end = predicate->location.end;
- }
+ 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 = start,
- .end = end,
+ .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);