@@ -40,6 +40,7 @@ debug_context(pm_context_t context) {
40
40
case PM_CONTEXT_BLOCK_BRACES: return "BLOCK_BRACES";
41
41
case PM_CONTEXT_BLOCK_KEYWORDS: return "BLOCK_KEYWORDS";
42
42
case PM_CONTEXT_FOR: return "FOR";
43
+ case PM_CONTEXT_FOR_INDEX: return "FOR_INDEX";
43
44
case PM_CONTEXT_IF: return "IF";
44
45
case PM_CONTEXT_MAIN: return "MAIN";
45
46
case PM_CONTEXT_MODULE: return "MODULE";
@@ -5602,6 +5603,8 @@ context_terminator(pm_context_t context, pm_token_t *token) {
5602
5603
case PM_CONTEXT_FOR:
5603
5604
case PM_CONTEXT_ENSURE:
5604
5605
return token->type == PM_TOKEN_KEYWORD_END;
5606
+ case PM_CONTEXT_FOR_INDEX:
5607
+ return token->type == PM_TOKEN_KEYWORD_IN;
5605
5608
case PM_CONTEXT_CASE_WHEN:
5606
5609
return token->type == PM_TOKEN_KEYWORD_WHEN || token->type == PM_TOKEN_KEYWORD_END || token->type == PM_TOKEN_KEYWORD_ELSE;
5607
5610
case PM_CONTEXT_CASE_IN:
@@ -9585,7 +9588,7 @@ parse_target(pm_parser_t *parser, pm_node_t *target) {
9585
9588
}
9586
9589
}
9587
9590
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
9589
9592
// assignment.
9590
9593
static pm_node_t *
9591
9594
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) {
12544
12547
multi_target->base.location.end = rparen_loc.end;
12545
12548
12546
12549
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;
12550
12554
}
12555
+
12556
+ return parse_target_validate(parser, (pm_node_t *) multi_target);
12551
12557
}
12552
12558
12553
12559
// 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) {
13634
13640
parser_lex(parser);
13635
13641
pm_token_t for_keyword = parser->previous;
13636
13642
pm_node_t *index;
13643
+
13637
13644
pm_parser_scope_push_transparent(parser);
13645
+ context_push(parser, PM_CONTEXT_FOR_INDEX);
13638
13646
13639
13647
// First, parse out the first index expression.
13640
13648
if (accept1(parser, PM_TOKEN_USTAR)) {
@@ -13660,6 +13668,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power) {
13660
13668
index = parse_target(parser, index);
13661
13669
}
13662
13670
13671
+ context_pop(parser);
13663
13672
pm_parser_scope_pop(parser);
13664
13673
pm_do_loop_stack_push(parser, true);
13665
13674
0 commit comments