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:
James Shubin
2021-05-19 08:33:33 -04:00
parent 1fd06ecbf9
commit 9ca2cda8c7

View File

@@ -87,6 +87,8 @@ func (obj *TemplateFunc) Unify(expr interfaces.Expr) ([]interfaces.Invariant, er
var invariants []interfaces.Invariant var invariants []interfaces.Invariant
var invar interfaces.Invariant var invar interfaces.Invariant
// func(format string) string
// OR
// func(format string, arg variant) string // func(format string, arg variant) string
formatName, err := obj.ArgGen(0) formatName, err := obj.ArgGen(0)
@@ -123,7 +125,7 @@ func (obj *TemplateFunc) Unify(expr interfaces.Expr) ([]interfaces.Invariant, er
if cfavInvar.Func != expr { if cfavInvar.Func != expr {
continue continue
} }
// cfavInvar.Expr is the ExprCall! // cfavInvar.Expr is the ExprCall! (the return pointer)
// cfavInvar.Args are the args that ExprCall uses! // cfavInvar.Args are the args that ExprCall uses!
if len(cfavInvar.Args) == 0 { if len(cfavInvar.Args) == 0 {
return nil, fmt.Errorf("unable to build function with no args") 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 invariants []interfaces.Invariant
var invar 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 // first arg must be a string
invar = &interfaces.EqualsInvariant{ invar = &interfaces.EqualsInvariant{
Expr: cfavInvar.Args[0], Expr: cfavInvar.Args[0],
@@ -174,6 +190,14 @@ func (obj *TemplateFunc) Unify(expr interfaces.Expr) ([]interfaces.Invariant, er
invariants = append(invariants, invar) 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 // expression must match type of the input arg
invar := &interfaces.EqualityInvariant{ invar := &interfaces.EqualityInvariant{
Expr1: dummyArg, Expr1: dummyArg,