Skip to content

Commit 4362cec

Browse files
committed
Add closing_loc to UntilNode
1 parent ad0f9d3 commit 4362cec

File tree

12 files changed

+58
-24
lines changed

12 files changed

+58
-24
lines changed

config.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2141,6 +2141,8 @@ nodes:
21412141
child_nodes:
21422142
- name: keyword_loc
21432143
type: location
2144+
- name: closing_loc
2145+
type: location?
21442146
- name: predicate
21452147
type: node
21462148
- name: statements

src/yarp.c

Lines changed: 27 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -4209,34 +4209,43 @@ yp_unless_node_end_keyword_loc_set(yp_unless_node_t *node, const yp_token_t *end
42094209

42104210
// Allocate a new UntilNode node.
42114211
static yp_until_node_t *
4212-
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) {
4212+
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) {
42134213
yp_until_node_t *node = YP_ALLOC_NODE(parser, yp_until_node_t);
4214-
bool has_statements = (statements != NULL) && (statements->body.size != 0);
42154214

4216-
const char *start = NULL;
4217-
if (has_statements && (keyword->start > statements->base.location.start)) {
4218-
start = statements->base.location.start;
4219-
} else {
4220-
start = keyword->start;
4221-
}
4215+
*node = (yp_until_node_t) {
4216+
{
4217+
.type = YP_NODE_UNTIL_NODE,
4218+
.flags = flags,
4219+
.location = {
4220+
.start = keyword->start,
4221+
.end = closing->end,
4222+
},
4223+
},
4224+
.keyword_loc = YP_LOCATION_TOKEN_VALUE(keyword),
4225+
.closing_loc = YP_OPTIONAL_LOCATION_TOKEN_VALUE(closing),
4226+
.predicate = predicate,
4227+
.statements = statements
4228+
};
42224229

4223-
const char *end = NULL;
4224-
if (has_statements && (predicate->location.end < statements->base.location.end)) {
4225-
end = statements->base.location.end;
4226-
} else {
4227-
end = predicate->location.end;
4228-
}
4230+
return node;
4231+
}
4232+
4233+
// Allocate a new UntilNode node.
4234+
static yp_until_node_t *
4235+
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) {
4236+
yp_until_node_t *node = YP_ALLOC_NODE(parser, yp_until_node_t);
42294237

42304238
*node = (yp_until_node_t) {
42314239
{
42324240
.type = YP_NODE_UNTIL_NODE,
42334241
.flags = flags,
42344242
.location = {
4235-
.start = start,
4236-
.end = end,
4243+
.start = statements->base.location.start,
4244+
.end = predicate->location.end,
42374245
},
42384246
},
42394247
.keyword_loc = YP_LOCATION_TOKEN_VALUE(keyword),
4248+
.closing_loc = YP_OPTIONAL_LOCATION_NOT_PROVIDED_VALUE,
42404249
.predicate = predicate,
42414250
.statements = statements
42424251
};
@@ -11882,12 +11891,7 @@ parse_expression_prefix(yp_parser_t *parser, yp_binding_power_t binding_power) {
1188211891
expect(parser, YP_TOKEN_KEYWORD_END, "Expected `end` to close `until` statement.");
1188311892
}
1188411893

11885-
yp_until_node_t *until_node = yp_until_node_create(parser, &keyword, predicate, statements, 0);
11886-
if (parser->previous.type == YP_TOKEN_KEYWORD_END) {
11887-
until_node->base.location.end = parser->previous.end;
11888-
}
11889-
11890-
return (yp_node_t *) until_node;
11894+
return (yp_node_t *) yp_until_node_create(parser, &keyword, &parser->previous, predicate, statements, 0);
1189111895
}
1189211896
case YP_TOKEN_KEYWORD_WHILE: {
1189311897
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
1318513189
yp_statements_node_body_append(statements, node);
1318613190

1318713191
yp_node_t *predicate = parse_expression(parser, binding_power, "Expected a predicate after 'until'");
13188-
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);
13192+
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);
1318913193
}
1319013194
case YP_TOKEN_KEYWORD_WHILE_MODIFIER: {
1319113195
parser_lex(parser);

test/snapshots/method_calls.txt

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

test/snapshots/seattlerb/parse_until_not_canonical.txt

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

test/snapshots/seattlerb/parse_until_not_noncanonical.txt

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

test/snapshots/unparser/corpus/literal/send.txt

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

test/snapshots/unparser/corpus/literal/while.txt

Lines changed: 11 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

test/snapshots/unparser/corpus/semantic/while.txt

Lines changed: 4 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

test/snapshots/until.txt

Lines changed: 6 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

test/snapshots/whitequark/until.txt

Lines changed: 2 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)