Skip to content

Commit e60240d

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

File tree

8 files changed

+68
-117
lines changed

8 files changed

+68
-117
lines changed

src/prism.c

Lines changed: 13 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -9509,10 +9509,7 @@ parse_target(pm_parser_t *parser, pm_node_t *target) {
95099509
splat->expression = parse_target(parser, splat->expression);
95109510
}
95119511

9512-
pm_multi_target_node_t *multi_target = pm_multi_target_node_create(parser);
9513-
pm_multi_target_node_targets_append(parser, multi_target, (pm_node_t *) splat);
9514-
9515-
return (pm_node_t *) multi_target;
9512+
return (pm_node_t *) splat;
95169513
}
95179514
case PM_CALL_NODE: {
95189515
pm_call_node_t *call = (pm_call_node_t *) target;
@@ -9802,7 +9799,7 @@ parse_targets(pm_parser_t *parser, pm_node_t *first_target, pm_binding_power_t b
98029799
target = parse_target(parser, target);
98039800

98049801
pm_multi_target_node_targets_append(parser, result, target);
9805-
} else {
9802+
} else if (!match1(parser, PM_TOKEN_EOF)) {
98069803
// If we get here, then we have a trailing , in a multi target node.
98079804
// We need to indicate this somehow in the tree, so we'll add an
98089805
// anonymous splat.
@@ -12526,12 +12523,13 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power) {
1252612523
parser_lex(parser);
1252712524
pm_accepts_block_stack_pop(parser);
1252812525

12529-
// If we have a single statement and are ending on a right
12530-
// parenthesis, then we need to check if this is possibly a
12531-
// multiple target node.
12532-
if (PM_NODE_TYPE_P(statement, PM_MULTI_TARGET_NODE)) {
12526+
if (PM_NODE_TYPE_P(statement, PM_MULTI_TARGET_NODE) || PM_NODE_TYPE_P(statement, PM_SPLAT_NODE)) {
12527+
// If we have a single statement and are ending on a right
12528+
// parenthesis, then we need to check if this is possibly a
12529+
// multiple target node.
1253312530
pm_multi_target_node_t *multi_target;
12534-
if (((pm_multi_target_node_t *) statement)->lparen_loc.start == NULL) {
12531+
12532+
if (PM_NODE_TYPE_P(statement, PM_MULTI_TARGET_NODE) && ((pm_multi_target_node_t *) statement)->lparen_loc.start == NULL) {
1253512533
multi_target = (pm_multi_target_node_t *) statement;
1253612534
} else {
1253712535
multi_target = pm_multi_target_node_create(parser);
@@ -14575,18 +14573,13 @@ parse_expression_infix(pm_parser_t *parser, pm_node_t *node, pm_binding_power_t
1457514573
return parse_write(parser, node, &token, value);
1457614574
}
1457714575
case PM_SPLAT_NODE: {
14578-
pm_splat_node_t *splat_node = (pm_splat_node_t *) node;
14576+
pm_multi_target_node_t *multi_target = pm_multi_target_node_create(parser);
14577+
pm_multi_target_node_targets_append(parser, multi_target, node);
1457914578

14580-
switch (PM_NODE_TYPE(splat_node->expression)) {
14581-
case PM_CASE_WRITABLE:
14582-
parser_lex(parser);
14583-
pm_node_t *value = parse_assignment_value(parser, previous_binding_power, binding_power, PM_ERR_EXPECT_EXPRESSION_AFTER_EQUAL);
14584-
return parse_write(parser, (pm_node_t *) splat_node, &token, value);
14585-
default:
14586-
break;
14587-
}
14579+
parser_lex(parser);
14580+
pm_node_t *value = parse_assignment_value(parser, previous_binding_power, binding_power, PM_ERR_EXPECT_EXPRESSION_AFTER_EQUAL);
14581+
return parse_write(parser, (pm_node_t *) multi_target, &token, value);
1458814582
}
14589-
/* fallthrough */
1459014583
default:
1459114584
parser_lex(parser);
1459214585

test/prism/errors_test.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1202,7 +1202,7 @@ def test_unterminated_global_variable
12021202
def test_invalid_global_variable_write
12031203
assert_errors expression("$',"), "$',", [
12041204
["Immutable variable as a write target", 0..2],
1205-
["Unexpected write target", 0..3]
1205+
["Unexpected write target", 0..2]
12061206
]
12071207
end
12081208

test/prism/snapshots/seattlerb/masgn_anon_splat_arg.txt

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

test/prism/snapshots/seattlerb/masgn_splat_arg.txt

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

test/prism/snapshots/seattlerb/masgn_splat_arg_arg.txt

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

test/prism/snapshots/seattlerb/mlhs_front_anonsplat.txt

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

test/prism/snapshots/seattlerb/mlhs_front_splat.txt

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

test/prism/snapshots/whitequark/masgn_splat.txt

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

0 commit comments

Comments
 (0)