package types
import (
"go/constant"
"strings"
)
var Universe *Scope
var Unsafe *Package
var (
universeIota Object
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 defPredeclaredTypes() {
for _ , t := range Typ {
def (NewTypeName (nopos , nil , t .name , t ))
}
for _ , t := range basicAliases {
def (NewTypeName (nopos , nil , t .name , t ))
}
{
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 )
}
{
obj := NewTypeName (nopos , nil , "error" , nil )
obj .setColor (black )
typ := NewNamed (obj , nil , nil )
recv := NewVar (nopos , nil , "" , typ )
res := NewVar (nopos , nil , "" , Typ [String ])
sig := NewSignatureType (recv , nil , nil , nil , NewTuple (res ), false )
err := NewFunc (nopos , nil , "Error" , sig )
ityp := &Interface {methods : []*Func {err }, complete : true }
computeInterfaceTypeSet (nil , nopos , ityp )
typ .SetUnderlying (ityp )
def (obj )
}
{
obj := NewTypeName (nopos , nil , "comparable" , nil )
obj .setColor (black )
typ := NewNamed (obj , nil , nil )
ityp := &Interface {complete : true , tset : &_TypeSet {nil , allTermlist , true }}
typ .SetUnderlying (ityp )
def (obj )
}
}
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 defPredeclaredConsts() {
for _ , c := range predeclaredConsts {
def (NewConst (nopos , nil , c .name , Typ [c .kind ], c .val ))
}
}
func defPredeclaredNil() {
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 defPredeclaredFuncs() {
for i := range predeclaredFuncs {
id := builtinId (i )
if id == _Assert || id == _Trace {
continue
}
def (newBuiltin (id ))
}
}
func DefPredeclaredTestFuncs () {
if Universe .Lookup ("assert" ) != nil {
return
}
def (newBuiltin (_Assert ))
def (newBuiltin (_Trace ))
}
func init() {
Universe = NewScope (nil , nopos , 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 ()
universeError = Universe .Lookup ("error" ).Type ()
universeComparable = Universe .Lookup ("comparable" )
}
func def(obj Object ) {
assert (obj .color () == black )
name := obj .Name ()
if strings .Contains (name , " " ) {
return
}
if typ := asNamed (obj .Type ()); typ != nil {
typ .obj = obj .(*TypeName )
}
scope := Universe
if obj .Exported () {
scope = Unsafe .scope
switch obj := obj .(type ) {
case *TypeName :
obj .pkg = Unsafe
case *Builtin :
obj .pkg = Unsafe
default :
panic ("unreachable" )
}
}
if scope .Insert (obj ) != nil {
panic ("double declaration of predeclared identifier" )
}
}
The pages are generated with Golds v0.7.0-preview . (GOOS=linux GOARCH=amd64)
Golds is a Go 101 project developed by Tapir Liu .
PR and bug reports are welcome and can be submitted to the issue list .
Please follow @zigo_101 (reachable from the left QR code) to get the latest news of Golds .