diff --git a/lib/syntax_tree/node.rb b/lib/syntax_tree/node.rb index a2c78677..3b676552 100644 --- a/lib/syntax_tree/node.rb +++ b/lib/syntax_tree/node.rb @@ -8277,8 +8277,8 @@ def format(q) # parameter attr_reader :rest - # [Array[ Ident ]] any positional parameters that exist after a rest - # parameter + # [Array[ Ident | MLHSParen ]] any positional parameters that exist after a + # rest parameter attr_reader :posts # [Array[ [ Label, nil | Node ] ]] any keyword parameters and their diff --git a/lib/syntax_tree/with_scope.rb b/lib/syntax_tree/with_scope.rb index c479fd3e..8c4908f3 100644 --- a/lib/syntax_tree/with_scope.rb +++ b/lib/syntax_tree/with_scope.rb @@ -152,10 +152,7 @@ def visit_def(node) # arguments. def visit_params(node) add_argument_definitions(node.requireds) - - node.posts.each do |param| - current_scope.add_local_definition(param, :argument) - end + add_argument_definitions(node.posts) node.keywords.each do |param| current_scope.add_local_definition(param.first, :argument) diff --git a/test/with_scope_test.rb b/test/with_scope_test.rb index 5bf276be..6b48d17d 100644 --- a/test/with_scope_test.rb +++ b/test/with_scope_test.rb @@ -154,6 +154,42 @@ def foo(a) assert_argument(collector, "a", definitions: [1], usages: [2]) end + def test_collecting_methods_with_destructured_post_arguments + collector = Collector.collect(<<~RUBY) + def foo(optional = 1, (bin, bag)) + end + RUBY + + assert_equal(3, collector.arguments.length) + assert_argument(collector, "optional", definitions: [1], usages: []) + assert_argument(collector, "bin", definitions: [1], usages: []) + assert_argument(collector, "bag", definitions: [1], usages: []) + end + + def test_collecting_methods_with_desctructured_post_using_splat + collector = Collector.collect(<<~RUBY) + def foo(optional = 1, (bin, bag, *)) + end + RUBY + + assert_equal(3, collector.arguments.length) + assert_argument(collector, "optional", definitions: [1], usages: []) + assert_argument(collector, "bin", definitions: [1], usages: []) + assert_argument(collector, "bag", definitions: [1], usages: []) + end + + def test_collecting_methods_with_nested_desctructured + collector = Collector.collect(<<~RUBY) + def foo(optional = 1, (bin, (bag))) + end + RUBY + + assert_equal(3, collector.arguments.length) + assert_argument(collector, "optional", definitions: [1], usages: []) + assert_argument(collector, "bin", definitions: [1], usages: []) + assert_argument(collector, "bag", definitions: [1], usages: []) + end + def test_collecting_singleton_method_arguments collector = Collector.collect(<<~RUBY) def self.foo(a)