[ruby/yarp] Add closing_loc to UntilNode

https://github.com/ruby/yarp/commit/4362cecc2c
This commit is contained in:
Kevin Newton 2023-08-21 18:07:32 -04:00 committed by git
parent 74780c3e7f
commit df11a08d93
12 changed files with 60 additions and 26 deletions

View File

@ -1418,6 +1418,7 @@ ProgramNode(0...1237)(
),
UntilNode(1121...1153)(
(1121...1126),
(1150...1153),
CallNode(1127...1128)(
nil,
nil,

View File

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

View File

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

View File

@ -281,6 +281,7 @@ ProgramNode(0...999)(
CallNode(255...272)(
UntilNode(255...268)(
(255...260),
(265...268),
CallNode(261...264)(
nil,
nil,

View File

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

View File

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

View File

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

View File

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

View File

@ -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")]

View File

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

View File

@ -2141,6 +2141,8 @@ nodes:
child_nodes:
- name: keyword_loc
type: location
- name: closing_loc
type: location?
- name: predicate
type: node
- name: statements

View File

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