package types
import (
)
var Universe *Scope
var Unsafe *Package
var (
universeIota Object
universeBool Type
universeByte Type
universeRune Type
universeAnyNoAlias *TypeName
universeAnyAlias *TypeName
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 basicAliases = [...]*Basic{
{Byte, IsInteger | IsUnsigned, "byte"},
{Rune, IsInteger, "rune"},
}
func () {
for , := range Typ {
def(NewTypeName(nopos, nil, .name, ))
}
for , := range basicAliases {
def(NewTypeName(nopos, nil, .name, ))
}
{
universeAnyNoAlias = NewTypeName(nopos, nil, "any", &Interface{complete: true, tset: &topTypeSet})
universeAnyNoAlias.setColor(black)
universeAnyNoAlias.setParent(Universe)
universeAnyAlias = NewTypeName(nopos, nil, "any", nil)
universeAnyAlias.setColor(black)
_ = NewAlias(universeAnyAlias, universeAnyNoAlias.Type().Underlying())
def(universeAnyAlias)
}
{
:= NewTypeName(nopos, nil, "error", nil)
.setColor(black)
:= NewNamed(, nil, nil)
:= NewVar(nopos, nil, "", )
:= NewVar(nopos, nil, "", Typ[String])
:= NewSignatureType(, nil, nil, nil, NewTuple(), false)
:= NewFunc(nopos, nil, "Error", )
:= &Interface{methods: []*Func{}, complete: true}
computeInterfaceTypeSet(nil, nopos, )
.SetUnderlying()
def()
}
{
:= NewTypeName(nopos, nil, "comparable", nil)
.setColor(black)
:= NewNamed(, nil, nil)
:= &Interface{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(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
_Clear
_Close
_Complex
_Copy
_Delete
_Imag
_Len
_Make
_Max
_Min
_New
_Panic
_Print
_Println
_Real
_Recover
_Add
_Alignof
_Offsetof
_Sizeof
_Slice
_SliceData
_String
_StringData
_Assert
_Trace
)
var predeclaredFuncs = [...]struct {
name string
nargs int
variadic bool
kind exprKind
}{
_Append: {"append", 1, true, expression},
_Cap: {"cap", 1, false, expression},
_Clear: {"clear", 1, false, statement},
_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},
_Max: {"max", 1, true, expression},
_Min: {"min", 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},
_SliceData: {"SliceData", 1, false, expression},
_String: {"String", 2, false, expression},
_StringData: {"StringData", 1, 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, nopos, nopos, "universe")
Unsafe = NewPackage("unsafe", "unsafe")
Unsafe.complete = true
defPredeclaredTypes()
defPredeclaredConsts()
defPredeclaredNil()
defPredeclaredFuncs()
universeIota = Universe.Lookup("iota")
universeBool = Universe.Lookup("bool").Type()
universeByte = Universe.Lookup("byte").Type()
universeRune = Universe.Lookup("rune").Type()
universeError = Universe.Lookup("error").Type()
universeComparable = Universe.Lookup("comparable")
}
func ( Object) {
assert(.color() == black)
:= .Name()
if strings.Contains(, " ") {
return
}
if := asNamed(.Type()); != nil {
.obj = .(*TypeName)
}
:= Universe
if .Exported() {
= Unsafe.scope
switch obj := .(type) {
case *TypeName:
.pkg = Unsafe
case *Builtin:
.pkg = Unsafe
default:
panic("unreachable")
}
}
if .Insert() != nil {
panic("double declaration of predeclared identifier")
}
}