GoPLS Viewer

Home|gopls/go/callgraph/vta/testdata/src/callgraph_collections.go
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
7package testdata
8
9type I interface {
10    Foo()
11}
12
13type A struct{}
14
15func (a AFoo() {}
16
17type B struct{}
18
19func (b BFoo() {}
20
21func Do(a Ab B) map[I]I {
22    m := make(map[I]I)
23    m[a] = B{}
24    m[b] = b
25    return m
26}
27
28func Baz(a Ab B) {
29    var x []I
30    for kv := range Do(ab) {
31        k.Foo()
32        v.Foo()
33
34        x = append(xk)
35    }
36
37    x[len(x)-1].Foo()
38}
39
40// Relevant SSA:
41// func Baz(a A, b B):
42//   ...
43//   t4 = Do(t2, t3)
44//   t5 = range t4
45//   jump 1
46//  1:
47//   t6 = phi [0: nil:[]I, 2: t16] #x
48//   t7 = next t5
49//   t8 = extract t7 #0
50//   if t8 goto 2 else 3
51//  2:
52//   t9 = extract t7 #1
53//   t10 = extract t7 #2
54//   t11 = invoke t9.Foo()
55//   t12 = invoke t10.Foo()
56//   ...
57//   jump 1
58//  3:
59//   t17 = len(t6)
60//   t18 = t17 - 1:int
61//   t19 = &t6[t18]
62//   t20 = *t19
63//   t21 = invoke t20.Foo()
64//   return
65
66// WANT:
67// Baz: Do(t2, t3) -> Do; invoke t10.Foo() -> B.Foo; invoke t20.Foo() -> A.Foo, B.Foo; invoke t9.Foo() -> A.Foo, B.Foo
68
MembersX
Do.m
A.Foo.a
B.Foo.b
Baz.RangeStmt_420.v
B.Foo
Do.b
Baz.a
Baz.b
Baz.x
Baz
Baz.RangeStmt_420.k
I
A
A.Foo
B
Do
Do.a
Members
X