[ruby/yarp] Add closing_loc to WhileNode

https://github.com/ruby/yarp/commit/b4132b876d
This commit is contained in:
Kevin Newton 2023-08-21 18:10:47 -04:00 committed by git
parent df11a08d93
commit b112e89bb1
16 changed files with 81 additions and 25 deletions

View File

@ -1369,6 +1369,7 @@ ProgramNode(0...1237)(
[SymbolNode(1067...1069)((1067...1068), (1068...1069), nil, "a"), [SymbolNode(1067...1069)((1067...1068), (1068...1069), nil, "a"),
WhileNode(1073...1117)( WhileNode(1073...1117)(
(1073...1078), (1073...1078),
(1114...1117),
CallNode(1079...1080)( CallNode(1079...1080)(
nil, nil,
nil, nil,

View File

@ -3,6 +3,7 @@ ProgramNode(0...30)(
StatementsNode(0...30)( StatementsNode(0...30)(
[WhileNode(0...30)( [WhileNode(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)(

View File

@ -3,6 +3,7 @@ ProgramNode(0...30)(
StatementsNode(0...30)( StatementsNode(0...30)(
[WhileNode(0...30)( [WhileNode(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)(

View File

@ -308,6 +308,7 @@ ProgramNode(0...999)(
CallNode(273...290)( CallNode(273...290)(
WhileNode(273...286)( WhileNode(273...286)(
(273...278), (273...278),
(283...286),
CallNode(279...282)( CallNode(279...282)(
nil, nil,
nil, nil,

View File

@ -32,6 +32,7 @@ ProgramNode(0...620)(
StatementsNode(27...60)( StatementsNode(27...60)(
[WhileNode(27...60)( [WhileNode(27...60)(
(27...32), (27...32),
(57...60),
CallNode(33...36)( CallNode(33...36)(
nil, nil,
nil, nil,
@ -72,6 +73,7 @@ ProgramNode(0...620)(
StatementsNode(80...106)( StatementsNode(80...106)(
[WhileNode(80...106)( [WhileNode(80...106)(
(90...95), (90...95),
nil,
CallNode(96...106)( CallNode(96...106)(
LocalVariableReadNode(96...99)(:foo, 0), LocalVariableReadNode(96...99)(:foo, 0),
nil, nil,
@ -132,6 +134,7 @@ ProgramNode(0...620)(
StatementsNode(123...142)( StatementsNode(123...142)(
[WhileNode(123...142)( [WhileNode(123...142)(
(133...138), (133...138),
nil,
LocalVariableReadNode(139...142)(:foo, 0), LocalVariableReadNode(139...142)(:foo, 0),
StatementsNode(123...132)( StatementsNode(123...132)(
[LocalVariableWriteNode(123...132)( [LocalVariableWriteNode(123...132)(
@ -199,6 +202,7 @@ ProgramNode(0...620)(
StatementsNode(195...224)( StatementsNode(195...224)(
[WhileNode(195...224)( [WhileNode(195...224)(
(195...200), (195...200),
(221...224),
CallNode(201...204)( CallNode(201...204)(
nil, nil,
nil, nil,
@ -266,6 +270,7 @@ ProgramNode(0...620)(
StatementsNode(258...291)( StatementsNode(258...291)(
[WhileNode(258...291)( [WhileNode(258...291)(
(258...263), (258...263),
(288...291),
CallNode(264...267)( CallNode(264...267)(
nil, nil,
nil, nil,
@ -340,6 +345,7 @@ ProgramNode(0...620)(
StatementsNode(329...362)( StatementsNode(329...362)(
[WhileNode(329...362)( [WhileNode(329...362)(
(329...334), (329...334),
(359...362),
LocalVariableReadNode(335...338)(:foo, 0), LocalVariableReadNode(335...338)(:foo, 0),
StatementsNode(345...354)( StatementsNode(345...354)(
[LocalVariableWriteNode(345...354)( [LocalVariableWriteNode(345...354)(
@ -380,6 +386,7 @@ ProgramNode(0...620)(
StatementsNode(376...401)( StatementsNode(376...401)(
[WhileNode(376...401)( [WhileNode(376...401)(
(392...397), (392...397),
nil,
CallNode(398...401)( CallNode(398...401)(
nil, nil,
nil, nil,
@ -424,6 +431,7 @@ ProgramNode(0...620)(
), ),
WhileNode(403...428)( WhileNode(403...428)(
(419...424), (419...424),
nil,
CallNode(425...428)( CallNode(425...428)(
nil, nil,
nil, nil,
@ -510,6 +518,7 @@ ProgramNode(0...620)(
), ),
WhileNode(461...492)( WhileNode(461...492)(
(483...488), (483...488),
nil,
CallNode(489...492)( CallNode(489...492)(
nil, nil,
nil, nil,
@ -556,15 +565,23 @@ ProgramNode(0...620)(
), ),
1 1
), ),
WhileNode(493...508)((493...498), FalseNode(499...504)(), nil, 0), WhileNode(493...508)(
(493...498),
(505...508),
FalseNode(499...504)(),
nil,
0
),
WhileNode(509...528)( WhileNode(509...528)(
(509...514), (509...514),
(525...528),
FalseNode(515...520)(), FalseNode(515...520)(),
StatementsNode(523...524)([IntegerNode(523...524)()]), StatementsNode(523...524)([IntegerNode(523...524)()]),
0 0
), ),
WhileNode(529...556)( WhileNode(529...556)(
(529...534), (529...534),
(553...556),
ParenthesesNode(535...544)( ParenthesesNode(535...544)(
StatementsNode(536...543)( StatementsNode(536...543)(
[CallNode(536...543)( [CallNode(536...543)(

View File

@ -41,6 +41,7 @@ ProgramNode(0...188)(
), ),
WhileNode(36...55)( WhileNode(36...55)(
(46...51), (46...51),
nil,
LocalVariableReadNode(52...55)(:foo, 0), LocalVariableReadNode(52...55)(:foo, 0),
StatementsNode(36...45)( StatementsNode(36...45)(
[LocalVariableWriteNode(36...45)( [LocalVariableWriteNode(36...45)(
@ -88,6 +89,7 @@ ProgramNode(0...188)(
), ),
WhileNode(77...96)( WhileNode(77...96)(
(77...82), (77...82),
(93...96),
LocalVariableWriteNode(83...88)( LocalVariableWriteNode(83...88)(
:a, :a,
0, 0,
@ -159,6 +161,7 @@ ProgramNode(0...188)(
), ),
WhileNode(155...184)( WhileNode(155...184)(
(155...160), (155...160),
(181...184),
LocalVariableReadNode(161...164)(:foo, 0), LocalVariableReadNode(161...164)(:foo, 0),
StatementsNode(169...178)( StatementsNode(169...178)(
[LocalVariableWriteNode(169...178)( [LocalVariableWriteNode(169...178)(

View File

@ -3,36 +3,42 @@ ProgramNode(0...314)(
StatementsNode(0...314)( StatementsNode(0...314)(
[WhileNode(0...18)( [WhileNode(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
), ),
WhileNode(20...32)( WhileNode(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
), ),
WhileNode(34...50)( WhileNode(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
), ),
WhileNode(52...67)( WhileNode(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
), ),
WhileNode(69...86)( WhileNode(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
), ),
WhileNode(88...109)( WhileNode(88...109)(
(99...104), (99...104),
nil,
CallNode(105...109)( CallNode(105...109)(
nil, nil,
nil, nil,
@ -64,6 +70,7 @@ ProgramNode(0...314)(
), ),
WhileNode(111...161)( WhileNode(111...161)(
(111...116), (111...116),
(158...161),
DefNode(117...149)( DefNode(117...149)(
(126...129), (126...129),
SelfNode(121...125)(), SelfNode(121...125)(),
@ -105,6 +112,7 @@ ProgramNode(0...314)(
), ),
WhileNode(163...210)( WhileNode(163...210)(
(163...168), (163...168),
(207...210),
ClassNode(169...198)( ClassNode(169...198)(
[:a], [:a],
(169...174), (169...174),
@ -138,6 +146,7 @@ ProgramNode(0...314)(
), ),
WhileNode(212...260)( WhileNode(212...260)(
(212...217), (212...217),
(257...260),
SingletonClassNode(218...248)( SingletonClassNode(218...248)(
[], [],
(218...223), (218...223),
@ -163,6 +172,7 @@ ProgramNode(0...314)(
), ),
WhileNode(262...314)( WhileNode(262...314)(
(262...267), (262...267),
(311...314),
SingletonClassNode(268...302)( SingletonClassNode(268...302)(
[:a], [:a],
(268...273), (268...273),

View File

@ -3,6 +3,7 @@ ProgramNode(0...23)(
StatementsNode(0...23)( StatementsNode(0...23)(
[WhileNode(0...23)( [WhileNode(0...23)(
(0...5), (0...5),
(20...23),
CallNode(6...16)( CallNode(6...16)(
ParenthesesNode(10...16)( ParenthesesNode(10...16)(
StatementsNode(11...15)([TrueNode(11...15)()]), StatementsNode(11...15)([TrueNode(11...15)()]),

View File

@ -3,6 +3,7 @@ ProgramNode(0...197)(
StatementsNode(0...197)( StatementsNode(0...197)(
[WhileNode(0...52)( [WhileNode(0...52)(
(0...5), (0...5),
(49...52),
SingletonClassNode(6...40)( SingletonClassNode(6...40)(
[:a], [:a],
(6...11), (6...11),
@ -34,6 +35,7 @@ ProgramNode(0...197)(
), ),
WhileNode(54...102)( WhileNode(54...102)(
(54...59), (54...59),
(99...102),
SingletonClassNode(60...90)( SingletonClassNode(60...90)(
[], [],
(60...65), (60...65),
@ -59,6 +61,7 @@ ProgramNode(0...197)(
), ),
WhileNode(104...151)( WhileNode(104...151)(
(104...109), (104...109),
(148...151),
ClassNode(110...139)( ClassNode(110...139)(
[:a], [:a],
(110...115), (110...115),
@ -92,6 +95,7 @@ ProgramNode(0...197)(
), ),
WhileNode(153...197)( WhileNode(153...197)(
(153...158), (153...158),
(194...197),
ClassNode(159...185)( ClassNode(159...185)(
[], [],
(159...164), (159...164),

View File

@ -27,6 +27,7 @@ ProgramNode(0...178)(
ConstantPathNode(46...82)( ConstantPathNode(46...82)(
WhileNode(46...74)( WhileNode(46...74)(
(46...51), (46...51),
(71...74),
TrueNode(52...56)(), TrueNode(52...56)(),
StatementsNode(58...70)( StatementsNode(58...70)(
[BreakNode(58...70)( [BreakNode(58...70)(
@ -69,6 +70,7 @@ ProgramNode(0...178)(
ConstantPathNode(137...173)( ConstantPathNode(137...173)(
WhileNode(137...165)( WhileNode(137...165)(
(137...142), (137...142),
(162...165),
TrueNode(143...147)(), TrueNode(143...147)(),
StatementsNode(149...161)( StatementsNode(149...161)(
[BreakNode(149...161)( [BreakNode(149...161)(

View File

@ -3,6 +3,7 @@ ProgramNode(0...190)(
StatementsNode(0...190)( StatementsNode(0...190)(
[WhileNode(0...45)( [WhileNode(0...45)(
(0...5), (0...5),
(42...45),
DefNode(6...33)( DefNode(6...33)(
(10...13), (10...13),
nil, nil,
@ -44,6 +45,7 @@ ProgramNode(0...190)(
), ),
WhileNode(47...89)( WhileNode(47...89)(
(47...52), (47...52),
(86...89),
DefNode(53...77)( DefNode(53...77)(
(57...60), (57...60),
nil, nil,
@ -74,6 +76,7 @@ ProgramNode(0...190)(
), ),
WhileNode(91...141)( WhileNode(91...141)(
(91...96), (91...96),
(138...141),
DefNode(97...129)( DefNode(97...129)(
(106...109), (106...109),
SelfNode(101...105)(), SelfNode(101...105)(),
@ -115,6 +118,7 @@ ProgramNode(0...190)(
), ),
WhileNode(143...190)( WhileNode(143...190)(
(143...148), (143...148),
(187...190),
DefNode(149...178)( DefNode(149...178)(
(158...161), (158...161),
SelfNode(153...157)(), SelfNode(153...157)(),

View File

@ -3,6 +3,7 @@ ProgramNode(0...42)(
StatementsNode(0...42)( StatementsNode(0...42)(
[WhileNode(0...21)( [WhileNode(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)(
), ),
WhileNode(23...42)( WhileNode(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)(

View File

@ -3,6 +3,7 @@ ProgramNode(0...14)(
StatementsNode(0...14)( StatementsNode(0...14)(
[WhileNode(0...14)( [WhileNode(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")]

View File

@ -3,6 +3,7 @@ ProgramNode(0...24)(
StatementsNode(0...24)( StatementsNode(0...24)(
[WhileNode(0...24)( [WhileNode(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)(

View File

@ -2180,6 +2180,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

View File

@ -4293,34 +4293,43 @@ yp_when_node_statements_set(yp_when_node_t *node, yp_statements_node_t *statemen
// Allocate a new WhileNode node. // Allocate a new WhileNode node.
static yp_while_node_t * static yp_while_node_t *
yp_while_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_while_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_while_node_t *node = YP_ALLOC_NODE(parser, yp_while_node_t); yp_while_node_t *node = YP_ALLOC_NODE(parser, yp_while_node_t);
const char *start = NULL;
bool has_statements = (statements != NULL) && (statements->body.size != 0);
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_while_node_t) { *node = (yp_while_node_t) {
{ {
.type = YP_NODE_WHILE_NODE, .type = YP_NODE_WHILE_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 WhileNode node.
static yp_while_node_t *
yp_while_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_while_node_t *node = YP_ALLOC_NODE(parser, yp_while_node_t);
*node = (yp_while_node_t) {
{
.type = YP_NODE_WHILE_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
}; };
@ -11912,11 +11921,7 @@ parse_expression_prefix(yp_parser_t *parser, yp_binding_power_t binding_power) {
expect(parser, YP_TOKEN_KEYWORD_END, "Expected `end` to close `while` statement."); expect(parser, YP_TOKEN_KEYWORD_END, "Expected `end` to close `while` statement.");
} }
yp_while_node_t *while_node = yp_while_node_create(parser, &keyword, predicate, statements, 0); return (yp_node_t *) yp_while_node_create(parser, &keyword, &parser->previous, predicate, statements, 0);
if (parser->previous.type == YP_TOKEN_KEYWORD_END) {
while_node->base.location.end = parser->previous.end;
}
return (yp_node_t *) while_node;
} }
case YP_TOKEN_PERCENT_LOWER_I: { case YP_TOKEN_PERCENT_LOWER_I: {
parser_lex(parser); parser_lex(parser);
@ -13197,7 +13202,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 'while'"); yp_node_t *predicate = parse_expression(parser, binding_power, "Expected a predicate after 'while'");
return (yp_node_t *) yp_while_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_while_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_QUESTION_MARK: { case YP_TOKEN_QUESTION_MARK: {
parser_lex(parser); parser_lex(parser);