From 2335326c01e6504b4f7f1b36e4ce11a75049ed47 Mon Sep 17 00:00:00 2001 From: Kevin Newton Date: Thu, 10 Aug 2023 09:54:28 -0400 Subject: [PATCH] Make lone splat on RHS an array Implicitly, when you have `foo = *bar`, you're assigning an array. Previously we would only have a splat node on the RHS, but it's more clear to just make it an array. --- src/yarp.c | 6 +++--- test/snapshots/variables.txt | 10 +++++++--- test/snapshots/whitequark/asgn_mrhs.txt | 10 +++++++--- test/snapshots/whitequark/masgn_splat.txt | 20 +++++++++++++++++--- 4 files changed, 34 insertions(+), 12 deletions(-) diff --git a/src/yarp.c b/src/yarp.c index 084985810dc..c391d96e61e 100644 --- a/src/yarp.c +++ b/src/yarp.c @@ -12195,18 +12195,18 @@ static inline yp_node_t * parse_assignment_value(yp_parser_t *parser, yp_binding_power_t previous_binding_power, yp_binding_power_t binding_power, const char *message) { yp_node_t *value = parse_starred_expression(parser, binding_power, message); - if (previous_binding_power == YP_BINDING_POWER_STATEMENT && accept(parser, YP_TOKEN_COMMA)) { + if (previous_binding_power == YP_BINDING_POWER_STATEMENT && (YP_NODE_TYPE_P(value, YP_NODE_SPLAT_NODE) || match_type_p(parser, YP_TOKEN_COMMA))) { yp_token_t opening = not_provided(parser); yp_array_node_t *array = yp_array_node_create(parser, &opening); yp_array_node_elements_append(array, value); value = (yp_node_t *) array; - do { + while (accept(parser, YP_TOKEN_COMMA)) { yp_node_t *element = parse_starred_expression(parser, binding_power, "Expected an element for the array."); yp_array_node_elements_append(array, element); if (YP_NODE_TYPE_P(element, YP_NODE_MISSING_NODE)) break; - } while (accept(parser, YP_TOKEN_COMMA)); + } } return value; diff --git a/test/snapshots/variables.txt b/test/snapshots/variables.txt index 30e31c8b777..a4373717f51 100644 --- a/test/snapshots/variables.txt +++ b/test/snapshots/variables.txt @@ -173,9 +173,13 @@ ProgramNode(0...293)( LocalVariableWriteNode(260...270)( :foo, 0, - SplatNode(266...270)( - (266...267), - LocalVariableReadNode(267...270)(:bar, 0) + ArrayNode(266...270)( + [SplatNode(266...270)( + (266...267), + LocalVariableReadNode(267...270)(:bar, 0) + )], + nil, + nil ), (260...263), (264...265) diff --git a/test/snapshots/whitequark/asgn_mrhs.txt b/test/snapshots/whitequark/asgn_mrhs.txt index 6062873bd77..fddbc439e5a 100644 --- a/test/snapshots/whitequark/asgn_mrhs.txt +++ b/test/snapshots/whitequark/asgn_mrhs.txt @@ -4,9 +4,13 @@ ProgramNode(0...41)( [LocalVariableWriteNode(0...10)( :foo, 0, - SplatNode(6...10)( - (6...7), - CallNode(7...10)(nil, nil, (7...10), nil, nil, nil, nil, 2, "bar") + ArrayNode(6...10)( + [SplatNode(6...10)( + (6...7), + CallNode(7...10)(nil, nil, (7...10), nil, nil, nil, nil, 2, "bar") + )], + nil, + nil ), (0...3), (4...5) diff --git a/test/snapshots/whitequark/masgn_splat.txt b/test/snapshots/whitequark/masgn_splat.txt index ffc9c363836..635e1ae6fdd 100644 --- a/test/snapshots/whitequark/masgn_splat.txt +++ b/test/snapshots/whitequark/masgn_splat.txt @@ -54,9 +54,23 @@ ProgramNode(0...139)( [InstanceVariableWriteNode(47...51)((47...51), nil, nil), ClassVariableWriteNode(53...58)((53...58), nil, nil)], (59...60), - SplatNode(61...65)( - (61...62), - CallNode(62...65)(nil, nil, (62...65), nil, nil, nil, nil, 2, "foo") + ArrayNode(61...65)( + [SplatNode(61...65)( + (61...62), + CallNode(62...65)( + nil, + nil, + (62...65), + nil, + nil, + nil, + nil, + 2, + "foo" + ) + )], + nil, + nil ), nil, nil