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