Fix checker with int/float sums

This commit is contained in:
Anton Medvedev
2022-10-21 22:02:51 +02:00
parent 1a4d016697
commit f94fe06d80
3 changed files with 25 additions and 34 deletions
+18
View File
@@ -501,6 +501,24 @@ func TestCheck_error(t *testing.T) {
}
}
func TestCheck_FloatVsInt(t *testing.T) {
tree, err := parser.Parse(`Int + Float`)
require.NoError(t, err)
typ, err := checker.Check(tree, conf.New(mock.Env{}))
assert.NoError(t, err)
assert.Equal(t, typ.Kind(), reflect.Float64)
}
func TestCheck_IntSums(t *testing.T) {
tree, err := parser.Parse(`Uint32 + Int32`)
require.NoError(t, err)
typ, err := checker.Check(tree, conf.New(mock.Env{}))
assert.NoError(t, err)
assert.Equal(t, typ.Kind(), reflect.Int)
}
func TestVisitor_ConstantNode(t *testing.T) {
tree, err := parser.Parse(`re("[a-z]")`)
require.NoError(t, err)
+2
View File
@@ -9,7 +9,9 @@ type Env struct {
Bool bool
Float float64
Int64 int64
Int32 int32
Int int
Uint32 uint32
String string
BoolPtr *bool
FloatPtr *float64
+5 -34
View File
@@ -22,43 +22,14 @@ var (
errorType = reflect.TypeOf((*error)(nil)).Elem()
)
func typeWeight(t reflect.Type) int {
switch t.Kind() {
case reflect.Uint:
return 1
case reflect.Uint8:
return 2
case reflect.Uint16:
return 3
case reflect.Uint32:
return 4
case reflect.Uint64:
return 5
case reflect.Int:
return 6
case reflect.Int8:
return 7
case reflect.Int16:
return 8
case reflect.Int32:
return 9
case reflect.Int64:
return 10
case reflect.Float32:
return 11
case reflect.Float64:
return 12
default:
return 0
}
}
func combined(a, b reflect.Type) reflect.Type {
if typeWeight(a) > typeWeight(b) {
if a.Kind() == b.Kind() {
return a
} else {
return b
}
if isFloat(a) || isFloat(b) {
return floatType
}
return integerType
}
func anyOf(t reflect.Type, fns ...func(reflect.Type) bool) bool {