summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorKevin Newton <kddnewton@gmail.com>2024-01-27 15:25:04 -0500
committergit <svn-admin@ruby-lang.org>2024-01-28 01:10:47 +0000
commite256d44f984cc80039b7dd0db44a7107214548f1 (patch)
tree41615d85abc021e3d9253eb22c6d70bc64b2c8ea /lib
parent8a027d111fb5adf87dddd890e846c4814539d866 (diff)
[ruby/prism] Handle implicit rest in array pattern for parser gem
https://github.com/ruby/prism/commit/d3722d6660
Diffstat (limited to 'lib')
-rw-r--r--lib/prism/translation/parser/compiler.rb28
1 files changed, 20 insertions, 8 deletions
diff --git a/lib/prism/translation/parser/compiler.rb b/lib/prism/translation/parser/compiler.rb
index e4b4e8ad3a..d03de9efc5 100644
--- a/lib/prism/translation/parser/compiler.rb
+++ b/lib/prism/translation/parser/compiler.rb
@@ -80,10 +80,14 @@ module Prism
# foo => [bar]
# ^^^^^
def visit_array_pattern_node(node)
+ elements = [*node.requireds]
+ elements << node.rest if !node.rest.nil? && !node.rest.is_a?(ImplicitRestNode)
+ elements.concat(node.posts)
+
if node.constant
- builder.const_pattern(visit(node.constant), token(node.opening_loc), builder.array_pattern(nil, visit_all([*node.requireds, *node.rest, *node.posts]), nil), token(node.closing_loc))
+ builder.const_pattern(visit(node.constant), token(node.opening_loc), builder.array_pattern(nil, visit_all(elements), nil), token(node.closing_loc))
else
- builder.array_pattern(token(node.opening_loc), visit_all([*node.requireds, *node.rest, *node.posts]), token(node.closing_loc))
+ builder.array_pattern(token(node.opening_loc), visit_all(elements), token(node.closing_loc))
end
end
@@ -603,10 +607,14 @@ module Prism
# foo => [*, bar, *]
# ^^^^^^^^^^^
def visit_find_pattern_node(node)
+ elements = [*node.requireds]
+ elements << node.rest if !node.rest.nil? && !node.rest.is_a?(ImplicitRestNode)
+ elements.concat(node.posts)
+
if node.constant
- builder.const_pattern(visit(node.constant), token(node.opening_loc), builder.find_pattern(nil, visit_all([node.left, *node.requireds, node.right]), nil), token(node.closing_loc))
+ builder.const_pattern(visit(node.constant), token(node.opening_loc), builder.find_pattern(nil, visit_all(elements), nil), token(node.closing_loc))
else
- builder.find_pattern(token(node.opening_loc), visit_all([node.left, *node.requireds, node.right]), token(node.closing_loc))
+ builder.find_pattern(token(node.opening_loc), visit_all(elements), token(node.closing_loc))
end
end
@@ -1098,11 +1106,13 @@ module Prism
# foo, bar = baz
# ^^^^^^^^
def visit_multi_target_node(node)
- node = node.copy(rest: nil) if node.rest.is_a?(ImplicitRestNode)
+ elements = [*node.lefts]
+ elements << node.rest if !node.rest.nil? && !node.rest.is_a?(ImplicitRestNode)
+ elements.concat(node.rights)
builder.multi_lhs(
token(node.lparen_loc),
- visit_all([*node.lefts, *node.rest, *node.rights]),
+ visit_all(elements),
token(node.rparen_loc)
)
end
@@ -1110,12 +1120,14 @@ module Prism
# foo, bar = baz
# ^^^^^^^^^^^^^^
def visit_multi_write_node(node)
- node = node.copy(rest: nil) if node.rest.is_a?(ImplicitRestNode)
+ elements = [*node.lefts]
+ elements << node.rest if !node.rest.nil? && !node.rest.is_a?(ImplicitRestNode)
+ elements.concat(node.rights)
builder.multi_assign(
builder.multi_lhs(
token(node.lparen_loc),
- visit_all([*node.lefts, *node.rest, *node.rights]),
+ visit_all(elements),
token(node.rparen_loc)
),
token(node.operator_loc),