type unit … // assert panics with the mesage msg if p is false. // Avoid combining with expensive string formatting. func assert(p bool, msg string) { … } func unparen(e ast.Expr) ast.Expr { … } // isBlankIdent returns true iff e is an Ident with name "_". // They have no associated types.Object, and thus no type. func isBlankIdent(e ast.Expr) bool { … } // isNonTypeParamInterface reports whether t is an interface type but not a type parameter. func isNonTypeParamInterface(t types.Type) bool { … } // isBasic reports whether t is a basic type. // t is assumed to be an Underlying type (not Named or Alias). func isBasic(t types.Type) bool { … } // isString reports whether t is exactly a string type. // t is assumed to be an Underlying type (not Named or Alias). func isString(t types.Type) bool { … } // isByteSlice reports whether t is of the form []~bytes. // t is assumed to be an Underlying type (not Named or Alias). func isByteSlice(t types.Type) bool { … } // isRuneSlice reports whether t is of the form []~runes. // t is assumed to be an Underlying type (not Named or Alias). func isRuneSlice(t types.Type) bool { … } // isBasicConvTypes returns true when a type set can be // one side of a Convert operation. This is when: // - All are basic, []byte, or []rune. // - At least 1 is basic. // - At most 1 is []byte or []rune. func isBasicConvTypes(tset termList) bool { … } // isPointer reports whether t's underlying type is a pointer. func isPointer(t types.Type) bool { … } // isPointerCore reports whether t's core type is a pointer. // // (Most pointer manipulation is related to receivers, in which case // isPointer is appropriate. tecallers can use isPointer(t). func isPointerCore(t types.Type) bool { … } func is[T any](x any) bool { … } // recvType returns the receiver type of method obj. func recvType(obj *types.Func) types.Type { … } // fieldOf returns the index'th field of the (core type of) a struct type; // otherwise returns nil. func fieldOf(typ types.Type, index int) *types.Var { … } // isUntyped reports whether typ is the type of an untyped constant. func isUntyped(typ types.Type) bool { … } // declaredWithin reports whether an object is declared within a function. // // obj must not be a method or a field. func declaredWithin(obj types.Object, fn *types.Func) bool { … } // logStack prints the formatted "start" message to stderr and // returns a closure that prints the corresponding "end" message. // Call using 'defer logStack(...)()' to show builder stack on panic. // Don't forget trailing parens! func logStack(format string, args ...interface{ … } // newVar creates a 'var' for use in a types.Tuple. func newVar(name string, typ types.Type) *types.Var { … } // anonVar creates an anonymous 'var' for use in a types.Tuple. func anonVar(typ types.Type) *types.Var { … } var lenResults … // makeLen returns the len builtin specialized to type func(T)int. func makeLen(T types.Type) *Builtin { … } // receiverTypeArgs returns the type arguments to a method's receiver. // Returns an empty list if the receiver does not have type arguments. func receiverTypeArgs(method *types.Func) []types.Type { … } // recvAsFirstArg takes a method signature and returns a function // signature with receiver as the first parameter. func recvAsFirstArg(sig *types.Signature) *types.Signature { … } // instance returns whether an expression is a simple or qualified identifier // that is a generic instantiation. func instance(info *types.Info, expr ast.Expr) bool { … } // instanceArgs returns the Instance[id].TypeArgs as a slice. func instanceArgs(info *types.Info, id *ast.Ident) []types.Type { … } type canonizer … func newCanonizer() *canonizer { … } // List returns a canonical representative of a list of types. // Representative of the empty list is nil. func (c *canonizer) List(ts []types.Type) *typeList { … } // Type returns a canonical representative of type T. // Removes top-level aliases. // // For performance, reasons the canonical instance is order-dependent, // and may contain deeply nested aliases. func (c *canonizer) Type(T types.Type) types.Type { … } type typeList … func (l *typeList) identical(ts []types.Type) bool { … } type typeListMap … // rep returns a canonical representative of a slice of types. func (m *typeListMap) rep(ts []types.Type) *typeList { … } func (m *typeListMap) hash(ts []types.Type) uint32 { … } // instantiateMethod instantiates m with targs and returns a canonical representative for this method. func (canon *canonizer) instantiateMethod(m *types.Func, targs []types.Type, ctxt *types.Context) *types.Func { … } // Exposed to ssautil using the linkname hack. func isSyntactic(pkg *Package) bool { … } // mapValues returns a new unordered array of map values. func mapValues[K comparable, V any](m map[K]V) []V { … }