github.com/cockroachdb/tools@v0.0.0-20230222021103-a6d27438930d/go/callgraph/rta/testdata/generics.go (about)

     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  // All calls
    54  //   (*C).Foo --> (C).Foo
    55  //   (A).Foo$bound --> (A).Foo
    56  //   instantiated[main.A] --> (A).Foo
    57  //   instantiated[main.B] --> (B).Foo
    58  //   main --> (*C).Foo
    59  //   main --> (A).Foo$bound
    60  //   main --> (C).Foo
    61  //   main --> instantiated[main.A]
    62  //   main --> instantiated[main.B]
    63  //   main --> lambda[main.A]
    64  //   main --> lambda[main.A]$1
    65  //   main --> local[main.C]
    66  // Reachable functions
    67  //   (*C).Foo
    68  //   (A).Foo
    69  //   (A).Foo$bound
    70  //   (B).Foo
    71  //   (C).Foo
    72  //   instantiated[main.A]
    73  //   instantiated[main.B]
    74  //   lambda[main.A]
    75  //   lambda[main.A]$1
    76  //   local[main.C]
    77  // Reflect types
    78  //   *C
    79  //   C