Skip to content

Commit fcc974a

Browse files
committed
Fix WithScope for destructured post arguments
1 parent ff67961 commit fcc974a

File tree

3 files changed

+39
-6
lines changed

3 files changed

+39
-6
lines changed

lib/syntax_tree/node.rb

+2-2
Original file line numberDiff line numberDiff line change
@@ -8277,8 +8277,8 @@ def format(q)
82778277
# parameter
82788278
attr_reader :rest
82798279

8280-
# [Array[ Ident ]] any positional parameters that exist after a rest
8281-
# parameter
8280+
# [Array[ Ident | MLHSParen ]] any positional parameters that exist after a
8281+
# rest parameter
82828282
attr_reader :posts
82838283

82848284
# [Array[ [ Label, nil | Node ] ]] any keyword parameters and their

lib/syntax_tree/with_scope.rb

+1-4
Original file line numberDiff line numberDiff line change
@@ -152,10 +152,7 @@ def visit_def(node)
152152
# arguments.
153153
def visit_params(node)
154154
add_argument_definitions(node.requireds)
155-
156-
node.posts.each do |param|
157-
current_scope.add_local_definition(param, :argument)
158-
end
155+
add_argument_definitions(node.posts)
159156

160157
node.keywords.each do |param|
161158
current_scope.add_local_definition(param.first, :argument)

test/with_scope_test.rb

+36
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,42 @@ def foo(a)
154154
assert_argument(collector, "a", definitions: [1], usages: [2])
155155
end
156156

157+
def test_collecting_methods_with_destructured_post_arguments
158+
collector = Collector.collect(<<~RUBY)
159+
def foo(optional = 1, (bin, bag))
160+
end
161+
RUBY
162+
163+
assert_equal(3, collector.arguments.length)
164+
assert_argument(collector, "optional", definitions: [1], usages: [])
165+
assert_argument(collector, "bin", definitions: [1], usages: [])
166+
assert_argument(collector, "bag", definitions: [1], usages: [])
167+
end
168+
169+
def test_collecting_methods_with_desctructured_post_using_splat
170+
collector = Collector.collect(<<~RUBY)
171+
def foo(optional = 1, (bin, bag, *))
172+
end
173+
RUBY
174+
175+
assert_equal(3, collector.arguments.length)
176+
assert_argument(collector, "optional", definitions: [1], usages: [])
177+
assert_argument(collector, "bin", definitions: [1], usages: [])
178+
assert_argument(collector, "bag", definitions: [1], usages: [])
179+
end
180+
181+
def test_collecting_methods_with_nested_desctructured
182+
collector = Collector.collect(<<~RUBY)
183+
def foo(optional = 1, (bin, (bag)))
184+
end
185+
RUBY
186+
187+
assert_equal(3, collector.arguments.length)
188+
assert_argument(collector, "optional", definitions: [1], usages: [])
189+
assert_argument(collector, "bin", definitions: [1], usages: [])
190+
assert_argument(collector, "bag", definitions: [1], usages: [])
191+
end
192+
157193
def test_collecting_singleton_method_arguments
158194
collector = Collector.collect(<<~RUBY)
159195
def self.foo(a)

0 commit comments

Comments
 (0)