predeclared.go raw
1 // Copyright 2024 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 package gcimporter
6
7 import (
8 "go/types"
9 "sync"
10 )
11
12 // predecl is a cache for the predeclared types in types.Universe.
13 //
14 // Cache a distinct result based on the runtime value of any.
15 // The pointer value of the any type varies based on GODEBUG settings.
16 var predeclMu sync.Mutex
17 var predecl map[types.Type][]types.Type
18
19 func predeclared() []types.Type {
20 anyt := types.Universe.Lookup("any").Type()
21
22 predeclMu.Lock()
23 defer predeclMu.Unlock()
24
25 if pre, ok := predecl[anyt]; ok {
26 return pre
27 }
28
29 if predecl == nil {
30 predecl = make(map[types.Type][]types.Type)
31 }
32
33 decls := []types.Type{ // basic types
34 types.Typ[types.Bool],
35 types.Typ[types.Int],
36 types.Typ[types.Int8],
37 types.Typ[types.Int16],
38 types.Typ[types.Int32],
39 types.Typ[types.Int64],
40 types.Typ[types.Uint],
41 types.Typ[types.Uint8],
42 types.Typ[types.Uint16],
43 types.Typ[types.Uint32],
44 types.Typ[types.Uint64],
45 types.Typ[types.Uintptr],
46 types.Typ[types.Float32],
47 types.Typ[types.Float64],
48 types.Typ[types.Complex64],
49 types.Typ[types.Complex128],
50 types.Typ[types.String],
51
52 // basic type aliases
53 types.Universe.Lookup("byte").Type(),
54 types.Universe.Lookup("rune").Type(),
55
56 // error
57 types.Universe.Lookup("error").Type(),
58
59 // untyped types
60 types.Typ[types.UntypedBool],
61 types.Typ[types.UntypedInt],
62 types.Typ[types.UntypedRune],
63 types.Typ[types.UntypedFloat],
64 types.Typ[types.UntypedComplex],
65 types.Typ[types.UntypedString],
66 types.Typ[types.UntypedNil],
67
68 // package unsafe
69 types.Typ[types.UnsafePointer],
70
71 // invalid type
72 types.Typ[types.Invalid], // only appears in packages with errors
73
74 // used internally by gc; never used by this package or in .a files
75 anyType{},
76
77 // comparable
78 types.Universe.Lookup("comparable").Type(),
79
80 // any
81 anyt,
82 }
83
84 predecl[anyt] = decls
85 return decls
86 }
87
88 type anyType struct{}
89
90 func (t anyType) Underlying() types.Type { return t }
91 func (t anyType) String() string { return "any" }
92