@@ -39,6 +39,13 @@ def visit_label(node)
3939 arguments [ [ current_scope . id , value ] ] = node
4040 end
4141 end
42+
43+ def visit_vcall ( node )
44+ local = current_scope . find_local ( node . value )
45+ variables [ [ current_scope . id , value ] ] = local if local
46+
47+ super
48+ end
4249 end
4350 end
4451
@@ -110,11 +117,7 @@ def foo
110117
111118 assert_equal ( 2 , collector . variables . length )
112119 assert_variable ( collector , "a" , definitions : [ 2 ] , usages : [ 4 , 5 ] )
113- assert_variable ( collector , "rest" , definitions : [ 4 ] )
114-
115- # Rest is considered a vcall by the parser instead of a var_ref
116- # assert_equal(1, variable_rest.usages.length)
117- # assert_equal(6, variable_rest.usages[0].start_line)
120+ assert_variable ( collector , "rest" , definitions : [ 4 ] , usages : [ 6 ] )
118121 end
119122
120123 if RUBY_VERSION >= "3.1"
@@ -349,6 +352,58 @@ def test_double_nested_arguments
349352 assert_argument ( collector , "four" , definitions : [ 1 ] , usages : [ 5 ] )
350353 end
351354
355+ def test_block_locals
356+ collector = Collector . collect ( <<~RUBY )
357+ [].each do |; a|
358+ end
359+ RUBY
360+
361+ assert_equal ( 1 , collector . variables . length )
362+
363+ assert_variable ( collector , "a" , definitions : [ 1 ] )
364+ end
365+
366+ def test_lambda_locals
367+ collector = Collector . collect ( <<~RUBY )
368+ ->(;a) { }
369+ RUBY
370+
371+ assert_equal ( 1 , collector . variables . length )
372+
373+ assert_variable ( collector , "a" , definitions : [ 1 ] )
374+ end
375+
376+ def test_regex_named_capture_groups
377+ collector = Collector . collect ( <<~RUBY )
378+ if /(?<one>\\ w+)-(?<two>\\ w+)/ =~ "something-else"
379+ one
380+ two
381+ end
382+ RUBY
383+
384+ assert_equal ( 2 , collector . variables . length )
385+
386+ assert_variable ( collector , "one" , definitions : [ 1 ] , usages : [ 2 ] )
387+ assert_variable ( collector , "two" , definitions : [ 1 ] , usages : [ 3 ] )
388+ end
389+
390+ def test_multiline_regex_named_capture_groups
391+ collector = Collector . collect ( <<~RUBY )
392+ if %r{
393+ (?<one>\\ w+)-
394+ (?<two>\\ w+)
395+ } =~ "something-else"
396+ one
397+ two
398+ end
399+ RUBY
400+
401+ assert_equal ( 2 , collector . variables . length )
402+
403+ assert_variable ( collector , "one" , definitions : [ 2 ] , usages : [ 5 ] )
404+ assert_variable ( collector , "two" , definitions : [ 3 ] , usages : [ 6 ] )
405+ end
406+
352407 class Resolver < Visitor
353408 prepend WithScope
354409
0 commit comments