@@ -808,16 +808,26 @@ def visit_call_or_write_node(node)
808
808
# foo.bar, = 1
809
809
# ^^^^^^^
810
810
def visit_call_target_node ( node )
811
- receiver = visit ( node . receiver )
811
+ if node . call_operator == "::"
812
+ receiver = visit ( node . receiver )
812
813
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 )
815
816
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 )
818
821
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
821
831
end
822
832
823
833
# foo => bar => baz
@@ -1958,7 +1968,7 @@ def visit_module_node(node)
1958
1968
# ^^^^^^^^^^
1959
1969
def visit_multi_target_node ( node )
1960
1970
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 )
1962
1972
1963
1973
if node . lparen_loc . nil?
1964
1974
targets
@@ -1969,7 +1979,11 @@ def visit_multi_target_node(node)
1969
1979
end
1970
1980
1971
1981
# 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
+
1973
1987
mlhs = on_mlhs_new
1974
1988
1975
1989
lefts . each do |left |
@@ -2008,7 +2022,7 @@ def visit_multi_target_node(node)
2008
2022
# ^^^^^^^^^^^^^^
2009
2023
def visit_multi_write_node ( node )
2010
2024
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 )
2012
2026
2013
2027
unless node . lparen_loc . nil?
2014
2028
bounds ( node . lparen_loc )
@@ -2096,10 +2110,10 @@ def visit_or_node(node)
2096
2110
# def foo(bar, *baz); end
2097
2111
# ^^^^^^^^^
2098
2112
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?
2100
2114
optionals = visit_all ( node . optionals ) if node . optionals . any?
2101
2115
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?
2103
2117
keywords = visit_all ( node . keywords ) if node . keywords . any?
2104
2118
keyword_rest = visit ( node . keyword_rest )
2105
2119
block = visit ( node . block )
@@ -2108,6 +2122,15 @@ def visit_parameters_node(node)
2108
2122
on_params ( requireds , optionals , rest , posts , keywords , keyword_rest , block )
2109
2123
end
2110
2124
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
+
2111
2134
# ()
2112
2135
# ^^
2113
2136
#
0 commit comments