checker

package
v0.20.1 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Mar 7, 2024 License: Apache-2.0, BSD-3-Clause Imports: 18 Imported by: 11

Documentation

Overview

Package checker defines functions to type-checked a parsed expression against a set of identifier and function declarations.

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func Check

func Check(parsed *ast.AST, source common.Source, env *Env) (*ast.AST, *common.Errors)

Check performs type checking, giving a typed AST.

The input is a parsed AST and an env which encapsulates type binding of variables, declarations of built-in functions, descriptions of protocol buffers, and a registry for errors.

Returns a type-checked AST, which might not be usable if there are errors in the error registry.

func FormatCELType added in v0.17.0

func FormatCELType(t any) string

FormatCELType formats a types.Type value to a string representation.

The type formatting is identical to FormatCheckedType.

func FormatCheckedType

func FormatCheckedType(t *exprpb.Type) string

FormatCheckedType converts a type message into a string representation.

func Print

func Print(e ast.Expr, checked *ast.AST) string

Print returns a string representation of the Expr message, annotated with types from the CheckedExpr. The Expr must be a sub-expression embedded in the CheckedExpr.

func StandardFunctions deprecated added in v0.17.0

func StandardFunctions() []*exprpb.Decl

StandardFunctions returns the Decls for all functions in the evaluator.

Deprecated: prefer stdlib.FunctionExprDecls()

func StandardTypes deprecated added in v0.17.0

func StandardTypes() []*exprpb.Decl

StandardTypes returns the set of type identifiers for standard library types.

Deprecated: prefer stdlib.TypeExprDecls()

Types

type AstNode added in v0.10.0

type AstNode interface {
	// Path returns a field path through the provided type declarations to the type of the AstNode, or nil if the AstNode does not
	// represent type directly reachable from the provided type declarations.
	// The first path element is a variable. All subsequent path elements are one of: field name, '@items', '@keys', '@values'.
	Path() []string
	// Type returns the deduced type of the AstNode.
	Type() *types.Type
	// Expr returns the expression of the AstNode.
	Expr() ast.Expr
	// ComputedSize returns a size estimate of the AstNode derived from information available in the CEL expression.
	// For constants and inline list and map declarations, the exact size is returned. For concatenated list, strings
	// and bytes, the size is derived from the size estimates of the operands. nil is returned if there is no
	// computed size available.
	ComputedSize() *SizeEstimate
}

AstNode represents an AST node for the purpose of cost estimations.

type CallEstimate added in v0.10.0

type CallEstimate struct {
	CostEstimate
	ResultSize *SizeEstimate
}

CallEstimate includes a CostEstimate for the call, and an optional estimate of the result object size. The ResultSize should only be provided if the call results in a map, list, string or bytes.

type CostEstimate added in v0.10.0

type CostEstimate struct {
	Min, Max uint64
}

CostEstimate represents an estimated cost range and provides add and multiply operations that do not overflow.

func Cost added in v0.10.0

func Cost(checked *ast.AST, estimator CostEstimator, opts ...CostOption) (CostEstimate, error)

Cost estimates the cost of the parsed and type checked CEL expression.

func (CostEstimate) Add added in v0.10.0

func (ce CostEstimate) Add(cost CostEstimate) CostEstimate

Add adds the costs and returns the sum. If add would result in an uint64 overflow for the min or max, the value is set to math.MaxUint64.

func (CostEstimate) Multiply added in v0.10.0

func (ce CostEstimate) Multiply(cost CostEstimate) CostEstimate

Multiply multiplies by the cost and returns the product. If multiply would result in an uint64 overflow, the result is math.MaxUint64.

func (CostEstimate) MultiplyByCostFactor added in v0.10.0

func (ce CostEstimate) MultiplyByCostFactor(costPerUnit float64) CostEstimate

MultiplyByCostFactor multiplies a CostEstimate by a cost factor and returns the CostEstimate with the nearest integer of the result, rounded up.

func (CostEstimate) Union added in v0.10.0

func (ce CostEstimate) Union(size CostEstimate) CostEstimate

Union returns a CostEstimate that encompasses both input the CostEstimates.

type CostEstimator added in v0.10.0

type CostEstimator interface {
	// EstimateSize returns a SizeEstimate for the given AstNode, or nil if
	// the estimator has no estimate to provide. The size is equivalent to the result of the CEL `size()` function:
	// length of strings and bytes, number of map entries or number of list items.
	// EstimateSize is only called for AstNodes where
	// CEL does not know the size; EstimateSize is not called for values defined inline in CEL where the size
	// is already obvious to CEL.
	EstimateSize(element AstNode) *SizeEstimate
	// EstimateCallCost returns the estimated cost of an invocation, or nil if
	// the estimator has no estimate to provide.
	EstimateCallCost(function, overloadID string, target *AstNode, args []AstNode) *CallEstimate
}

CostEstimator estimates the sizes of variable length input data and the costs of functions.

type CostOption added in v0.16.0

type CostOption func(*coster) error

CostOption configures flags which affect cost computations.

func OverloadCostEstimate added in v0.17.7

func OverloadCostEstimate(overloadID string, functionCoster FunctionEstimator) CostOption

OverloadCostEstimate binds a FunctionCoster to a specific function overload ID.

When a OverloadCostEstimate is provided, it will override the cost calculation of the CostEstimator provided to the Cost() call.

func PresenceTestHasCost added in v0.16.0

func PresenceTestHasCost(hasCost bool) CostOption

PresenceTestHasCost determines whether presence testing has a cost of one or zero.

Defaults to presence test has a cost of one.

type Env

type Env struct {
	// contains filtered or unexported fields
}

Env is the environment for type checking.

The Env is comprised of a container, type provider, declarations, and other related objects which can be used to assist with type-checking.

func NewEnv

func NewEnv(container *containers.Container, provider types.Provider, opts ...Option) (*Env, error)

NewEnv returns a new *Env with the given parameters.

func (*Env) AddFunctions added in v0.17.0

func (e *Env) AddFunctions(declarations ...*decls.FunctionDecl) error

AddFunctions configures the checker with a list of function declarations.

If there are overlapping declarations, the method will error.

func (*Env) AddIdents added in v0.17.0

func (e *Env) AddIdents(declarations ...*decls.VariableDecl) error

AddIdents configures the checker with a list of variable declarations.

If there are overlapping declarations, the method will error.

func (*Env) LookupFunction

func (e *Env) LookupFunction(name string) *decls.FunctionDecl

LookupFunction returns a Decl proto for typeName as a function in env. Returns nil if no such function is found in env.

func (*Env) LookupIdent

func (e *Env) LookupIdent(name string) *decls.VariableDecl

LookupIdent returns a Decl proto for typeName as an identifier in the Env. Returns nil if no such identifier is found in the Env.

type FunctionEstimator added in v0.17.7

type FunctionEstimator func(estimator CostEstimator, target *AstNode, args []AstNode) *CallEstimate

FunctionEstimator provides a CallEstimate given the target and arguments for a specific function, overload pair.

type Group added in v0.17.0

type Group struct {
	// contains filtered or unexported fields
}

Group is a set of Decls that is pushed on or popped off a Scopes as a unit. Contains separate namespaces for identifier and function Decls. (Should be named "Scope" perhaps?)

type Option added in v0.10.0

type Option func(*options) error

Option is a functional option for configuring the type-checker

func CrossTypeNumericComparisons added in v0.10.0

func CrossTypeNumericComparisons(enabled bool) Option

CrossTypeNumericComparisons toggles type-checker support for numeric comparisons across type See https://github.com/google/cel-spec/wiki/proposal-210 for more details.

func ValidatedDeclarations added in v0.11.1

func ValidatedDeclarations(env *Env) Option

ValidatedDeclarations provides a references to validated declarations which will be copied into new checker instances.

type Scopes added in v0.17.0

type Scopes struct {
	// contains filtered or unexported fields
}

Scopes represents nested Decl sets where the Scopes value contains a Groups containing all identifiers in scope and an optional parent representing outer scopes. Each Groups value is a mapping of names to Decls in the ident and function namespaces. Lookups are performed such that bindings in inner scopes shadow those in outer scopes.

func (*Scopes) AddIdent added in v0.17.0

func (s *Scopes) AddIdent(decl *decls.VariableDecl)

AddIdent adds the ident Decl in the current scope. Note: If the name collides with an existing identifier in the scope, the Decl is overwritten.

func (*Scopes) Copy added in v0.17.0

func (s *Scopes) Copy() *Scopes

Copy creates a copy of the current Scopes values, including a copy of its parent if non-nil.

func (*Scopes) FindFunction added in v0.17.0

func (s *Scopes) FindFunction(name string) *decls.FunctionDecl

FindFunction finds the first function Decl with a matching name in Scopes. The search is performed from innermost to outermost. Returns nil if no such function in Scopes.

func (*Scopes) FindIdent added in v0.17.0

func (s *Scopes) FindIdent(name string) *decls.VariableDecl

FindIdent finds the first ident Decl with a matching name in Scopes, or nil if one cannot be found. Note: The search is performed from innermost to outermost.

func (*Scopes) FindIdentInScope added in v0.17.0

func (s *Scopes) FindIdentInScope(name string) *decls.VariableDecl

FindIdentInScope finds the first ident Decl with a matching name in the current Scopes value, or nil if one does not exist. Note: The search is only performed on the current scope and does not search outer scopes.

func (*Scopes) Pop added in v0.17.0

func (s *Scopes) Pop() *Scopes

Pop returns the parent Scopes value for the current scope, or the current scope if the parent is nil.

func (*Scopes) Push added in v0.17.0

func (s *Scopes) Push() *Scopes

Push creates a new Scopes value which references the current Scope as its parent.

func (*Scopes) SetFunction added in v0.17.0

func (s *Scopes) SetFunction(fn *decls.FunctionDecl)

SetFunction adds the function Decl to the current scope. Note: Any previous entry for a function in the current scope with the same name is overwritten.

type SizeEstimate added in v0.10.0

type SizeEstimate struct {
	Min, Max uint64
}

SizeEstimate represents an estimated size of a variable length string, bytes, map or list.

func (SizeEstimate) Add added in v0.10.0

func (se SizeEstimate) Add(sizeEstimate SizeEstimate) SizeEstimate

Add adds to another SizeEstimate and returns the sum. If add would result in an uint64 overflow, the result is math.MaxUint64.

func (SizeEstimate) Multiply added in v0.10.0

func (se SizeEstimate) Multiply(sizeEstimate SizeEstimate) SizeEstimate

Multiply multiplies by another SizeEstimate and returns the product. If multiply would result in an uint64 overflow, the result is math.MaxUint64.

func (SizeEstimate) MultiplyByCost added in v0.10.0

func (se SizeEstimate) MultiplyByCost(cost CostEstimate) CostEstimate

MultiplyByCost multiplies by the cost and returns the product. If multiply would result in an uint64 overflow, the result is math.MaxUint64.

func (SizeEstimate) MultiplyByCostFactor added in v0.10.0

func (se SizeEstimate) MultiplyByCostFactor(costPerUnit float64) CostEstimate

MultiplyByCostFactor multiplies a SizeEstimate by a cost factor and returns the CostEstimate with the nearest integer of the result, rounded up.

func (SizeEstimate) Union added in v0.10.0

func (se SizeEstimate) Union(size SizeEstimate) SizeEstimate

Union returns a SizeEstimate that encompasses both input the SizeEstimate.

Directories

Path Synopsis
Package decls provides helpers for creating variable and function declarations.
Package decls provides helpers for creating variable and function declarations.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL