Skip to content

Commit 4e77334

Browse files
committed
Split up multi target visits for methods in ripper translation
1 parent 972fe60 commit 4e77334

File tree

2 files changed

+35
-16
lines changed

2 files changed

+35
-16
lines changed

lib/prism/translation/ripper.rb

Lines changed: 35 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -808,16 +808,26 @@ def visit_call_or_write_node(node)
808808
# foo.bar, = 1
809809
# ^^^^^^^
810810
def visit_call_target_node(node)
811-
receiver = visit(node.receiver)
811+
if node.call_operator == "::"
812+
receiver = visit(node.receiver)
812813

813-
bounds(node.call_operator_loc)
814-
call_operator = visit_token(node.call_operator)
814+
bounds(node.message_loc)
815+
message = visit_token(node.message)
815816

816-
bounds(node.message_loc)
817-
message = visit_token(node.message)
817+
bounds(node.location)
818+
on_const_path_field(receiver, message)
819+
else
820+
receiver = visit(node.receiver)
818821

819-
bounds(node.location)
820-
on_field(receiver, call_operator, message)
822+
bounds(node.call_operator_loc)
823+
call_operator = visit_token(node.call_operator)
824+
825+
bounds(node.message_loc)
826+
message = visit_token(node.message)
827+
828+
bounds(node.location)
829+
on_field(receiver, call_operator, message)
830+
end
821831
end
822832

823833
# foo => bar => baz
@@ -1958,7 +1968,7 @@ def visit_module_node(node)
19581968
# ^^^^^^^^^^
19591969
def visit_multi_target_node(node)
19601970
bounds(node.location)
1961-
targets = visit_multi_target_node_targets(node.lefts, node.rest, node.rights)
1971+
targets = visit_multi_target_node_targets(node.lefts, node.rest, node.rights, true)
19621972

19631973
if node.lparen_loc.nil?
19641974
targets
@@ -1969,7 +1979,11 @@ def visit_multi_target_node(node)
19691979
end
19701980

19711981
# Visit the targets of a multi-target node.
1972-
private def visit_multi_target_node_targets(lefts, rest, rights)
1982+
private def visit_multi_target_node_targets(lefts, rest, rights, skippable)
1983+
if skippable && lefts.length == 1 && lefts.first.is_a?(MultiTargetNode) && rest.nil? && rights.empty?
1984+
return visit(lefts.first)
1985+
end
1986+
19731987
mlhs = on_mlhs_new
19741988

19751989
lefts.each do |left|
@@ -2008,7 +2022,7 @@ def visit_multi_target_node(node)
20082022
# ^^^^^^^^^^^^^^
20092023
def visit_multi_write_node(node)
20102024
bounds(node.location)
2011-
targets = visit_multi_target_node_targets(node.lefts, node.rest, node.rights)
2025+
targets = visit_multi_target_node_targets(node.lefts, node.rest, node.rights, true)
20122026

20132027
unless node.lparen_loc.nil?
20142028
bounds(node.lparen_loc)
@@ -2096,10 +2110,10 @@ def visit_or_node(node)
20962110
# def foo(bar, *baz); end
20972111
# ^^^^^^^^^
20982112
def visit_parameters_node(node)
2099-
requireds = visit_all(node.requireds) if node.requireds.any?
2113+
requireds = node.requireds.map { |required| required.is_a?(MultiTargetNode) ? visit_destructured_parameter_node(required) : visit(required) } if node.requireds.any?
21002114
optionals = visit_all(node.optionals) if node.optionals.any?
21012115
rest = visit(node.rest)
2102-
posts = visit_all(node.posts) if node.posts.any?
2116+
posts = node.posts.map { |post| post.is_a?(MultiTargetNode) ? visit_destructured_parameter_node(post) : visit(post) } if node.posts.any?
21032117
keywords = visit_all(node.keywords) if node.keywords.any?
21042118
keyword_rest = visit(node.keyword_rest)
21052119
block = visit(node.block)
@@ -2108,6 +2122,15 @@ def visit_parameters_node(node)
21082122
on_params(requireds, optionals, rest, posts, keywords, keyword_rest, block)
21092123
end
21102124

2125+
# Visit a destructured positional parameter node.
2126+
private def visit_destructured_parameter_node(node)
2127+
bounds(node.location)
2128+
targets = visit_multi_target_node_targets(node.lefts, node.rest, node.rights, false)
2129+
2130+
bounds(node.lparen_loc)
2131+
on_mlhs_paren(targets)
2132+
end
2133+
21112134
# ()
21122135
# ^^
21132136
#

test/prism/ripper_test.rb

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -65,8 +65,6 @@ class RipperTest < TestCase
6565
seattlerb/heredoc_squiggly_visually_blank_lines.txt
6666
seattlerb/if_elsif.txt
6767
seattlerb/lambda_do_vs_brace.txt
68-
seattlerb/masgn_arg_colon_arg.txt
69-
seattlerb/masgn_double_paren.txt
7068
seattlerb/parse_line_dstr_escaped_newline.txt
7169
seattlerb/parse_line_dstr_soft_newline.txt
7270
seattlerb/parse_line_evstr_after_break.txt
@@ -105,8 +103,6 @@ class RipperTest < TestCase
105103
whitequark/dedenting_non_interpolating_heredoc_line_continuation.txt
106104
whitequark/empty_stmt.txt
107105
whitequark/if_elsif.txt
108-
whitequark/masgn_attr.txt
109-
whitequark/masgn_nested.txt
110106
whitequark/masgn_splat.txt
111107
whitequark/numbered_args_after_27.txt
112108
whitequark/parser_bug_640.txt

0 commit comments

Comments
 (0)