Improved type system
This commit is contained in:
@ -9,10 +9,6 @@ type Array struct {
|
||||
|
||||
// Name returns the type name.
|
||||
func (a *Array) Name() string {
|
||||
if a.Of == Any {
|
||||
return "[]Any"
|
||||
}
|
||||
|
||||
return "[]" + a.Of.Name()
|
||||
}
|
||||
|
||||
|
@ -29,28 +29,36 @@ func ByName(name string, pkg string, structs map[string]*Struct) Type {
|
||||
}
|
||||
|
||||
switch name {
|
||||
case "Any":
|
||||
return Any
|
||||
case "Bool":
|
||||
return Bool
|
||||
case "Int":
|
||||
case "int":
|
||||
return Int
|
||||
case "Int64":
|
||||
case "int64":
|
||||
return Int64
|
||||
case "Int32":
|
||||
case "int32":
|
||||
return Int32
|
||||
case "Int16":
|
||||
case "int16":
|
||||
return Int16
|
||||
case "Int8":
|
||||
case "int8":
|
||||
return Int8
|
||||
case "Float":
|
||||
return Float
|
||||
case "Float64":
|
||||
return Float64
|
||||
case "Float32":
|
||||
return Float32
|
||||
case "UInt":
|
||||
case "uint":
|
||||
return UInt
|
||||
case "uint64":
|
||||
return UInt64
|
||||
case "uint32":
|
||||
return UInt32
|
||||
case "uint16":
|
||||
return UInt16
|
||||
case "uint8":
|
||||
return UInt8
|
||||
case "float":
|
||||
return Float
|
||||
case "float64":
|
||||
return Float64
|
||||
case "float32":
|
||||
return Float32
|
||||
case "bool":
|
||||
return Bool
|
||||
case "any":
|
||||
return Any
|
||||
}
|
||||
|
||||
typ, exists := structs[pkg+"."+name]
|
||||
|
@ -1,20 +1,24 @@
|
||||
package types
|
||||
|
||||
var (
|
||||
Any = &Base{name: "Any", size: 0}
|
||||
Any = &Base{name: "any", size: 0}
|
||||
AnyArray = &Array{Of: Any}
|
||||
AnyPointer = &Pointer{To: Any}
|
||||
Int64 = &Base{name: "Int64", size: 8}
|
||||
Int32 = &Base{name: "Int32", size: 4}
|
||||
Int16 = &Base{name: "Int16", size: 2}
|
||||
Int8 = &Base{name: "Int8", size: 1}
|
||||
Float64 = &Base{name: "Float64", size: 8}
|
||||
Float32 = &Base{name: "Float32", size: 4}
|
||||
Int64 = &Base{name: "int64", size: 8}
|
||||
Int32 = &Base{name: "int32", size: 4}
|
||||
Int16 = &Base{name: "int16", size: 2}
|
||||
Int8 = &Base{name: "int8", size: 1}
|
||||
Float64 = &Base{name: "float64", size: 8}
|
||||
Float32 = &Base{name: "float32", size: 4}
|
||||
)
|
||||
|
||||
var (
|
||||
Bool = Int
|
||||
Int = Int64
|
||||
Float = Float64
|
||||
UInt = Int
|
||||
Bool = Int
|
||||
Int = Int64
|
||||
Float = Float64
|
||||
UInt = Int
|
||||
UInt64 = Int64
|
||||
UInt32 = Int32
|
||||
UInt16 = Int16
|
||||
UInt8 = Int8
|
||||
)
|
||||
|
@ -25,5 +25,10 @@ func Is(a Type, b Type) bool {
|
||||
return true
|
||||
}
|
||||
|
||||
// Temporary hack for implicit casts
|
||||
if a.Size() > b.Size() {
|
||||
return true
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
||||
|
@ -7,10 +7,6 @@ type Pointer struct {
|
||||
|
||||
// Name returns the type name.
|
||||
func (p *Pointer) Name() string {
|
||||
if p.To == nil {
|
||||
return "*Any"
|
||||
}
|
||||
|
||||
return "*" + p.To.Name()
|
||||
}
|
||||
|
||||
|
@ -8,12 +8,12 @@ import (
|
||||
)
|
||||
|
||||
func TestName(t *testing.T) {
|
||||
assert.Equal(t, types.Int.Name(), "Int64")
|
||||
assert.Equal(t, types.AnyArray.Name(), "[]Any")
|
||||
assert.Equal(t, types.AnyPointer.Name(), "*Any")
|
||||
assert.Equal(t, (&types.Pointer{To: types.Int}).Name(), "*Int64")
|
||||
assert.Equal(t, (&types.Array{Of: types.Int}).Name(), "[]Int64")
|
||||
assert.Equal(t, types.String.Name(), "[]Int8")
|
||||
assert.Equal(t, types.Int.Name(), "int64")
|
||||
assert.Equal(t, types.AnyArray.Name(), "[]any")
|
||||
assert.Equal(t, types.AnyPointer.Name(), "*any")
|
||||
assert.Equal(t, (&types.Pointer{To: types.Int}).Name(), "*int64")
|
||||
assert.Equal(t, (&types.Array{Of: types.Int}).Name(), "[]int64")
|
||||
assert.Equal(t, types.String.Name(), "[]int8")
|
||||
}
|
||||
|
||||
func TestSize(t *testing.T) {
|
||||
@ -32,7 +32,7 @@ func TestStruct(t *testing.T) {
|
||||
s := types.NewStruct("main", "Test")
|
||||
assert.Equal(t, s.Name(), "Test")
|
||||
assert.Equal(t, s.Size(), 0)
|
||||
field := &types.Field{Name: "TestField", TypeName: "Int8"}
|
||||
field := &types.Field{Name: "TestField", TypeName: "int8"}
|
||||
s.AddField(field)
|
||||
s.Update(nil)
|
||||
assert.Equal(t, s.Size(), 1)
|
||||
|
Reference in New Issue
Block a user