Skip to content

Commit bd42046

Browse files
committed
Handle nested required arguments
Handle arguments of type [].each do |one, (two, three)| end when declaring arguments
1 parent 329ce7d commit bd42046

File tree

2 files changed

+95
-3
lines changed

2 files changed

+95
-3
lines changed

lib/syntax_tree/visitor/with_environment.rb

+13-3
Original file line numberDiff line numberDiff line change
@@ -67,9 +67,7 @@ def visit_def_endless(node)
6767
# Visit for keeping track of local arguments, such as method and block
6868
# arguments
6969
def visit_params(node)
70-
node.requireds.each do |param|
71-
current_environment.add_local_definition(param, :argument)
72-
end
70+
add_argument_definitions(node.requireds)
7371

7472
node.posts.each do |param|
7573
current_environment.add_local_definition(param, :argument)
@@ -134,5 +132,17 @@ def visit_var_ref(node)
134132

135133
super
136134
end
135+
136+
private
137+
138+
def add_argument_definitions(list)
139+
list.each do |param|
140+
if param.is_a?(SyntaxTree::MLHSParen)
141+
add_argument_definitions(param.contents.parts)
142+
else
143+
current_environment.add_local_definition(param, :argument)
144+
end
145+
end
146+
end
137147
end
138148
end

test/visitor_with_environment_test.rb

+82
Original file line numberDiff line numberDiff line change
@@ -533,5 +533,87 @@ def test_double_aref_on_method_call
533533
assert_equal(2, argument.definitions[0].start_line)
534534
assert_equal(2, argument.usages[0].start_line)
535535
end
536+
537+
def test_nested_arguments
538+
tree = SyntaxTree.parse(<<~RUBY)
539+
[[1, [2, 3]]].each do |one, (two, three)|
540+
one
541+
two
542+
three
543+
end
544+
RUBY
545+
546+
visitor = Collector.new
547+
visitor.visit(tree)
548+
549+
assert_equal(3, visitor.arguments.length)
550+
assert_equal(0, visitor.variables.length)
551+
552+
argument = visitor.arguments["one"]
553+
assert_equal(1, argument.definitions.length)
554+
assert_equal(1, argument.usages.length)
555+
556+
assert_equal(1, argument.definitions[0].start_line)
557+
assert_equal(2, argument.usages[0].start_line)
558+
559+
argument = visitor.arguments["two"]
560+
assert_equal(1, argument.definitions.length)
561+
assert_equal(1, argument.usages.length)
562+
563+
assert_equal(1, argument.definitions[0].start_line)
564+
assert_equal(3, argument.usages[0].start_line)
565+
566+
argument = visitor.arguments["three"]
567+
assert_equal(1, argument.definitions.length)
568+
assert_equal(1, argument.usages.length)
569+
570+
assert_equal(1, argument.definitions[0].start_line)
571+
assert_equal(4, argument.usages[0].start_line)
572+
end
573+
574+
def test_double_nested_arguments
575+
tree = SyntaxTree.parse(<<~RUBY)
576+
[[1, [2, 3]]].each do |one, (two, (three, four))|
577+
one
578+
two
579+
three
580+
four
581+
end
582+
RUBY
583+
584+
visitor = Collector.new
585+
visitor.visit(tree)
586+
587+
assert_equal(4, visitor.arguments.length)
588+
assert_equal(0, visitor.variables.length)
589+
590+
argument = visitor.arguments["one"]
591+
assert_equal(1, argument.definitions.length)
592+
assert_equal(1, argument.usages.length)
593+
594+
assert_equal(1, argument.definitions[0].start_line)
595+
assert_equal(2, argument.usages[0].start_line)
596+
597+
argument = visitor.arguments["two"]
598+
assert_equal(1, argument.definitions.length)
599+
assert_equal(1, argument.usages.length)
600+
601+
assert_equal(1, argument.definitions[0].start_line)
602+
assert_equal(3, argument.usages[0].start_line)
603+
604+
argument = visitor.arguments["three"]
605+
assert_equal(1, argument.definitions.length)
606+
assert_equal(1, argument.usages.length)
607+
608+
assert_equal(1, argument.definitions[0].start_line)
609+
assert_equal(4, argument.usages[0].start_line)
610+
611+
argument = visitor.arguments["four"]
612+
assert_equal(1, argument.definitions.length)
613+
assert_equal(1, argument.usages.length)
614+
615+
assert_equal(1, argument.definitions[0].start_line)
616+
assert_equal(5, argument.usages[0].start_line)
617+
end
536618
end
537619
end

0 commit comments

Comments
 (0)