// Copyright 2022 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. //go:generate go run generate.go // Package stdlib provides a table of all exported symbols in the // standard library, along with the version at which they first // appeared. package stdlib import ( "fmt" "strings" ) type Symbol struct { Name string Kind Kind Version Version // Go version that first included the symbol } // A Kind indicates the kind of a symbol: // function, variable, constant, type, and so on. type Kind int8 const ( Invalid Kind = iota // Example name: Type // "Buffer" Func // "Println" Var // "EOF" Const // "Pi" Field // "Point.X" Method // "(*Buffer).Grow" ) func (kind Kind) String() string { return [...]string{ Invalid: "invalid", Type: "type", Func: "func", Var: "var", Const: "const", Field: "field", Method: "method", }[kind] } // A Version represents a version of Go of the form "go1.%d". type Version int8 // String returns a version string of the form "go1.23", without allocating. func (v Version) String() string { return versions[v] } var versions [30]string // (increase constant as needed) func init() { for i := range versions { versions[i] = fmt.Sprintf("go1.%d", i) } } // HasPackage reports whether the specified package path is part of // the standard library's public API. func HasPackage(path string) bool { _, ok := PackageSymbols[path] return ok } // SplitField splits the field symbol name into type and field // components. It must be called only on Field symbols. // // Example: "File.Package" -> ("File", "Package") func (sym *Symbol) SplitField() (typename, name string) { if sym.Kind != Field { panic("not a field") } typename, name, _ = strings.Cut(sym.Name, ".") return } // SplitMethod splits the method symbol name into pointer, receiver, // and method components. It must be called only on Method symbols. // // Example: "(*Buffer).Grow" -> (true, "Buffer", "Grow") func (sym *Symbol) SplitMethod() (ptr bool, recv, name string) { if sym.Kind != Method { panic("not a method") } recv, name, _ = strings.Cut(sym.Name, ".") recv = recv[len("(") : len(recv)-len(")")] ptr = recv[0] == '*' if ptr { recv = recv[len("*"):] } return }