Skip to content

Commit 6d18581

Browse files
committed
Remove RequiredDestructuredParameterNode in favor of MultiTargetNode
1 parent e60240d commit 6d18581

30 files changed

+429
-375
lines changed

config.yml

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2184,20 +2184,6 @@ nodes:
21842184
21852185
/foo/i
21862186
^^^^^^
2187-
- name: RequiredDestructuredParameterNode
2188-
fields:
2189-
- name: parameters
2190-
type: node[]
2191-
- name: opening_loc
2192-
type: location
2193-
- name: closing_loc
2194-
type: location
2195-
comment: |
2196-
Represents a destructured required parameter node.
2197-
2198-
def foo((bar, baz))
2199-
^^^^^^^^^^
2200-
end
22012187
- name: RequiredParameterNode
22022188
fields:
22032189
- name: name

lib/prism/debug.rb

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -110,11 +110,13 @@ def self.prism_locals(source)
110110

111111
# Recurse down the parameter tree to find any destructured
112112
# parameters and add them after the other parameters.
113-
param_stack = params.requireds.concat(params.posts).grep(RequiredDestructuredParameterNode).reverse
113+
param_stack = params.requireds.concat(params.posts).grep(MultiTargetNode).reverse
114114
while (param = param_stack.pop)
115115
case param
116-
when RequiredDestructuredParameterNode
117-
param_stack.concat(param.parameters.reverse)
116+
when MultiTargetNode
117+
param_stack.concat(param.posts.reverse)
118+
param_stack << param.rest
119+
param_stack.concat(param.requireds.reverse)
118120
when RequiredParameterNode
119121
sorted << param.name
120122
when SplatNode

src/prism.c

Lines changed: 23 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -3647,6 +3647,20 @@ pm_multi_target_node_targets_append(pm_parser_t *parser, pm_multi_target_node_t
36473647
}
36483648
}
36493649

3650+
// Set the opening of a MultiTargetNode node.
3651+
static void
3652+
pm_multi_target_node_opening_set(pm_multi_target_node_t *node, const pm_token_t *lparen) {
3653+
node->base.location.start = lparen->start;
3654+
node->lparen_loc = PM_LOCATION_TOKEN_VALUE(lparen);
3655+
}
3656+
3657+
// Set the closing of a MultiTargetNode node.
3658+
static void
3659+
pm_multi_target_node_closing_set(pm_multi_target_node_t *node, const pm_token_t *rparen) {
3660+
node->base.location.end = rparen->end;
3661+
node->rparen_loc = PM_LOCATION_TOKEN_VALUE(rparen);
3662+
}
3663+
36503664
// Allocate a new MultiWriteNode node.
36513665
static pm_multi_write_node_t *
36523666
pm_multi_write_node_create(pm_parser_t *parser, pm_multi_target_node_t *target, const pm_token_t *operator, pm_node_t *value) {
@@ -4089,37 +4103,6 @@ pm_regular_expression_node_create(pm_parser_t *parser, const pm_token_t *opening
40894103
return pm_regular_expression_node_create_unescaped(parser, opening, content, closing, &PM_EMPTY_STRING);
40904104
}
40914105

4092-
// Allocate a new RequiredDestructuredParameterNode node.
4093-
static pm_required_destructured_parameter_node_t *
4094-
pm_required_destructured_parameter_node_create(pm_parser_t *parser, const pm_token_t *opening) {
4095-
pm_required_destructured_parameter_node_t *node = PM_ALLOC_NODE(parser, pm_required_destructured_parameter_node_t);
4096-
4097-
*node = (pm_required_destructured_parameter_node_t) {
4098-
{
4099-
.type = PM_REQUIRED_DESTRUCTURED_PARAMETER_NODE,
4100-
.location = PM_LOCATION_TOKEN_VALUE(opening)
4101-
},
4102-
.opening_loc = PM_LOCATION_TOKEN_VALUE(opening),
4103-
.closing_loc = PM_OPTIONAL_LOCATION_NOT_PROVIDED_VALUE,
4104-
.parameters = PM_EMPTY_NODE_LIST
4105-
};
4106-
4107-
return node;
4108-
}
4109-
4110-
// Append a new parameter to the given RequiredDestructuredParameterNode node.
4111-
static void
4112-
pm_required_destructured_parameter_node_append_parameter(pm_required_destructured_parameter_node_t *node, pm_node_t *parameter) {
4113-
pm_node_list_append(&node->parameters, parameter);
4114-
}
4115-
4116-
// Set the closing token of the given RequiredDestructuredParameterNode node.
4117-
static void
4118-
pm_required_destructured_parameter_node_closing_set(pm_required_destructured_parameter_node_t *node, const pm_token_t *closing) {
4119-
node->closing_loc = PM_LOCATION_TOKEN_VALUE(closing);
4120-
node->base.location.end = closing->end;
4121-
}
4122-
41234106
// Allocate a new RequiredParameterNode node.
41244107
static pm_required_parameter_node_t *
41254108
pm_required_parameter_node_create(pm_parser_t *parser, const pm_token_t *token) {
@@ -10194,34 +10177,27 @@ parse_arguments(pm_parser_t *parser, pm_arguments_t *arguments, bool accepts_for
1019410177
// end
1019510178
//
1019610179
// It can recurse infinitely down, and splats are allowed to group arguments.
10197-
static pm_required_destructured_parameter_node_t *
10180+
static pm_multi_target_node_t *
1019810181
parse_required_destructured_parameter(pm_parser_t *parser) {
1019910182
expect1(parser, PM_TOKEN_PARENTHESIS_LEFT, PM_ERR_EXPECT_LPAREN_REQ_PARAMETER);
1020010183

10201-
pm_token_t opening = parser->previous;
10202-
pm_required_destructured_parameter_node_t *node = pm_required_destructured_parameter_node_create(parser, &opening);
10203-
bool parsed_splat = false;
10184+
pm_multi_target_node_t *node = pm_multi_target_node_create(parser);
10185+
pm_multi_target_node_opening_set(node, &parser->previous);
1020410186

1020510187
do {
1020610188
pm_node_t *param;
1020710189

10208-
if (node->parameters.size > 0 && match1(parser, PM_TOKEN_PARENTHESIS_RIGHT)) {
10209-
if (parsed_splat) {
10210-
pm_parser_err_previous(parser, PM_ERR_ARGUMENT_SPLAT_AFTER_SPLAT);
10211-
}
10212-
10190+
// If we get here then we have a trailing comma. In this case we'll
10191+
// create an implicit splat node.
10192+
if (node->requireds.size > 0 && match1(parser, PM_TOKEN_PARENTHESIS_RIGHT)) {
1021310193
param = (pm_node_t *) pm_splat_node_create(parser, &parser->previous, NULL);
10214-
pm_required_destructured_parameter_node_append_parameter(node, param);
10194+
pm_multi_target_node_targets_append(parser, node, param);
1021510195
break;
1021610196
}
1021710197

1021810198
if (match1(parser, PM_TOKEN_PARENTHESIS_LEFT)) {
1021910199
param = (pm_node_t *) parse_required_destructured_parameter(parser);
1022010200
} else if (accept1(parser, PM_TOKEN_USTAR)) {
10221-
if (parsed_splat) {
10222-
pm_parser_err_previous(parser, PM_ERR_ARGUMENT_SPLAT_AFTER_SPLAT);
10223-
}
10224-
1022510201
pm_token_t star = parser->previous;
1022610202
pm_node_t *value = NULL;
1022710203

@@ -10233,7 +10209,6 @@ parse_required_destructured_parameter(pm_parser_t *parser) {
1023310209
}
1023410210

1023510211
param = (pm_node_t *) pm_splat_node_create(parser, &star, value);
10236-
parsed_splat = true;
1023710212
} else {
1023810213
expect1(parser, PM_TOKEN_IDENTIFIER, PM_ERR_EXPECT_IDENT_REQ_PARAMETER);
1023910214
pm_token_t name = parser->previous;
@@ -10243,11 +10218,11 @@ parse_required_destructured_parameter(pm_parser_t *parser) {
1024310218
pm_parser_local_add_token(parser, &name);
1024410219
}
1024510220

10246-
pm_required_destructured_parameter_node_append_parameter(node, param);
10221+
pm_multi_target_node_targets_append(parser, node, param);
1024710222
} while (accept1(parser, PM_TOKEN_COMMA));
1024810223

1024910224
expect1(parser, PM_TOKEN_PARENTHESIS_RIGHT, PM_ERR_EXPECT_RPAREN_REQ_PARAMETER);
10250-
pm_required_destructured_parameter_node_closing_set(node, &parser->previous);
10225+
pm_multi_target_node_closing_set(node, &parser->previous);
1025110226

1025210227
return node;
1025310228
}

test/prism/location_test.rb

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -579,6 +579,9 @@ def test_ModuleNode
579579
def test_MultiTargetNode
580580
assert_location(MultiTargetNode, "for foo, bar in baz do end", 4...12, &:index)
581581
assert_location(MultiTargetNode, "foo, (bar, baz) = qux", 5...15) { |node| node.requireds.last }
582+
assert_location(MultiTargetNode, "def foo((bar)); end", 8...13) do |node|
583+
node.parameters.requireds.first
584+
end
582585
end
583586

584587
def test_MultiWriteNode
@@ -676,12 +679,6 @@ def test_RequiredParameterNode
676679
end
677680
end
678681

679-
def test_RequiredDestructuredParameterNode
680-
assert_location(RequiredDestructuredParameterNode, "def foo((bar)); end", 8...13) do |node|
681-
node.parameters.requireds.first
682-
end
683-
end
684-
685682
def test_RescueNode
686683
code = <<~RUBY
687684
begin

test/prism/snapshots/methods.txt

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

test/prism/snapshots/procs.txt

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

test/prism/snapshots/seattlerb/block_decomp_anon_splat_arg.txt

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

test/prism/snapshots/seattlerb/block_decomp_arg_splat.txt

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

test/prism/snapshots/seattlerb/block_decomp_arg_splat_arg.txt

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

0 commit comments

Comments
 (0)