lang: funcs: core: Add more invariants to template func
This adds even more invariants to template that I might have missed. It may be redundant, or it may help.
This commit is contained in:
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user