mirror of
https://github.com/hanzoai/expr.git
synced 2026-09-24 16:58:58 +00:00
Fix checker with int/float sums
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user