diff --git a/lang/funcs/core/template_func.go b/lang/funcs/core/template_func.go index 550fac7e..a55a3ba3 100644 --- a/lang/funcs/core/template_func.go +++ b/lang/funcs/core/template_func.go @@ -87,6 +87,8 @@ func (obj *TemplateFunc) Unify(expr interfaces.Expr) ([]interfaces.Invariant, er var invariants []interfaces.Invariant var invar interfaces.Invariant + // func(format string) string + // OR // func(format string, arg variant) string formatName, err := obj.ArgGen(0) @@ -123,7 +125,7 @@ func (obj *TemplateFunc) Unify(expr interfaces.Expr) ([]interfaces.Invariant, er if cfavInvar.Func != expr { continue } - // cfavInvar.Expr is the ExprCall! + // cfavInvar.Expr is the ExprCall! (the return pointer) // cfavInvar.Args are the args that ExprCall uses! if len(cfavInvar.Args) == 0 { return nil, fmt.Errorf("unable to build function with no args") @@ -136,6 +138,20 @@ func (obj *TemplateFunc) Unify(expr interfaces.Expr) ([]interfaces.Invariant, er var invariants []interfaces.Invariant var invar interfaces.Invariant + // add the relationship to the returned value + invar = &interfaces.EqualityInvariant{ + Expr1: cfavInvar.Expr, + Expr2: dummyOut, + } + invariants = append(invariants, invar) + + // add the relationships to the called args + invar = &interfaces.EqualityInvariant{ + Expr1: cfavInvar.Args[0], + Expr2: dummyFormat, + } + invariants = append(invariants, invar) + // first arg must be a string invar = &interfaces.EqualsInvariant{ Expr: cfavInvar.Args[0], @@ -174,6 +190,14 @@ func (obj *TemplateFunc) Unify(expr interfaces.Expr) ([]interfaces.Invariant, er invariants = append(invariants, invar) } + if typ, exists := solved[cfavInvar.Args[1]]; exists { // alternate way to lookup type + invar := &interfaces.EqualsInvariant{ + Expr: dummyArg, + Type: typ, + } + invariants = append(invariants, invar) + } + // expression must match type of the input arg invar := &interfaces.EqualityInvariant{ Expr1: dummyArg,