Skip to content

Commit ff4eefd

Browse files
Validate ForNode
1 parent 8a14cdc commit ff4eefd

3 files changed

Lines changed: 11 additions & 5 deletions

File tree

config.yml

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2547,9 +2547,7 @@ nodes:
25472547
- CallTargetNode
25482548
- IndexTargetNode
25492549
- MultiTargetNode
2550-
- on error: BackReferenceReadNode # for $& in a end
2551-
- on error: NumberedReferenceReadNode # for $1 in a end
2552-
- on error: ErrorRecoveryNode # for in 1..10; end
2550+
- on error: ErrorRecoveryNode
25532551
comment: |
25542552
The index expression for `for` loops.
25552553

src/prism.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19153,6 +19153,11 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b
1915319153
parser_warn_indentation_mismatch(parser, opening_newline_index, &for_keyword, false, false);
1915419154
expect1_opening(parser, PM_TOKEN_KEYWORD_END, PM_ERR_FOR_TERM, &for_keyword);
1915519155

19156+
PM_VALIDATE_NODE_TYPE(parser, index,
19157+
PM_LOCAL_VARIABLE_TARGET_NODE, PM_INSTANCE_VARIABLE_TARGET_NODE, PM_CLASS_VARIABLE_TARGET_NODE, PM_GLOBAL_VARIABLE_TARGET_NODE,
19158+
PM_CONSTANT_TARGET_NODE, PM_CONSTANT_PATH_TARGET_NODE, PM_CALL_TARGET_NODE, PM_INDEX_TARGET_NODE,
19159+
PM_MULTI_TARGET_NODE);
19160+
1915619161
return UP(pm_for_node_create(parser, index, collection, statements, &for_keyword, &in_keyword, &do_keyword, &parser->previous));
1915719162
}
1915819163
case PM_TOKEN_KEYWORD_IF:

test/prism/result/error_recovery_test.rb

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,15 +54,17 @@ def test_for_node_index_back_reference
5454
refute result.success?
5555

5656
node = result.value.statements.body.first
57-
assert_kind_of BackReferenceReadNode, node.index
57+
assert_kind_of ErrorRecoveryNode, node.index
58+
assert_kind_of BackReferenceReadNode, node.index.child
5859
end
5960

6061
def test_for_node_index_numbered_reference
6162
result = Prism.parse("for $1 in a; end")
6263
refute result.success?
6364

6465
node = result.value.statements.body.first
65-
assert_kind_of NumberedReferenceReadNode, node.index
66+
assert_kind_of ErrorRecoveryNode, node.index
67+
assert_kind_of NumberedReferenceReadNode, node.index.child
6668
end
6769

6870
def test_for_node_index_missing
@@ -71,6 +73,7 @@ def test_for_node_index_missing
7173

7274
node = result.value.statements.body.first
7375
assert_kind_of ErrorRecoveryNode, node.index
76+
assert_nil node.index.child
7477
end
7578

7679
def test_interpolated_string_node_parts_xstring

0 commit comments

Comments
 (0)