Skip to content

Commit d3722d6

Browse files
committed
Handle implicit rest in array pattern for parser gem
1 parent d6d73d7 commit d3722d6

File tree

1 file changed

+20
-8
lines changed

1 file changed

+20
-8
lines changed

lib/prism/translation/parser/compiler.rb

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -80,10 +80,14 @@ def visit_array_node(node)
8080
# foo => [bar]
8181
# ^^^^^
8282
def visit_array_pattern_node(node)
83+
elements = [*node.requireds]
84+
elements << node.rest if !node.rest.nil? && !node.rest.is_a?(ImplicitRestNode)
85+
elements.concat(node.posts)
86+
8387
if node.constant
84-
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))
88+
builder.const_pattern(visit(node.constant), token(node.opening_loc), builder.array_pattern(nil, visit_all(elements), nil), token(node.closing_loc))
8589
else
86-
builder.array_pattern(token(node.opening_loc), visit_all([*node.requireds, *node.rest, *node.posts]), token(node.closing_loc))
90+
builder.array_pattern(token(node.opening_loc), visit_all(elements), token(node.closing_loc))
8791
end
8892
end
8993

@@ -603,10 +607,14 @@ def visit_false_node(node)
603607
# foo => [*, bar, *]
604608
# ^^^^^^^^^^^
605609
def visit_find_pattern_node(node)
610+
elements = [*node.requireds]
611+
elements << node.rest if !node.rest.nil? && !node.rest.is_a?(ImplicitRestNode)
612+
elements.concat(node.posts)
613+
606614
if node.constant
607-
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))
615+
builder.const_pattern(visit(node.constant), token(node.opening_loc), builder.find_pattern(nil, visit_all(elements), nil), token(node.closing_loc))
608616
else
609-
builder.find_pattern(token(node.opening_loc), visit_all([node.left, *node.requireds, node.right]), token(node.closing_loc))
617+
builder.find_pattern(token(node.opening_loc), visit_all(elements), token(node.closing_loc))
610618
end
611619
end
612620

@@ -1098,24 +1106,28 @@ def visit_module_node(node)
10981106
# foo, bar = baz
10991107
# ^^^^^^^^
11001108
def visit_multi_target_node(node)
1101-
node = node.copy(rest: nil) if node.rest.is_a?(ImplicitRestNode)
1109+
elements = [*node.lefts]
1110+
elements << node.rest if !node.rest.nil? && !node.rest.is_a?(ImplicitRestNode)
1111+
elements.concat(node.rights)
11021112

11031113
builder.multi_lhs(
11041114
token(node.lparen_loc),
1105-
visit_all([*node.lefts, *node.rest, *node.rights]),
1115+
visit_all(elements),
11061116
token(node.rparen_loc)
11071117
)
11081118
end
11091119

11101120
# foo, bar = baz
11111121
# ^^^^^^^^^^^^^^
11121122
def visit_multi_write_node(node)
1113-
node = node.copy(rest: nil) if node.rest.is_a?(ImplicitRestNode)
1123+
elements = [*node.lefts]
1124+
elements << node.rest if !node.rest.nil? && !node.rest.is_a?(ImplicitRestNode)
1125+
elements.concat(node.rights)
11141126

11151127
builder.multi_assign(
11161128
builder.multi_lhs(
11171129
token(node.lparen_loc),
1118-
visit_all([*node.lefts, *node.rest, *node.rights]),
1130+
visit_all(elements),
11191131
token(node.rparen_loc)
11201132
),
11211133
token(node.operator_loc),

0 commit comments

Comments
 (0)