summaryrefslogtreecommitdiff
path: root/vendor/golang.org/x/tools/internal/gcimporter/predeclared.go
blob: 907c8557a541440591e17579bbd305b5f0fe6ff6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
// 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" }