summaryrefslogtreecommitdiff
path: root/src/pkg/go/typechecker/type.go
blob: 62b4e9d3e4ad57eb57ec98319ee1da70a2c39563 (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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
// Copyright 2010 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 typechecker

import "go/ast"


// A Type represents a Go type.
type Type struct {
	Form     Form
	Obj      *ast.Object // corresponding type name, or nil
	Scope    *ast.Scope  // fields and methods, always present
	N        uint        // basic type id, array length, number of function results, or channel direction
	Key, Elt *Type       // map key and array, pointer, slice, map or channel element
	Params   *ast.Scope  // function (receiver, input and result) parameters, tuple expressions (results of function calls), or nil
	Expr     ast.Expr    // corresponding AST expression
}


// NewType creates a new type of a given form.
func NewType(form Form) *Type {
	return &Type{Form: form, Scope: ast.NewScope(nil)}
}


// Form describes the form of a type.
type Form int

// The list of possible type forms.
const (
	BadType    Form = iota // for error handling
	Unresolved             // type not fully setup
	Basic
	Array
	Struct
	Pointer
	Function
	Method
	Interface
	Slice
	Map
	Channel
	Tuple
)


var formStrings = [...]string{
	BadType:    "badType",
	Unresolved: "unresolved",
	Basic:      "basic",
	Array:      "array",
	Struct:     "struct",
	Pointer:    "pointer",
	Function:   "function",
	Method:     "method",
	Interface:  "interface",
	Slice:      "slice",
	Map:        "map",
	Channel:    "channel",
	Tuple:      "tuple",
}


func (form Form) String() string { return formStrings[form] }


// The list of basic type id's.
const (
	Bool = iota
	Byte
	Uint
	Int
	Float
	Complex
	Uintptr
	String

	Uint8
	Uint16
	Uint32
	Uint64

	Int8
	Int16
	Int32
	Int64

	Float32
	Float64

	Complex64
	Complex128

	// TODO(gri) ideal types are missing
)


var BasicTypes = map[uint]string{
	Bool:    "bool",
	Byte:    "byte",
	Uint:    "uint",
	Int:     "int",
	Float:   "float",
	Complex: "complex",
	Uintptr: "uintptr",
	String:  "string",

	Uint8:  "uint8",
	Uint16: "uint16",
	Uint32: "uint32",
	Uint64: "uint64",

	Int8:  "int8",
	Int16: "int16",
	Int32: "int32",
	Int64: "int64",

	Float32: "float32",
	Float64: "float64",

	Complex64:  "complex64",
	Complex128: "complex128",
}