package types
import (
)
var Universe *Scope
var Unsafe *Package
var (
universeIota Object
universeByte Type
universeRune Type
universeAny Object
universeError Type
universeComparable Object
)
var Typ = []*Basic{
Invalid: {Invalid, 0, "invalid type"},
Bool: {Bool, IsBoolean, "bool"},
Int: {Int, IsInteger, "int"},
Int8: {Int8, IsInteger, "int8"},
Int16: {Int16, IsInteger, "int16"},
Int32: {Int32, IsInteger, "int32"},
Int64: {Int64, IsInteger, "int64"},
Uint: {Uint, IsInteger | IsUnsigned, "uint"},
Uint8: {Uint8, IsInteger | IsUnsigned, "uint8"},
Uint16: {Uint16, IsInteger | IsUnsigned, "uint16"},
Uint32: {Uint32, IsInteger | IsUnsigned, "uint32"},
Uint64: {Uint64, IsInteger | IsUnsigned, "uint64"},
Uintptr: {Uintptr, IsInteger | IsUnsigned, "uintptr"},
Float32: {Float32, IsFloat, "float32"},
Float64: {Float64, IsFloat, "float64"},
Complex64: {Complex64, IsComplex, "complex64"},
Complex128: {Complex128, IsComplex, "complex128"},
String: {String, IsString, "string"},
UnsafePointer: {UnsafePointer, 0, "Pointer"},
UntypedBool: {UntypedBool, IsBoolean | IsUntyped, "untyped bool"},
UntypedInt: {UntypedInt, IsInteger | IsUntyped, "untyped int"},
UntypedRune: {UntypedRune, IsInteger | IsUntyped, "untyped rune"},
UntypedFloat: {UntypedFloat, IsFloat | IsUntyped, "untyped float"},
UntypedComplex: {UntypedComplex, IsComplex | IsUntyped, "untyped complex"},
UntypedString: {UntypedString, IsString | IsUntyped, "untyped string"},
UntypedNil: {UntypedNil, IsUntyped, "untyped nil"},
}
var aliases = [...]*Basic{
{Byte, IsInteger | IsUnsigned, "byte"},
{Rune, IsInteger, "rune"},
}
func () {
for , := range Typ {
def(NewTypeName(token.NoPos, nil, .name, ))
}
for , := range aliases {
def(NewTypeName(token.NoPos, nil, .name, ))
}
def(NewTypeName(token.NoPos, nil, "any", &Interface{complete: true, tset: &topTypeSet}))
{
:= NewTypeName(token.NoPos, nil, "error", nil)
.setColor(black)
:= NewNamed(, nil, nil)
:= NewVar(token.NoPos, nil, "", )
:= NewVar(token.NoPos, nil, "", Typ[String])
:= NewSignatureType(, nil, nil, nil, NewTuple(), false)
:= NewFunc(token.NoPos, nil, "Error", )
:= &Interface{obj: , methods: []*Func{}, complete: true}
computeInterfaceTypeSet(nil, token.NoPos, )
.SetUnderlying()
def()
}
{
:= NewTypeName(token.NoPos, nil, "comparable", nil)
.setColor(black)
:= NewNamed(, nil, nil)
:= &Interface{obj: , complete: true, tset: &_TypeSet{nil, allTermlist, true}}
.SetUnderlying()
def()
}
}
var predeclaredConsts = [...]struct {
name string
kind BasicKind
val constant.Value
}{
{"true", UntypedBool, constant.MakeBool(true)},
{"false", UntypedBool, constant.MakeBool(false)},
{"iota", UntypedInt, constant.MakeInt64(0)},
}
func () {
for , := range predeclaredConsts {
def(NewConst(token.NoPos, nil, .name, Typ[.kind], .val))
}
}
func () {
def(&Nil{object{name: "nil", typ: Typ[UntypedNil], color_: black}})
}
type builtinId int
const (
_Append builtinId = iota
_Cap
_Close
_Complex
_Copy
_Delete
_Imag
_Len
_Make
_New
_Panic
_Print
_Println
_Real
_Recover
_Add
_Alignof
_Offsetof
_Sizeof
_Slice
_Assert
_Trace
)
var predeclaredFuncs = [...]struct {
name string
nargs int
variadic bool
kind exprKind
}{
_Append: {"append", 1, true, expression},
_Cap: {"cap", 1, false, expression},
_Close: {"close", 1, false, statement},
_Complex: {"complex", 2, false, expression},
_Copy: {"copy", 2, false, statement},
_Delete: {"delete", 2, false, statement},
_Imag: {"imag", 1, false, expression},
_Len: {"len", 1, false, expression},
_Make: {"make", 1, true, expression},
_New: {"new", 1, false, expression},
_Panic: {"panic", 1, false, statement},
_Print: {"print", 0, true, statement},
_Println: {"println", 0, true, statement},
_Real: {"real", 1, false, expression},
_Recover: {"recover", 0, false, statement},
_Add: {"Add", 2, false, expression},
_Alignof: {"Alignof", 1, false, expression},
_Offsetof: {"Offsetof", 1, false, expression},
_Sizeof: {"Sizeof", 1, false, expression},
_Slice: {"Slice", 2, false, expression},
_Assert: {"assert", 1, false, statement},
_Trace: {"trace", 0, true, statement},
}
func () {
for := range predeclaredFuncs {
:= builtinId()
if == _Assert || == _Trace {
continue
}
def(newBuiltin())
}
}
func () {
if Universe.Lookup("assert") != nil {
return
}
def(newBuiltin(_Assert))
def(newBuiltin(_Trace))
}
func () {
Universe = NewScope(nil, token.NoPos, token.NoPos, "universe")
Unsafe = NewPackage("unsafe", "unsafe")
Unsafe.complete = true
defPredeclaredTypes()
defPredeclaredConsts()
defPredeclaredNil()
defPredeclaredFuncs()
universeIota = Universe.Lookup("iota")
universeByte = Universe.Lookup("byte").Type()
universeRune = Universe.Lookup("rune").Type()
universeAny = Universe.Lookup("any")
universeError = Universe.Lookup("error").Type()
universeComparable = Universe.Lookup("comparable")
}
func ( Object) {
assert(.color() == black)
:= .Name()
if strings.Contains(, " ") {
return
}
if , := .Type().(*Named); != nil {
.obj = .(*TypeName)
}
:= Universe
if .Exported() {
= Unsafe.scope
switch obj := .(type) {
case *TypeName:
.pkg = Unsafe
case *Builtin:
.pkg = Unsafe
default:
unreachable()
}
}
if .Insert() != nil {
panic("double declaration of predeclared identifier")
}
}