github.com/powerman/golang-tools@v0.1.11-0.20220410185822-5ad214d8d803/cmd/guru/testdata/src/describe/main.go (about) 1 package describe // @describe pkgdecl "describe" 2 3 // Tests of 'describe' query. 4 // See go.tools/guru/guru_test.go for explanation. 5 // See describe.golden for expected query results. 6 7 // TODO(adonovan): more coverage of the (extensive) logic. 8 9 import ( 10 "lib" 11 "nosuchpkg" // @describe badimport1 "nosuchpkg" 12 nosuchpkg2 "nosuchpkg" // @describe badimport2 "nosuchpkg2" 13 // The unsafe package changed in Go 1.17 with the addition of 14 // unsafe.Add and unsafe.Slice. While we still support older versions 15 // of Go, the test case below cannot be enabled. 16 // _ "unsafe" // @describe unsafe "unsafe" 17 ) 18 19 var _ nosuchpkg.T 20 var _ nosuchpkg2.T 21 22 type cake float64 // @describe type-ref-builtin "float64" 23 24 const c = iota // @describe const-ref-iota "iota" 25 26 const pi = 3.141 // @describe const-def-pi "pi" 27 const pie = cake(pi) // @describe const-def-pie "pie" 28 const _ = pi // @describe const-ref-pi "pi" 29 30 var global = new(string) // NB: ssa.Global is indirect, i.e. **string 31 32 func main() { // @describe func-def-main "main" 33 // func objects 34 _ = main // @describe func-ref-main "main" 35 _ = (*C).f // @describe func-ref-*C.f "..C..f" 36 _ = D.f // @describe func-ref-D.f "D.f" 37 _ = I.f // @describe func-ref-I.f "I.f" 38 var d D // @describe type-D "D" 39 var i I // @describe type-I "I" 40 _ = d.f // @describe func-ref-d.f "d.f" 41 _ = i.f // @describe func-ref-i.f "i.f" 42 var slice []D // @describe slice-of-D "slice" 43 44 var dptr *D // @describe ptr-with-nonptr-methods "dptr" 45 _ = dptr 46 47 // var objects 48 anon := func() { 49 _ = d // @describe ref-lexical-d "d" 50 } 51 _ = anon // @describe ref-anon "anon" 52 _ = global // @describe ref-global "global" 53 54 // SSA affords some local flow sensitivity. 55 var a, b int 56 var x = &a // @describe var-def-x-1 "x" 57 _ = x // @describe var-ref-x-1 "x" 58 x = &b // @describe var-def-x-2 "x" 59 _ = x // @describe var-ref-x-2 "x" 60 61 i = new(C) // @describe var-ref-i-C "i" 62 if i != nil { 63 i = D{} // @describe var-ref-i-D "i" 64 } 65 print(i) // @describe var-ref-i "\\bi\\b" 66 67 // const objects 68 const localpi = 3.141 // @describe const-local-pi "localpi" 69 const localpie = cake(pi) // @describe const-local-pie "localpie" 70 const _ = localpi // @describe const-ref-localpi "localpi" 71 72 // type objects 73 type T int // @describe type-def-T "T" 74 var three T = 3 // @describe type-ref-T "T" 75 _ = three 76 77 print(1 + 2*3) // @describe const-expr " 2.3" 78 print(real(1+2i) - 3) // @describe const-expr2 "real.*3" 79 80 m := map[string]*int{"a": &a} 81 mapval, _ := m["a"] // @describe map-lookup,ok "m..a.." 82 _ = mapval // @describe mapval "mapval" 83 _ = m // @describe m "m" 84 85 defer main() // @describe defer-stmt "defer" 86 go main() // @describe go-stmt "go" 87 88 panic(3) // @describe builtin-ref-panic "panic" 89 90 var a2 int // @describe var-decl-stmt "var a2 int" 91 _ = a2 92 var _ int // @describe var-decl-stmt2 "var _ int" 93 var _ int // @describe var-def-blank "_" 94 95 var _ lib.Outer // @describe lib-outer "Outer" 96 97 var mmm map[C]D // @describe var-map-of-C-D "mmm" 98 99 d := newD().ThirdField // @describe field-access "ThirdField" 100 101 astCopy := ast 102 unknown() // @describe call-unknown "\\(" 103 } 104 105 type I interface { // @describe def-iface-I "I" 106 f() // @describe def-imethod-I.f "f" 107 } 108 109 type C int 110 type D struct { 111 Field int 112 AnotherField string 113 ThirdField C 114 } 115 116 func (c *C) f() {} 117 func (d D) f() {} 118 119 func newD() D { return D{} }