[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)(
|
UntilNode(1121...1153)(
|
||||||
(1121...1126),
|
(1121...1126),
|
||||||
|
(1150...1153),
|
||||||
CallNode(1127...1128)(
|
CallNode(1127...1128)(
|
||||||
nil,
|
nil,
|
||||||
nil,
|
nil,
|
||||||
|
@ -3,6 +3,7 @@ ProgramNode(0...30)(
|
|||||||
StatementsNode(0...30)(
|
StatementsNode(0...30)(
|
||||||
[UntilNode(0...30)(
|
[UntilNode(0...30)(
|
||||||
(0...5),
|
(0...5),
|
||||||
|
(27...30),
|
||||||
CallNode(6...18)(
|
CallNode(6...18)(
|
||||||
CallNode(10...18)(
|
CallNode(10...18)(
|
||||||
CallNode(10...13)(
|
CallNode(10...13)(
|
||||||
|
@ -3,6 +3,7 @@ ProgramNode(0...30)(
|
|||||||
StatementsNode(0...30)(
|
StatementsNode(0...30)(
|
||||||
[UntilNode(0...30)(
|
[UntilNode(0...30)(
|
||||||
(0...5),
|
(0...5),
|
||||||
|
(27...30),
|
||||||
CallNode(6...18)(
|
CallNode(6...18)(
|
||||||
CallNode(10...18)(
|
CallNode(10...18)(
|
||||||
CallNode(10...13)(
|
CallNode(10...13)(
|
||||||
|
@ -281,6 +281,7 @@ ProgramNode(0...999)(
|
|||||||
CallNode(255...272)(
|
CallNode(255...272)(
|
||||||
UntilNode(255...268)(
|
UntilNode(255...268)(
|
||||||
(255...260),
|
(255...260),
|
||||||
|
(265...268),
|
||||||
CallNode(261...264)(
|
CallNode(261...264)(
|
||||||
nil,
|
nil,
|
||||||
nil,
|
nil,
|
||||||
|
@ -165,6 +165,7 @@ ProgramNode(0...620)(
|
|||||||
StatementsNode(159...178)(
|
StatementsNode(159...178)(
|
||||||
[UntilNode(159...178)(
|
[UntilNode(159...178)(
|
||||||
(169...174),
|
(169...174),
|
||||||
|
nil,
|
||||||
LocalVariableReadNode(175...178)(:foo, 0),
|
LocalVariableReadNode(175...178)(:foo, 0),
|
||||||
StatementsNode(159...168)(
|
StatementsNode(159...168)(
|
||||||
[LocalVariableWriteNode(159...168)(
|
[LocalVariableWriteNode(159...168)(
|
||||||
@ -460,6 +461,7 @@ ProgramNode(0...620)(
|
|||||||
),
|
),
|
||||||
UntilNode(429...460)(
|
UntilNode(429...460)(
|
||||||
(451...456),
|
(451...456),
|
||||||
|
nil,
|
||||||
CallNode(457...460)(
|
CallNode(457...460)(
|
||||||
nil,
|
nil,
|
||||||
nil,
|
nil,
|
||||||
@ -585,15 +587,23 @@ ProgramNode(0...620)(
|
|||||||
),
|
),
|
||||||
0
|
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)(
|
UntilNode(573...592)(
|
||||||
(573...578),
|
(573...578),
|
||||||
|
(589...592),
|
||||||
FalseNode(579...584)(),
|
FalseNode(579...584)(),
|
||||||
StatementsNode(587...588)([IntegerNode(587...588)()]),
|
StatementsNode(587...588)([IntegerNode(587...588)()]),
|
||||||
0
|
0
|
||||||
),
|
),
|
||||||
UntilNode(593...620)(
|
UntilNode(593...620)(
|
||||||
(593...598),
|
(593...598),
|
||||||
|
(617...620),
|
||||||
ParenthesesNode(599...608)(
|
ParenthesesNode(599...608)(
|
||||||
StatementsNode(600...607)(
|
StatementsNode(600...607)(
|
||||||
[CallNode(600...607)(
|
[CallNode(600...607)(
|
||||||
|
@ -3,6 +3,7 @@ ProgramNode(0...188)(
|
|||||||
StatementsNode(0...188)(
|
StatementsNode(0...188)(
|
||||||
[UntilNode(0...13)(
|
[UntilNode(0...13)(
|
||||||
(2...7),
|
(2...7),
|
||||||
|
nil,
|
||||||
CallNode(8...13)(
|
CallNode(8...13)(
|
||||||
nil,
|
nil,
|
||||||
nil,
|
nil,
|
||||||
@ -21,6 +22,7 @@ ProgramNode(0...188)(
|
|||||||
),
|
),
|
||||||
UntilNode(15...34)(
|
UntilNode(15...34)(
|
||||||
(15...20),
|
(15...20),
|
||||||
|
(31...34),
|
||||||
CallNode(21...26)(
|
CallNode(21...26)(
|
||||||
nil,
|
nil,
|
||||||
nil,
|
nil,
|
||||||
@ -63,6 +65,7 @@ ProgramNode(0...188)(
|
|||||||
),
|
),
|
||||||
UntilNode(57...75)(
|
UntilNode(57...75)(
|
||||||
(59...64),
|
(59...64),
|
||||||
|
nil,
|
||||||
AndNode(65...75)(
|
AndNode(65...75)(
|
||||||
CallNode(65...66)(nil, nil, (65...66), nil, nil, nil, nil, 2, "b"),
|
CallNode(65...66)(nil, nil, (65...66), nil, nil, nil, nil, 2, "b"),
|
||||||
CallNode(70...75)(
|
CallNode(70...75)(
|
||||||
@ -97,6 +100,7 @@ ProgramNode(0...188)(
|
|||||||
),
|
),
|
||||||
UntilNode(98...130)(
|
UntilNode(98...130)(
|
||||||
(100...105),
|
(100...105),
|
||||||
|
nil,
|
||||||
CallNode(106...130)(
|
CallNode(106...130)(
|
||||||
nil,
|
nil,
|
||||||
nil,
|
nil,
|
||||||
|
@ -3,36 +3,42 @@ ProgramNode(0...109)(
|
|||||||
StatementsNode(0...109)(
|
StatementsNode(0...109)(
|
||||||
[UntilNode(0...18)(
|
[UntilNode(0...18)(
|
||||||
(0...5),
|
(0...5),
|
||||||
|
(15...18),
|
||||||
TrueNode(6...10)(),
|
TrueNode(6...10)(),
|
||||||
StatementsNode(12...13)([IntegerNode(12...13)()]),
|
StatementsNode(12...13)([IntegerNode(12...13)()]),
|
||||||
0
|
0
|
||||||
),
|
),
|
||||||
UntilNode(20...32)(
|
UntilNode(20...32)(
|
||||||
(22...27),
|
(22...27),
|
||||||
|
nil,
|
||||||
TrueNode(28...32)(),
|
TrueNode(28...32)(),
|
||||||
StatementsNode(20...21)([IntegerNode(20...21)()]),
|
StatementsNode(20...21)([IntegerNode(20...21)()]),
|
||||||
0
|
0
|
||||||
),
|
),
|
||||||
UntilNode(34...50)(
|
UntilNode(34...50)(
|
||||||
(40...45),
|
(40...45),
|
||||||
|
nil,
|
||||||
TrueNode(46...50)(),
|
TrueNode(46...50)(),
|
||||||
StatementsNode(34...39)([BreakNode(34...39)(nil, (34...39))]),
|
StatementsNode(34...39)([BreakNode(34...39)(nil, (34...39))]),
|
||||||
0
|
0
|
||||||
),
|
),
|
||||||
UntilNode(52...67)(
|
UntilNode(52...67)(
|
||||||
(57...62),
|
(57...62),
|
||||||
|
nil,
|
||||||
TrueNode(63...67)(),
|
TrueNode(63...67)(),
|
||||||
StatementsNode(52...56)([NextNode(52...56)(nil, (52...56))]),
|
StatementsNode(52...56)([NextNode(52...56)(nil, (52...56))]),
|
||||||
0
|
0
|
||||||
),
|
),
|
||||||
UntilNode(69...86)(
|
UntilNode(69...86)(
|
||||||
(76...81),
|
(76...81),
|
||||||
|
nil,
|
||||||
TrueNode(82...86)(),
|
TrueNode(82...86)(),
|
||||||
StatementsNode(69...75)([ReturnNode(69...75)((69...75), nil)]),
|
StatementsNode(69...75)([ReturnNode(69...75)((69...75), nil)]),
|
||||||
0
|
0
|
||||||
),
|
),
|
||||||
UntilNode(88...109)(
|
UntilNode(88...109)(
|
||||||
(99...104),
|
(99...104),
|
||||||
|
nil,
|
||||||
CallNode(105...109)(
|
CallNode(105...109)(
|
||||||
nil,
|
nil,
|
||||||
nil,
|
nil,
|
||||||
|
@ -3,6 +3,7 @@ ProgramNode(0...42)(
|
|||||||
StatementsNode(0...42)(
|
StatementsNode(0...42)(
|
||||||
[UntilNode(0...21)(
|
[UntilNode(0...21)(
|
||||||
(0...5),
|
(0...5),
|
||||||
|
(18...21),
|
||||||
CallNode(6...9)(nil, nil, (6...9), nil, nil, nil, nil, 2, "foo"),
|
CallNode(6...9)(nil, nil, (6...9), nil, nil, nil, nil, 2, "foo"),
|
||||||
StatementsNode(13...17)(
|
StatementsNode(13...17)(
|
||||||
[CallNode(13...17)(
|
[CallNode(13...17)(
|
||||||
@ -21,6 +22,7 @@ ProgramNode(0...42)(
|
|||||||
),
|
),
|
||||||
UntilNode(23...42)(
|
UntilNode(23...42)(
|
||||||
(23...28),
|
(23...28),
|
||||||
|
(39...42),
|
||||||
CallNode(29...32)(nil, nil, (29...32), nil, nil, nil, nil, 2, "foo"),
|
CallNode(29...32)(nil, nil, (29...32), nil, nil, nil, nil, 2, "foo"),
|
||||||
StatementsNode(34...38)(
|
StatementsNode(34...38)(
|
||||||
[CallNode(34...38)(
|
[CallNode(34...38)(
|
||||||
|
@ -3,6 +3,7 @@ ProgramNode(0...14)(
|
|||||||
StatementsNode(0...14)(
|
StatementsNode(0...14)(
|
||||||
[UntilNode(0...14)(
|
[UntilNode(0...14)(
|
||||||
(5...10),
|
(5...10),
|
||||||
|
nil,
|
||||||
CallNode(11...14)(nil, nil, (11...14), nil, nil, nil, nil, 2, "foo"),
|
CallNode(11...14)(nil, nil, (11...14), nil, nil, nil, nil, 2, "foo"),
|
||||||
StatementsNode(0...4)(
|
StatementsNode(0...4)(
|
||||||
[CallNode(0...4)(nil, nil, (0...4), nil, nil, nil, nil, 2, "meth")]
|
[CallNode(0...4)(nil, nil, (0...4), nil, nil, nil, nil, 2, "meth")]
|
||||||
|
@ -3,6 +3,7 @@ ProgramNode(0...24)(
|
|||||||
StatementsNode(0...24)(
|
StatementsNode(0...24)(
|
||||||
[UntilNode(0...24)(
|
[UntilNode(0...24)(
|
||||||
(15...20),
|
(15...20),
|
||||||
|
nil,
|
||||||
CallNode(21...24)(nil, nil, (21...24), nil, nil, nil, nil, 2, "foo"),
|
CallNode(21...24)(nil, nil, (21...24), nil, nil, nil, nil, 2, "foo"),
|
||||||
StatementsNode(0...14)(
|
StatementsNode(0...14)(
|
||||||
[BeginNode(0...14)(
|
[BeginNode(0...14)(
|
||||||
|
@ -2141,6 +2141,8 @@ nodes:
|
|||||||
child_nodes:
|
child_nodes:
|
||||||
- name: keyword_loc
|
- name: keyword_loc
|
||||||
type: location
|
type: location
|
||||||
|
- name: closing_loc
|
||||||
|
type: location?
|
||||||
- name: predicate
|
- name: predicate
|
||||||
type: node
|
type: node
|
||||||
- name: statements
|
- 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.
|
// Allocate a new UntilNode node.
|
||||||
static yp_until_node_t *
|
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);
|
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) {
|
*node = (yp_until_node_t) {
|
||||||
{
|
{
|
||||||
.type = YP_NODE_UNTIL_NODE,
|
.type = YP_NODE_UNTIL_NODE,
|
||||||
.flags = flags,
|
.flags = flags,
|
||||||
.location = {
|
.location = {
|
||||||
.start = start,
|
.start = keyword->start,
|
||||||
.end = end,
|
.end = closing->end,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
.keyword_loc = YP_LOCATION_TOKEN_VALUE(keyword),
|
.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,
|
.predicate = predicate,
|
||||||
.statements = statements
|
.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.");
|
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);
|
return (yp_node_t *) yp_until_node_create(parser, &keyword, &parser->previous, 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;
|
|
||||||
}
|
}
|
||||||
case YP_TOKEN_KEYWORD_WHILE: {
|
case YP_TOKEN_KEYWORD_WHILE: {
|
||||||
yp_do_loop_stack_push(parser, true);
|
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_statements_node_body_append(statements, node);
|
||||||
|
|
||||||
yp_node_t *predicate = parse_expression(parser, binding_power, "Expected a predicate after 'until'");
|
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: {
|
case YP_TOKEN_KEYWORD_WHILE_MODIFIER: {
|
||||||
parser_lex(parser);
|
parser_lex(parser);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user