...

Source file src/golang.org/x/tools/go/callgraph/rta/testdata/generics.go

Documentation: golang.org/x/tools/go/callgraph/rta/testdata

     1  //go:build ignore
     2  // +build ignore
     3  
     4  package main
     5  
     6  // Test of generic function calls.
     7  
     8  type I interface {
     9  	Foo()
    10  }
    11  
    12  type A struct{}
    13  
    14  func (a A) Foo() {}
    15  
    16  type B struct{}
    17  
    18  func (b B) Foo() {}
    19  
    20  func instantiated[X I](x X) {
    21  	x.Foo()
    22  }
    23  
    24  var a A
    25  var b B
    26  
    27  func main() {
    28  	instantiated[A](a) // static call
    29  	instantiated[B](b) // static call
    30  
    31  	local[C]().Foo()
    32  
    33  	lambda[A]()()()
    34  }
    35  
    36  func local[X I]() I {
    37  	var x X
    38  	return x
    39  }
    40  
    41  type C struct{}
    42  
    43  func (c C) Foo() {}
    44  
    45  func lambda[X I]() func() func() {
    46  	return func() func() {
    47  		var x X
    48  		return x.Foo
    49  	}
    50  }
    51  
    52  // WANT:
    53  //
    54  //  edge (*C).Foo --static method call--> (C).Foo
    55  //  edge (A).Foo$bound --static method call--> (A).Foo
    56  //  edge instantiated[main.A] --static method call--> (A).Foo
    57  //  edge instantiated[main.B] --static method call--> (B).Foo
    58  //  edge main --dynamic method call--> (*C).Foo
    59  //  edge main --dynamic function call--> (A).Foo$bound
    60  //  edge main --dynamic method call--> (C).Foo
    61  //  edge main --static function call--> instantiated[main.A]
    62  //  edge main --static function call--> instantiated[main.B]
    63  //  edge main --static function call--> lambda[main.A]
    64  //  edge main --dynamic function call--> lambda[main.A]$1
    65  //  edge main --static function call--> local[main.C]
    66  //
    67  //  reachable (*C).Foo
    68  //  reachable (A).Foo
    69  //  reachable (A).Foo$bound
    70  //  reachable (B).Foo
    71  //  reachable (C).Foo
    72  //  reachable instantiated[main.A]
    73  //  reachable instantiated[main.B]
    74  //  reachable lambda[main.A]
    75  //  reachable lambda[main.A]$1
    76  //  reachable local[main.C]
    77  //
    78  //  rtype *C
    79  //  rtype C
    80  

View as plain text