@@ -933,8 +933,13 @@ func (v *checker) checkArguments(name string, fn reflect.Type, method bool, argu
933
933
}
934
934
935
935
if isFloat (in ) {
936
- t = floatType
937
- traverseAndReplaceIntegerNodesWithFloatNodes (& arg )
936
+ traverseAndReplaceIntegerNodesWithFloatNodes (& arguments [i ], in )
937
+ continue
938
+ }
939
+
940
+ if isInteger (in ) && isInteger (t ) && kind (t ) != kind (in ) {
941
+ traverseAndReplaceIntegerNodesWithIntegerNodes (& arguments [i ], in )
942
+ continue
938
943
}
939
944
940
945
if t == nil {
@@ -952,19 +957,37 @@ func (v *checker) checkArguments(name string, fn reflect.Type, method bool, argu
952
957
return fn .Out (0 ), nil
953
958
}
954
959
955
- func traverseAndReplaceIntegerNodesWithFloatNodes (node * ast.Node ) {
960
+ func traverseAndReplaceIntegerNodesWithFloatNodes (node * ast.Node , newType reflect. Type ) {
956
961
switch (* node ).(type ) {
957
962
case * ast.IntegerNode :
958
963
* node = & ast.FloatNode {Value : float64 ((* node ).(* ast.IntegerNode ).Value )}
964
+ (* node ).SetType (newType )
965
+ case * ast.UnaryNode :
966
+ unaryNode := (* node ).(* ast.UnaryNode )
967
+ traverseAndReplaceIntegerNodesWithFloatNodes (& unaryNode .Node , newType )
968
+ case * ast.BinaryNode :
969
+ binaryNode := (* node ).(* ast.BinaryNode )
970
+ switch binaryNode .Operator {
971
+ case "+" , "-" , "*" :
972
+ traverseAndReplaceIntegerNodesWithFloatNodes (& binaryNode .Left , newType )
973
+ traverseAndReplaceIntegerNodesWithFloatNodes (& binaryNode .Right , newType )
974
+ }
975
+ }
976
+ }
977
+
978
+ func traverseAndReplaceIntegerNodesWithIntegerNodes (node * ast.Node , newType reflect.Type ) {
979
+ switch (* node ).(type ) {
980
+ case * ast.IntegerNode :
981
+ (* node ).SetType (newType )
959
982
case * ast.UnaryNode :
960
983
unaryNode := (* node ).(* ast.UnaryNode )
961
- traverseAndReplaceIntegerNodesWithFloatNodes (& unaryNode .Node )
984
+ traverseAndReplaceIntegerNodesWithIntegerNodes (& unaryNode .Node , newType )
962
985
case * ast.BinaryNode :
963
986
binaryNode := (* node ).(* ast.BinaryNode )
964
987
switch binaryNode .Operator {
965
988
case "+" , "-" , "*" :
966
- traverseAndReplaceIntegerNodesWithFloatNodes (& binaryNode .Left )
967
- traverseAndReplaceIntegerNodesWithFloatNodes (& binaryNode .Right )
989
+ traverseAndReplaceIntegerNodesWithIntegerNodes (& binaryNode .Left , newType )
990
+ traverseAndReplaceIntegerNodesWithIntegerNodes (& binaryNode .Right , newType )
968
991
}
969
992
}
970
993
}
0 commit comments