Skip to content

Commit f1d1b0c

Browse files
hesiningantonmedv
authored andcommitted
Propagate uint32 arguments types in ast (expr-lang#438)
1 parent 9926c50 commit f1d1b0c

File tree

2 files changed

+40
-7
lines changed

2 files changed

+40
-7
lines changed

checker/checker.go

+29-6
Original file line numberDiff line numberDiff line change
@@ -933,8 +933,13 @@ func (v *checker) checkArguments(name string, fn reflect.Type, method bool, argu
933933
}
934934

935935
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
938943
}
939944

940945
if t == nil {
@@ -952,19 +957,37 @@ func (v *checker) checkArguments(name string, fn reflect.Type, method bool, argu
952957
return fn.Out(0), nil
953958
}
954959

955-
func traverseAndReplaceIntegerNodesWithFloatNodes(node *ast.Node) {
960+
func traverseAndReplaceIntegerNodesWithFloatNodes(node *ast.Node, newType reflect.Type) {
956961
switch (*node).(type) {
957962
case *ast.IntegerNode:
958963
*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)
959982
case *ast.UnaryNode:
960983
unaryNode := (*node).(*ast.UnaryNode)
961-
traverseAndReplaceIntegerNodesWithFloatNodes(&unaryNode.Node)
984+
traverseAndReplaceIntegerNodesWithIntegerNodes(&unaryNode.Node, newType)
962985
case *ast.BinaryNode:
963986
binaryNode := (*node).(*ast.BinaryNode)
964987
switch binaryNode.Operator {
965988
case "+", "-", "*":
966-
traverseAndReplaceIntegerNodesWithFloatNodes(&binaryNode.Left)
967-
traverseAndReplaceIntegerNodesWithFloatNodes(&binaryNode.Right)
989+
traverseAndReplaceIntegerNodesWithIntegerNodes(&binaryNode.Left, newType)
990+
traverseAndReplaceIntegerNodesWithIntegerNodes(&binaryNode.Right, newType)
968991
}
969992
}
970993
}

compiler/compiler.go

+11-1
Original file line numberDiff line numberDiff line change
@@ -307,7 +307,17 @@ func (c *compiler) IntegerNode(node *ast.IntegerNode) {
307307
}
308308

309309
func (c *compiler) FloatNode(node *ast.FloatNode) {
310-
c.emitPush(node.Value)
310+
t := node.Type()
311+
if t == nil {
312+
c.emitPush(node.Value)
313+
return
314+
}
315+
switch t.Kind() {
316+
case reflect.Float32:
317+
c.emitPush(float32(node.Value))
318+
case reflect.Float64:
319+
c.emitPush(node.Value)
320+
}
311321
}
312322

313323
func (c *compiler) BoolNode(node *ast.BoolNode) {

0 commit comments

Comments
 (0)