diff --git a/lib/prism/translation/ripper.rb b/lib/prism/translation/ripper.rb index 8cad131e504..f9cd6d3ada9 100644 --- a/lib/prism/translation/ripper.rb +++ b/lib/prism/translation/ripper.rb @@ -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 @@ -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 @@ -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| @@ -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) @@ -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) @@ -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 + # () # ^^ # diff --git a/test/prism/ripper_test.rb b/test/prism/ripper_test.rb index e7a9505fc72..87cac7569f7 100644 --- a/test/prism/ripper_test.rb +++ b/test/prism/ripper_test.rb @@ -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 @@ -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