@@ -924,8 +924,13 @@ func (v *checker) checkArguments(name string, fn reflect.Type, method bool, argu
924924 }
925925
926926 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
929934 }
930935
931936 if t == nil {
@@ -943,19 +948,37 @@ func (v *checker) checkArguments(name string, fn reflect.Type, method bool, argu
943948 return fn .Out (0 ), nil
944949}
945950
946- func traverseAndReplaceIntegerNodesWithFloatNodes (node * ast.Node ) {
951+ func traverseAndReplaceIntegerNodesWithFloatNodes (node * ast.Node , newType reflect. Type ) {
947952 switch (* node ).(type ) {
948953 case * ast.IntegerNode :
949954 * 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 )
950973 case * ast.UnaryNode :
951974 unaryNode := (* node ).(* ast.UnaryNode )
952- traverseAndReplaceIntegerNodesWithFloatNodes (& unaryNode .Node )
975+ traverseAndReplaceIntegerNodesWithIntegerNodes (& unaryNode .Node , newType )
953976 case * ast.BinaryNode :
954977 binaryNode := (* node ).(* ast.BinaryNode )
955978 switch binaryNode .Operator {
956979 case "+" , "-" , "*" :
957- traverseAndReplaceIntegerNodesWithFloatNodes (& binaryNode .Left )
958- traverseAndReplaceIntegerNodesWithFloatNodes (& binaryNode .Right )
980+ traverseAndReplaceIntegerNodesWithIntegerNodes (& binaryNode .Left , newType )
981+ traverseAndReplaceIntegerNodesWithIntegerNodes (& binaryNode .Right , newType )
959982 }
960983 }
961984}
0 commit comments