Skip to content

Commit ec31fd8

Browse files
committed
Ensure no extra multi-target nodes are created
1 parent dda7a0d commit ec31fd8

File tree

4 files changed

+85
-44
lines changed

4 files changed

+85
-44
lines changed

include/prism/parser.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,7 @@ typedef enum {
212212
PM_CONTEXT_EMBEXPR, // an interpolated expression
213213
PM_CONTEXT_ENSURE, // an ensure statement
214214
PM_CONTEXT_FOR, // a for loop
215+
PM_CONTEXT_FOR_INDEX, // a for loop's index
215216
PM_CONTEXT_IF, // an if statement
216217
PM_CONTEXT_LAMBDA_BRACES, // a lambda expression with braces
217218
PM_CONTEXT_LAMBDA_DO_END, // a lambda expression with do..end

src/prism.c

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ debug_context(pm_context_t context) {
4040
case PM_CONTEXT_BLOCK_BRACES: return "BLOCK_BRACES";
4141
case PM_CONTEXT_BLOCK_KEYWORDS: return "BLOCK_KEYWORDS";
4242
case PM_CONTEXT_FOR: return "FOR";
43+
case PM_CONTEXT_FOR_INDEX: return "FOR_INDEX";
4344
case PM_CONTEXT_IF: return "IF";
4445
case PM_CONTEXT_MAIN: return "MAIN";
4546
case PM_CONTEXT_MODULE: return "MODULE";
@@ -5602,6 +5603,8 @@ context_terminator(pm_context_t context, pm_token_t *token) {
56025603
case PM_CONTEXT_FOR:
56035604
case PM_CONTEXT_ENSURE:
56045605
return token->type == PM_TOKEN_KEYWORD_END;
5606+
case PM_CONTEXT_FOR_INDEX:
5607+
return token->type == PM_TOKEN_KEYWORD_IN;
56055608
case PM_CONTEXT_CASE_WHEN:
56065609
return token->type == PM_TOKEN_KEYWORD_WHEN || token->type == PM_TOKEN_KEYWORD_END || token->type == PM_TOKEN_KEYWORD_ELSE;
56075610
case PM_CONTEXT_CASE_IN:
@@ -9585,7 +9588,7 @@ parse_target(pm_parser_t *parser, pm_node_t *target) {
95859588
}
95869589
}
95879590

9588-
// Parse a write targets and validate that it is in a valid position for
9591+
// Parse a write target and validate that it is in a valid position for
95899592
// assignment.
95909593
static pm_node_t *
95919594
parse_target_validate(pm_parser_t *parser, pm_node_t *target) {
@@ -12544,10 +12547,13 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power) {
1254412547
multi_target->base.location.end = rparen_loc.end;
1254512548

1254612549
if (match1(parser, PM_TOKEN_COMMA)) {
12547-
return parse_targets_validate(parser, (pm_node_t *) multi_target, PM_BINDING_POWER_INDEX);
12548-
} else {
12549-
return parse_target_validate(parser, (pm_node_t *) multi_target);
12550+
if (binding_power == PM_BINDING_POWER_STATEMENT) {
12551+
return parse_targets_validate(parser, (pm_node_t *) multi_target, PM_BINDING_POWER_INDEX);
12552+
}
12553+
return (pm_node_t *) multi_target;
1255012554
}
12555+
12556+
return parse_target_validate(parser, (pm_node_t *) multi_target);
1255112557
}
1255212558

1255312559
// If we have a single statement and are ending on a right parenthesis
@@ -13634,7 +13640,9 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power) {
1363413640
parser_lex(parser);
1363513641
pm_token_t for_keyword = parser->previous;
1363613642
pm_node_t *index;
13643+
1363713644
pm_parser_scope_push_transparent(parser);
13645+
context_push(parser, PM_CONTEXT_FOR_INDEX);
1363813646

1363913647
// First, parse out the first index expression.
1364013648
if (accept1(parser, PM_TOKEN_USTAR)) {
@@ -13660,6 +13668,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power) {
1366013668
index = parse_target(parser, index);
1366113669
}
1366213670

13671+
context_pop(parser);
1366313672
pm_parser_scope_pop(parser);
1366413673
pm_do_loop_stack_push(parser, true);
1366513674

test/prism/fixtures/variables.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,3 +44,4 @@ Foo = 1, 2
4444

4545
(a; b; c)
4646

47+
a, (b, c), d = []

test/prism/snapshots/variables.txt

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

0 commit comments

Comments
 (0)