github.com/powerman/golang-tools@v0.1.11-0.20220410185822-5ad214d8d803/go/callgraph/vta/testdata/src/callgraph_fields.go (about) 1 // Copyright 2021 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 // go:build ignore 6 7 package testdata 8 9 type I interface { 10 Foo() 11 } 12 13 type A struct { 14 I 15 } 16 17 func (a *A) Do() { 18 a.Foo() 19 } 20 21 type B struct{} 22 23 func (b B) Foo() {} 24 25 func NewA(b B) *A { 26 return &A{I: &b} 27 } 28 29 func Baz(b B) { 30 a := NewA(b) 31 a.Do() 32 } 33 34 // Relevant SSA: 35 // func Baz(b B): 36 // t0 = local B (b) 37 // *t0 = b 38 // t1 = *t0 39 // t2 = NewA(t1) 40 // t3 = (*A).Do(t2) 41 // return 42 // 43 // func (a *A) Do(): 44 // t0 = &a.I [#0] 45 // t1 = *t0 46 // t2 = invoke t1.Foo() 47 // return 48 // 49 // Name: (testdata.A).Foo 50 // Synthetic: wrapper for func (testdata.I).Foo() 51 // Location: testdata/callgraph_fields.go:10:2 52 // func (arg0 testdata.A) Foo(): 53 // t0 = local testdata.A () 54 // *t0 = arg0 55 // t1 = &t0.I [#0] 56 // t2 = *t1 57 // t3 = invoke t2.Foo() 58 // return 59 // 60 // Name: (*testdata.A).Foo 61 // Synthetic: wrapper for func (testdata.I).Foo() 62 // Location: testdata/callgraph_fields.go:10:2 63 // func (arg0 *testdata.A) Foo(): 64 // t0 = &arg0.I [#0] 65 // t1 = *t0 66 // t2 = invoke t1.Foo() 67 // return 68 // 69 // func (b B) Foo(): 70 // t0 = local B (b) 71 // *t0 = b 72 // return 73 // 74 // func (b *testdata.B) Foo(): 75 // t0 = ssa:wrapnilchk(b, "testdata.B":string, "Foo":string) 76 // t1 = *t0 77 // t2 = (testdata.B).Foo(t1) 78 // return 79 // 80 // func NewA(b B) *A: 81 // t0 = new B (b) 82 // *t0 = b 83 // t1 = new A (complit) 84 // t2 = &t1.I [#0] 85 // t3 = make I <- *B (t0) 86 // *t2 = t3 87 // return t1 88 89 // WANT: 90 // Baz: (*A).Do(t2) -> A.Do; NewA(t1) -> NewA 91 // A.Do: invoke t1.Foo() -> B.Foo