summaryrefslogtreecommitdiff
path: root/lib/prism/translation/ripper.rb
diff options
context:
space:
mode:
authorKevin Newton <kddnewton@gmail.com>2024-03-06 00:34:10 -0500
committergit <svn-admin@ruby-lang.org>2024-03-06 16:42:58 +0000
commit14877e737bcf38477d783a7d5f0dda29becc0a5b (patch)
tree907ea95327c5acf9c8545dcbb5044df11a9d6d82 /lib/prism/translation/ripper.rb
parent9018e46cc274dfe8b3a4c4e58b35f1bb84a26460 (diff)
[ruby/prism] Split up multi target visits for methods in ripper translation
https://github.com/ruby/prism/commit/4e7733491f
Diffstat (limited to 'lib/prism/translation/ripper.rb')
-rw-r--r--lib/prism/translation/ripper.rb47
1 files changed, 35 insertions, 12 deletions
diff --git a/lib/prism/translation/ripper.rb b/lib/prism/translation/ripper.rb
index 8cad131e50..f9cd6d3ada 100644
--- a/lib/prism/translation/ripper.rb
+++ b/lib/prism/translation/ripper.rb
@@ -808,16 +808,26 @@ module Prism
# foo.bar, = 1
# ^^^^^^^
def visit_call_target_node(node)
- receiver = visit(node.receiver)
+ if node.call_operator == "::"
+ receiver = visit(node.receiver)
- bounds(node.call_operator_loc)
- call_operator = visit_token(node.call_operator)
+ bounds(node.message_loc)
+ message = visit_token(node.message)
- bounds(node.message_loc)
- message = visit_token(node.message)
+ bounds(node.location)
+ on_const_path_field(receiver, message)
+ else
+ receiver = visit(node.receiver)
- bounds(node.location)
- on_field(receiver, call_operator, message)
+ bounds(node.call_operator_loc)
+ call_operator = visit_token(node.call_operator)
+
+ bounds(node.message_loc)
+ message = visit_token(node.message)
+
+ bounds(node.location)
+ on_field(receiver, call_operator, message)
+ end
end
# foo => bar => baz
@@ -1958,7 +1968,7 @@ module Prism
# ^^^^^^^^^^
def visit_multi_target_node(node)
bounds(node.location)
- targets = visit_multi_target_node_targets(node.lefts, node.rest, node.rights)
+ targets = visit_multi_target_node_targets(node.lefts, node.rest, node.rights, true)
if node.lparen_loc.nil?
targets
@@ -1969,7 +1979,11 @@ module Prism
end
# Visit the targets of a multi-target node.
- private def visit_multi_target_node_targets(lefts, rest, rights)
+ private def visit_multi_target_node_targets(lefts, rest, rights, skippable)
+ if skippable && lefts.length == 1 && lefts.first.is_a?(MultiTargetNode) && rest.nil? && rights.empty?
+ return visit(lefts.first)
+ end
+
mlhs = on_mlhs_new
lefts.each do |left|
@@ -2008,7 +2022,7 @@ module Prism
# ^^^^^^^^^^^^^^
def visit_multi_write_node(node)
bounds(node.location)
- targets = visit_multi_target_node_targets(node.lefts, node.rest, node.rights)
+ targets = visit_multi_target_node_targets(node.lefts, node.rest, node.rights, true)
unless node.lparen_loc.nil?
bounds(node.lparen_loc)
@@ -2096,10 +2110,10 @@ module Prism
# def foo(bar, *baz); end
# ^^^^^^^^^
def visit_parameters_node(node)
- requireds = visit_all(node.requireds) if node.requireds.any?
+ requireds = node.requireds.map { |required| required.is_a?(MultiTargetNode) ? visit_destructured_parameter_node(required) : visit(required) } if node.requireds.any?
optionals = visit_all(node.optionals) if node.optionals.any?
rest = visit(node.rest)
- posts = visit_all(node.posts) if node.posts.any?
+ posts = node.posts.map { |post| post.is_a?(MultiTargetNode) ? visit_destructured_parameter_node(post) : visit(post) } if node.posts.any?
keywords = visit_all(node.keywords) if node.keywords.any?
keyword_rest = visit(node.keyword_rest)
block = visit(node.block)
@@ -2108,6 +2122,15 @@ module Prism
on_params(requireds, optionals, rest, posts, keywords, keyword_rest, block)
end
+ # Visit a destructured positional parameter node.
+ private def visit_destructured_parameter_node(node)
+ bounds(node.location)
+ targets = visit_multi_target_node_targets(node.lefts, node.rest, node.rights, false)
+
+ bounds(node.lparen_loc)
+ on_mlhs_paren(targets)
+ end
+
# ()
# ^^
#