// Copyright 2024 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. package gcimporter import ( "go/types" "sync" ) // predecl is a cache for the predeclared types in types.Universe. // // Cache a distinct result based on the runtime value of any. // The pointer value of the any type varies based on GODEBUG settings. var predeclMu sync.Mutex var predecl map[types.Type][]types.Type func predeclared() []types.Type { anyt := types.Universe.Lookup("any").Type() predeclMu.Lock() defer predeclMu.Unlock() if pre, ok := predecl[anyt]; ok { return pre } if predecl == nil { predecl = make(map[types.Type][]types.Type) } decls := []types.Type{ // basic types types.Typ[types.Bool], types.Typ[types.Int], types.Typ[types.Int8], types.Typ[types.Int16], types.Typ[types.Int32], types.Typ[types.Int64], types.Typ[types.Uint], types.Typ[types.Uint8], types.Typ[types.Uint16], types.Typ[types.Uint32], types.Typ[types.Uint64], types.Typ[types.Uintptr], types.Typ[types.Float32], types.Typ[types.Float64], types.Typ[types.Complex64], types.Typ[types.Complex128], types.Typ[types.String], // basic type aliases types.Universe.Lookup("byte").Type(), types.Universe.Lookup("rune").Type(), // error types.Universe.Lookup("error").Type(), // untyped types types.Typ[types.UntypedBool], types.Typ[types.UntypedInt], types.Typ[types.UntypedRune], types.Typ[types.UntypedFloat], types.Typ[types.UntypedComplex], types.Typ[types.UntypedString], types.Typ[types.UntypedNil], // package unsafe types.Typ[types.UnsafePointer], // invalid type types.Typ[types.Invalid], // only appears in packages with errors // used internally by gc; never used by this package or in .a files anyType{}, // comparable types.Universe.Lookup("comparable").Type(), // any anyt, } predecl[anyt] = decls return decls } type anyType struct{} func (t anyType) Underlying() types.Type { return t } func (t anyType) String() string { return "any" }