update dependencies (#6267)
Signed-off-by: hongming <coder.scala@gmail.com>
This commit is contained in:
57
vendor/github.com/open-policy-agent/opa/ast/check.go
generated
vendored
57
vendor/github.com/open-policy-agent/opa/ast/check.go
generated
vendored
@@ -33,15 +33,18 @@ type typeChecker struct {
|
||||
allowNet []string
|
||||
input types.Type
|
||||
allowUndefinedFuncs bool
|
||||
schemaTypes map[string]types.Type
|
||||
}
|
||||
|
||||
// newTypeChecker returns a new typeChecker object that has no errors.
|
||||
func newTypeChecker() *typeChecker {
|
||||
tc := &typeChecker{}
|
||||
tc.exprCheckers = map[string]exprChecker{
|
||||
"eq": tc.checkExprEq,
|
||||
return &typeChecker{
|
||||
builtins: make(map[string]*Builtin),
|
||||
schemaTypes: make(map[string]types.Type),
|
||||
exprCheckers: map[string]exprChecker{
|
||||
"eq": checkExprEq,
|
||||
},
|
||||
}
|
||||
return tc
|
||||
}
|
||||
|
||||
func (tc *typeChecker) newEnv(exist *TypeEnv) *TypeEnv {
|
||||
@@ -60,7 +63,10 @@ func (tc *typeChecker) copy() *typeChecker {
|
||||
WithVarRewriter(tc.varRewriter).
|
||||
WithSchemaSet(tc.ss).
|
||||
WithAllowNet(tc.allowNet).
|
||||
WithInputType(tc.input)
|
||||
WithInputType(tc.input).
|
||||
WithAllowUndefinedFunctionCalls(tc.allowUndefinedFuncs).
|
||||
WithBuiltins(tc.builtins).
|
||||
WithRequiredCapabilities(tc.required)
|
||||
}
|
||||
|
||||
func (tc *typeChecker) WithRequiredCapabilities(c *Capabilities) *typeChecker {
|
||||
@@ -93,6 +99,8 @@ func (tc *typeChecker) WithInputType(tpe types.Type) *typeChecker {
|
||||
return tc
|
||||
}
|
||||
|
||||
// WithAllowUndefinedFunctionCalls sets the type checker to allow references to undefined functions.
|
||||
// Additionally, the 'CheckUndefinedFuncs' and 'CheckSafetyRuleBodies' compiler stages are skipped.
|
||||
func (tc *typeChecker) WithAllowUndefinedFunctionCalls(allow bool) *typeChecker {
|
||||
tc.allowUndefinedFuncs = allow
|
||||
return tc
|
||||
@@ -191,20 +199,43 @@ func (tc *typeChecker) checkClosures(env *TypeEnv, expr *Expr) Errors {
|
||||
return result
|
||||
}
|
||||
|
||||
func (tc *typeChecker) getSchemaType(schemaAnnot *SchemaAnnotation, rule *Rule) (types.Type, *Error) {
|
||||
if refType, exists := tc.schemaTypes[schemaAnnot.Schema.String()]; exists {
|
||||
return refType, nil
|
||||
}
|
||||
|
||||
refType, err := processAnnotation(tc.ss, schemaAnnot, rule, tc.allowNet)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if refType == nil {
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
tc.schemaTypes[schemaAnnot.Schema.String()] = refType
|
||||
return refType, nil
|
||||
|
||||
}
|
||||
|
||||
func (tc *typeChecker) checkRule(env *TypeEnv, as *AnnotationSet, rule *Rule) {
|
||||
|
||||
env = env.wrap()
|
||||
|
||||
schemaAnnots := getRuleAnnotation(as, rule)
|
||||
for _, schemaAnnot := range schemaAnnots {
|
||||
ref, refType, err := processAnnotation(tc.ss, schemaAnnot, rule, tc.allowNet)
|
||||
refType, err := tc.getSchemaType(schemaAnnot, rule)
|
||||
if err != nil {
|
||||
tc.err([]*Error{err})
|
||||
continue
|
||||
}
|
||||
if ref == nil && refType == nil {
|
||||
|
||||
ref := schemaAnnot.Path
|
||||
// if we do not have a ref or a reftype, we should not evaluate this rule.
|
||||
if ref == nil || refType == nil {
|
||||
continue
|
||||
}
|
||||
|
||||
prefixRef, t := getPrefix(env, ref)
|
||||
if t == nil || len(prefixRef) == len(ref) {
|
||||
env.tree.Put(ref, refType)
|
||||
@@ -399,7 +430,7 @@ func (tc *typeChecker) checkExprBuiltin(env *TypeEnv, expr *Expr) *Error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (tc *typeChecker) checkExprEq(env *TypeEnv, expr *Expr) *Error {
|
||||
func checkExprEq(env *TypeEnv, expr *Expr) *Error {
|
||||
|
||||
pre := getArgTypes(env, expr.Operands())
|
||||
exp := Equality.Decl.FuncArgs()
|
||||
@@ -1261,17 +1292,17 @@ func getRuleAnnotation(as *AnnotationSet, rule *Rule) (result []*SchemaAnnotatio
|
||||
return result
|
||||
}
|
||||
|
||||
func processAnnotation(ss *SchemaSet, annot *SchemaAnnotation, rule *Rule, allowNet []string) (Ref, types.Type, *Error) {
|
||||
func processAnnotation(ss *SchemaSet, annot *SchemaAnnotation, rule *Rule, allowNet []string) (types.Type, *Error) {
|
||||
|
||||
var schema interface{}
|
||||
|
||||
if annot.Schema != nil {
|
||||
if ss == nil {
|
||||
return nil, nil, nil
|
||||
return nil, nil
|
||||
}
|
||||
schema = ss.Get(annot.Schema)
|
||||
if schema == nil {
|
||||
return nil, nil, NewError(TypeErr, rule.Location, "undefined schema: %v", annot.Schema)
|
||||
return nil, NewError(TypeErr, rule.Location, "undefined schema: %v", annot.Schema)
|
||||
}
|
||||
} else if annot.Definition != nil {
|
||||
schema = *annot.Definition
|
||||
@@ -1279,10 +1310,10 @@ func processAnnotation(ss *SchemaSet, annot *SchemaAnnotation, rule *Rule, allow
|
||||
|
||||
tpe, err := loadSchema(schema, allowNet)
|
||||
if err != nil {
|
||||
return nil, nil, NewError(TypeErr, rule.Location, err.Error())
|
||||
return nil, NewError(TypeErr, rule.Location, err.Error())
|
||||
}
|
||||
|
||||
return annot.Path, tpe, nil
|
||||
return tpe, nil
|
||||
}
|
||||
|
||||
func errAnnotationRedeclared(a *Annotations, other *Location) *Error {
|
||||
|
||||
Reference in New Issue
Block a user