Skip to content

Commit

Permalink
Split up multi target visits for methods in ripper translation
Browse files Browse the repository at this point in the history
  • Loading branch information
kddnewton committed Mar 6, 2024
1 parent 972fe60 commit 4e77334
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 16 deletions.
47 changes: 35 additions & 12 deletions lib/prism/translation/ripper.rb
Original file line number Diff line number Diff line change
Expand Up @@ -808,16 +808,26 @@ def visit_call_or_write_node(node)
# 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
Expand Down Expand Up @@ -1958,7 +1968,7 @@ def visit_module_node(node)
# ^^^^^^^^^^
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
Expand All @@ -1969,7 +1979,11 @@ def visit_multi_target_node(node)
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|
Expand Down Expand Up @@ -2008,7 +2022,7 @@ def visit_multi_target_node(node)
# ^^^^^^^^^^^^^^
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)
Expand Down Expand Up @@ -2096,10 +2110,10 @@ def visit_or_node(node)
# 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)
Expand All @@ -2108,6 +2122,15 @@ def visit_parameters_node(node)
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

# ()
# ^^
#
Expand Down
4 changes: 0 additions & 4 deletions test/prism/ripper_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -65,8 +65,6 @@ class RipperTest < TestCase
seattlerb/heredoc_squiggly_visually_blank_lines.txt
seattlerb/if_elsif.txt
seattlerb/lambda_do_vs_brace.txt
seattlerb/masgn_arg_colon_arg.txt
seattlerb/masgn_double_paren.txt
seattlerb/parse_line_dstr_escaped_newline.txt
seattlerb/parse_line_dstr_soft_newline.txt
seattlerb/parse_line_evstr_after_break.txt
Expand Down Expand Up @@ -105,8 +103,6 @@ class RipperTest < TestCase
whitequark/dedenting_non_interpolating_heredoc_line_continuation.txt
whitequark/empty_stmt.txt
whitequark/if_elsif.txt
whitequark/masgn_attr.txt
whitequark/masgn_nested.txt
whitequark/masgn_splat.txt
whitequark/numbered_args_after_27.txt
whitequark/parser_bug_640.txt
Expand Down

0 comments on commit 4e77334

Please sign in to comment.