[ruby/yarp] Add closing_loc to UntilNode
https://github.com/ruby/yarp/commit/4362cecc2c
This commit is contained in:
parent
74780c3e7f
commit
df11a08d93
@ -1418,6 +1418,7 @@ ProgramNode(0...1237)(
|
||||
),
|
||||
UntilNode(1121...1153)(
|
||||
(1121...1126),
|
||||
(1150...1153),
|
||||
CallNode(1127...1128)(
|
||||
nil,
|
||||
nil,
|
||||
|
@ -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)(
|
||||
|
@ -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)(
|
||||
|
@ -281,6 +281,7 @@ ProgramNode(0...999)(
|
||||
CallNode(255...272)(
|
||||
UntilNode(255...268)(
|
||||
(255...260),
|
||||
(265...268),
|
||||
CallNode(261...264)(
|
||||
nil,
|
||||
nil,
|
||||
|
@ -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)(
|
||||
|
@ -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,
|
||||
|
@ -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,
|
||||
|
@ -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)(
|
||||
|
@ -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")]
|
||||
|
@ -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)(
|
||||
|
@ -2141,6 +2141,8 @@ nodes:
|
||||
child_nodes:
|
||||
- name: keyword_loc
|
||||
type: location
|
||||
- name: closing_loc
|
||||
type: location?
|
||||
- name: predicate
|
||||
type: node
|
||||
- name: statements
|
||||
|
54
yarp/yarp.c
54
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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user