Source file src/cmd/vendor/golang.org/x/tools/internal/stdlib/stdlib.go
1 // Copyright 2022 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:generate go run generate.go 6 7 // Package stdlib provides a table of all exported symbols in the 8 // standard library, along with the version at which they first 9 // appeared. It also provides the import graph of std packages. 10 package stdlib 11 12 import ( 13 "fmt" 14 "strings" 15 ) 16 17 type Symbol struct { 18 Name string 19 Kind Kind 20 Version Version // Go version that first included the symbol 21 // Signature provides the type of a function (defined only for Kind=Func). 22 // Imported types are denoted as pkg.T; pkg is not fully qualified. 23 // TODO(adonovan): use an unambiguous encoding that is parseable. 24 // 25 // Example2: 26 // func[M ~map[K]V, K comparable, V any](m M) M 27 // func(fi fs.FileInfo, link string) (*Header, error) 28 Signature string // if Kind == stdlib.Func 29 } 30 31 // A Kind indicates the kind of a symbol: 32 // function, variable, constant, type, and so on. 33 type Kind int8 34 35 const ( 36 Invalid Kind = iota // Example name: 37 Type // "Buffer" 38 Func // "Println" 39 Var // "EOF" 40 Const // "Pi" 41 Field // "Point.X" 42 Method // "(*Buffer).Grow" 43 ) 44 45 func (kind Kind) String() string { 46 return [...]string{ 47 Invalid: "invalid", 48 Type: "type", 49 Func: "func", 50 Var: "var", 51 Const: "const", 52 Field: "field", 53 Method: "method", 54 }[kind] 55 } 56 57 // A Version represents a version of Go of the form "go1.%d". 58 type Version int8 59 60 // String returns a version string of the form "go1.23", without allocating. 61 func (v Version) String() string { return versions[v] } 62 63 var versions [30]string // (increase constant as needed) 64 65 func init() { 66 for i := range versions { 67 versions[i] = fmt.Sprintf("go1.%d", i) 68 } 69 } 70 71 // HasPackage reports whether the specified package path is part of 72 // the standard library's public API. 73 func HasPackage(path string) bool { 74 _, ok := PackageSymbols[path] 75 return ok 76 } 77 78 // SplitField splits the field symbol name into type and field 79 // components. It must be called only on Field symbols. 80 // 81 // Example: "File.Package" -> ("File", "Package") 82 func (sym *Symbol) SplitField() (typename, name string) { 83 if sym.Kind != Field { 84 panic("not a field") 85 } 86 typename, name, _ = strings.Cut(sym.Name, ".") 87 return 88 } 89 90 // SplitMethod splits the method symbol name into pointer, receiver, 91 // and method components. It must be called only on Method symbols. 92 // 93 // Example: "(*Buffer).Grow" -> (true, "Buffer", "Grow") 94 func (sym *Symbol) SplitMethod() (ptr bool, recv, name string) { 95 if sym.Kind != Method { 96 panic("not a method") 97 } 98 recv, name, _ = strings.Cut(sym.Name, ".") 99 recv = recv[len("(") : len(recv)-len(")")] 100 ptr = recv[0] == '*' 101 if ptr { 102 recv = recv[len("*"):] 103 } 104 return 105 } 106