Improved type system

This commit is contained in:
2025-02-17 14:31:47 +01:00
parent 3550f9e24e
commit b8e37fafae
62 changed files with 189 additions and 172 deletions

View File

@ -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()
}

View File

@ -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]

View File

@ -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
)

View File

@ -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
}

View File

@ -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()
}

View File

@ -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)