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 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,
|
||||||
|
|||||||
Reference in New Issue
Block a user