@@ -924,8 +924,13 @@ func (v *checker) checkArguments(name string, fn reflect.Type, method bool, argu
924
924
}
925
925
926
926
if isFloat (in ) {
927
- t = floatType
928
- traverseAndReplaceIntegerNodesWithFloatNodes (& arg )
927
+ traverseAndReplaceIntegerNodesWithFloatNodes (& arguments [i ], in )
928
+ continue
929
+ }
930
+
931
+ if isInteger (in ) && isInteger (t ) && kind (t ) != kind (in ) {
932
+ traverseAndReplaceIntegerNodesWithIntegerNodes (& arguments [i ], in )
933
+ continue
929
934
}
930
935
931
936
if t == nil {
@@ -943,19 +948,37 @@ func (v *checker) checkArguments(name string, fn reflect.Type, method bool, argu
943
948
return fn .Out (0 ), nil
944
949
}
945
950
946
- func traverseAndReplaceIntegerNodesWithFloatNodes (node * ast.Node ) {
951
+ func traverseAndReplaceIntegerNodesWithFloatNodes (node * ast.Node , newType reflect. Type ) {
947
952
switch (* node ).(type ) {
948
953
case * ast.IntegerNode :
949
954
* node = & ast.FloatNode {Value : float64 ((* node ).(* ast.IntegerNode ).Value )}
955
+ (* node ).SetType (newType )
956
+ case * ast.UnaryNode :
957
+ unaryNode := (* node ).(* ast.UnaryNode )
958
+ traverseAndReplaceIntegerNodesWithFloatNodes (& unaryNode .Node , newType )
959
+ case * ast.BinaryNode :
960
+ binaryNode := (* node ).(* ast.BinaryNode )
961
+ switch binaryNode .Operator {
962
+ case "+" , "-" , "*" :
963
+ traverseAndReplaceIntegerNodesWithFloatNodes (& binaryNode .Left , newType )
964
+ traverseAndReplaceIntegerNodesWithFloatNodes (& binaryNode .Right , newType )
965
+ }
966
+ }
967
+ }
968
+
969
+ func traverseAndReplaceIntegerNodesWithIntegerNodes (node * ast.Node , newType reflect.Type ) {
970
+ switch (* node ).(type ) {
971
+ case * ast.IntegerNode :
972
+ (* node ).SetType (newType )
950
973
case * ast.UnaryNode :
951
974
unaryNode := (* node ).(* ast.UnaryNode )
952
- traverseAndReplaceIntegerNodesWithFloatNodes (& unaryNode .Node )
975
+ traverseAndReplaceIntegerNodesWithIntegerNodes (& unaryNode .Node , newType )
953
976
case * ast.BinaryNode :
954
977
binaryNode := (* node ).(* ast.BinaryNode )
955
978
switch binaryNode .Operator {
956
979
case "+" , "-" , "*" :
957
- traverseAndReplaceIntegerNodesWithFloatNodes (& binaryNode .Left )
958
- traverseAndReplaceIntegerNodesWithFloatNodes (& binaryNode .Right )
980
+ traverseAndReplaceIntegerNodesWithIntegerNodes (& binaryNode .Left , newType )
981
+ traverseAndReplaceIntegerNodesWithIntegerNodes (& binaryNode .Right , newType )
959
982
}
960
983
}
961
984
}
0 commit comments