@@ -426,5 +426,194 @@ def test_variables_in_the_top_level
426426 assert_equal ( 1 , variable . definitions [ 0 ] . start_line )
427427 assert_equal ( 2 , variable . usages [ 0 ] . start_line )
428428 end
429+
430+ def test_aref_field
431+ tree = SyntaxTree . parse ( <<~RUBY )
432+ object = {}
433+ object["name"] = "something"
434+ RUBY
435+
436+ visitor = Collector . new
437+ visitor . visit ( tree )
438+
439+ assert_equal ( 0 , visitor . arguments . length )
440+ assert_equal ( 1 , visitor . variables . length )
441+
442+ variable = visitor . variables [ "object" ]
443+ assert_equal ( 1 , variable . definitions . length )
444+ assert_equal ( 1 , variable . usages . length )
445+
446+ assert_equal ( 1 , variable . definitions [ 0 ] . start_line )
447+ assert_equal ( 2 , variable . usages [ 0 ] . start_line )
448+ end
449+
450+ def test_aref_on_a_method_call
451+ tree = SyntaxTree . parse ( <<~RUBY )
452+ object = MyObject.new
453+ object.attributes["name"] = "something"
454+ RUBY
455+
456+ visitor = Collector . new
457+ visitor . visit ( tree )
458+
459+ assert_equal ( 0 , visitor . arguments . length )
460+ assert_equal ( 1 , visitor . variables . length )
461+
462+ variable = visitor . variables [ "object" ]
463+ assert_equal ( 1 , variable . definitions . length )
464+ assert_equal ( 1 , variable . usages . length )
465+
466+ assert_equal ( 1 , variable . definitions [ 0 ] . start_line )
467+ assert_equal ( 2 , variable . usages [ 0 ] . start_line )
468+ end
469+
470+ def test_aref_with_two_accesses
471+ tree = SyntaxTree . parse ( <<~RUBY )
472+ object = MyObject.new
473+ object["first"]["second"] ||= []
474+ RUBY
475+
476+ visitor = Collector . new
477+ visitor . visit ( tree )
478+
479+ assert_equal ( 0 , visitor . arguments . length )
480+ assert_equal ( 1 , visitor . variables . length )
481+
482+ variable = visitor . variables [ "object" ]
483+ assert_equal ( 1 , variable . definitions . length )
484+ assert_equal ( 1 , variable . usages . length )
485+
486+ assert_equal ( 1 , variable . definitions [ 0 ] . start_line )
487+ assert_equal ( 2 , variable . usages [ 0 ] . start_line )
488+ end
489+
490+ def test_aref_on_a_method_call_with_arguments
491+ tree = SyntaxTree . parse ( <<~RUBY )
492+ object = MyObject.new
493+ object.instance_variable_get(:@attributes)[:something] = :other_thing
494+ RUBY
495+
496+ visitor = Collector . new
497+ visitor . visit ( tree )
498+
499+ assert_equal ( 0 , visitor . arguments . length )
500+ assert_equal ( 1 , visitor . variables . length )
501+
502+ variable = visitor . variables [ "object" ]
503+ assert_equal ( 1 , variable . definitions . length )
504+ assert_equal ( 1 , variable . usages . length )
505+
506+ assert_equal ( 1 , variable . definitions [ 0 ] . start_line )
507+ assert_equal ( 2 , variable . usages [ 0 ] . start_line )
508+ end
509+
510+ def test_double_aref_on_method_call
511+ tree = SyntaxTree . parse ( <<~RUBY )
512+ object = MyObject.new
513+ object["attributes"].find { |a| a["field"] == "expected" }["value"] = "changed"
514+ RUBY
515+
516+ visitor = Collector . new
517+ visitor . visit ( tree )
518+
519+ assert_equal ( 1 , visitor . arguments . length )
520+ assert_equal ( 1 , visitor . variables . length )
521+
522+ variable = visitor . variables [ "object" ]
523+ assert_equal ( 1 , variable . definitions . length )
524+ assert_equal ( 1 , variable . usages . length )
525+
526+ assert_equal ( 1 , variable . definitions [ 0 ] . start_line )
527+ assert_equal ( 2 , variable . usages [ 0 ] . start_line )
528+
529+ argument = visitor . arguments [ "a" ]
530+ assert_equal ( 1 , argument . definitions . length )
531+ assert_equal ( 1 , argument . usages . length )
532+
533+ assert_equal ( 2 , argument . definitions [ 0 ] . start_line )
534+ assert_equal ( 2 , argument . usages [ 0 ] . start_line )
535+ 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
429618 end
430619end
0 commit comments