diff --git a/checker/checker.go b/checker/checker.go index 589545db0..282031a1f 100644 --- a/checker/checker.go +++ b/checker/checker.go @@ -71,6 +71,8 @@ func (v *visitor) visit(node ast.Node) reflect.Type { t = v.BoolNode(n) case *ast.StringNode: t = v.StringNode(n) + case *ast.ConstantNode: + t = v.ConstantNode(n) case *ast.UnaryNode: t = v.UnaryNode(n) case *ast.BinaryNode: @@ -160,6 +162,10 @@ func (v *visitor) StringNode(*ast.StringNode) reflect.Type { return stringType } +func (v *visitor) ConstantNode(node *ast.ConstantNode) reflect.Type { + return reflect.TypeOf(node.Value) +} + func (v *visitor) UnaryNode(node *ast.UnaryNode) reflect.Type { t := v.visit(node.Node) diff --git a/checker/checker_test.go b/checker/checker_test.go index 140e83ff8..a7fb4d2ab 100644 --- a/checker/checker_test.go +++ b/checker/checker_test.go @@ -2,11 +2,14 @@ package checker_test import ( "fmt" + "reflect" + "regexp" "strings" "testing" "time" "github.com/antonmedv/expr" + "github.com/antonmedv/expr/ast" "github.com/antonmedv/expr/checker" "github.com/antonmedv/expr/conf" "github.com/antonmedv/expr/parser" @@ -85,6 +88,19 @@ func TestVisitor_BuiltinNode(t *testing.T) { } } +func TestVisitor_ConstantNode(t *testing.T) { + tree, err := parser.Parse(`re("[a-z]")`) + + regexValue := regexp.MustCompile("[a-z]") + constNode := &ast.ConstantNode{Value: regexValue} + ast.Patch(&tree.Node, constNode) + + _, err = checker.Check(tree, conf.New(&mockEnv{})) + assert.NoError(t, err) + + assert.Equal(t, reflect.TypeOf(regexValue), tree.Node.Type()) +} + func TestCheck(t *testing.T) { var typeTests = []string{ "!Bool",