Skip to content

Commit aac272e

Browse files
Validate RescueNode
1 parent a78c521 commit aac272e

3 files changed

Lines changed: 12 additions & 5 deletions

File tree

config.yml

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4327,9 +4327,7 @@ nodes:
43274327
- ConstantPathTargetNode
43284328
- CallTargetNode
43294329
- IndexTargetNode
4330-
- on error: BackReferenceReadNode # => begin; rescue => $&; end
4331-
- on error: NumberedReferenceReadNode # => begin; rescue => $1; end
4332-
- on error: ErrorRecoveryNode # begin; rescue =>; end
4330+
- on error: ErrorRecoveryNode
43334331
- name: then_keyword_loc
43344332
type: location?
43354333
- name: statements

src/prism.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14423,6 +14423,9 @@ parse_rescues(pm_parser_t *parser, size_t opening_newline_index, const pm_token_
1442314423
pm_node_t *reference = parse_expression(parser, PM_BINDING_POWER_INDEX, false, false, PM_ERR_RESCUE_VARIABLE, (uint16_t) (depth + 1));
1442414424
reference = parse_target(parser, reference, false, false);
1442514425

14426+
PM_VALIDATE_NODE_TYPE(parser, reference,
14427+
PM_LOCAL_VARIABLE_TARGET_NODE, PM_INSTANCE_VARIABLE_TARGET_NODE, PM_CLASS_VARIABLE_TARGET_NODE, PM_GLOBAL_VARIABLE_TARGET_NODE,
14428+
PM_CONSTANT_TARGET_NODE, PM_CONSTANT_PATH_TARGET_NODE, PM_CALL_TARGET_NODE, PM_INDEX_TARGET_NODE);
1442614429
pm_rescue_node_reference_set(rescue, reference);
1442714430
break;
1442814431
}
@@ -14453,6 +14456,9 @@ parse_rescues(pm_parser_t *parser, size_t opening_newline_index, const pm_token_
1445314456
pm_node_t *reference = parse_expression(parser, PM_BINDING_POWER_INDEX, false, false, PM_ERR_RESCUE_VARIABLE, (uint16_t) (depth + 1));
1445414457
reference = parse_target(parser, reference, false, false);
1445514458

14459+
PM_VALIDATE_NODE_TYPE(parser, reference,
14460+
PM_LOCAL_VARIABLE_TARGET_NODE, PM_INSTANCE_VARIABLE_TARGET_NODE, PM_CLASS_VARIABLE_TARGET_NODE, PM_GLOBAL_VARIABLE_TARGET_NODE,
14461+
PM_CONSTANT_TARGET_NODE, PM_CONSTANT_PATH_TARGET_NODE, PM_CALL_TARGET_NODE, PM_INDEX_TARGET_NODE);
1445614462
pm_rescue_node_reference_set(rescue, reference);
1445714463
break;
1445814464
}

test/prism/result/error_recovery_test.rb

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -203,15 +203,17 @@ def test_rescue_node_reference_back_reference
203203
refute result.success?
204204

205205
node = result.value.statements.body.first.rescue_clause
206-
assert_kind_of BackReferenceReadNode, node.reference
206+
assert_kind_of ErrorRecoveryNode, node.reference
207+
assert_kind_of BackReferenceReadNode, node.reference.child
207208
end
208209

209210
def test_rescue_node_reference_numbered_reference
210211
result = Prism.parse("begin; rescue => $1; end")
211212
refute result.success?
212213

213214
node = result.value.statements.body.first.rescue_clause
214-
assert_kind_of NumberedReferenceReadNode, node.reference
215+
assert_kind_of ErrorRecoveryNode, node.reference
216+
assert_kind_of NumberedReferenceReadNode, node.reference.child
215217
end
216218

217219
def test_rescue_node_reference_missing
@@ -220,6 +222,7 @@ def test_rescue_node_reference_missing
220222

221223
node = result.value.statements.body.first.rescue_clause
222224
assert_kind_of ErrorRecoveryNode, node.reference
225+
assert_nil node.reference.child
223226
end
224227
end
225228
end

0 commit comments

Comments
 (0)