pub fn check_expr(
expr: &Expr,
resolve_ident: &dyn Fn(&str) -> Ty,
) -> (Ty, Vec<ParseError>)Expand description
Infers expr’s type against resolve_ident (looks up a free identifier’s declared type, or
Ty::Any if unknown — e.g. a bare CEL builtin name, or an adam-lang cell with no : type
annotation), returning the expression’s inferred type plus every type diagnostic found.
Uses an empty OpLookup; metadata-aware hosts use check_expr_with_type_resolver.
Checks every child, including noncapturing closure bodies under parameter-local bindings.
Closure bodies ignore the outer value resolver; registered library metadata remains visible.
Duplicate or reserved parameter names produce diagnostics, including in hand-built syntax.
Arrays require homogeneous complete shapes, tuples retain source order, and if joins
compatible branch types. Callable applications check parameter and result types.
Calls without metadata and free identifiers without declarations remain unresolved.
Registered function values retain concrete marker identity through aliases, rather than
using the alias’s spelling to select a signature. Builtin range expressions retain their
concrete range result, not their endpoint type.
- Complexity: Matches
check_expr_with_type_resolverwith no registered overloads or schemas.
§Examples
use cel_parser::{Expr, ExprSpan, Literal, Ty};
use cel_parser::ty::check_expr;
let span = ExprSpan {
start: proc_macro2::Span::call_site(),
end: proc_macro2::Span::call_site(),
};
let expr = Expr::Literal {
value: Literal::I32(1),
span,
};
let (ty, diagnostics) = check_expr(&expr, &|_name| Ty::Any);
assert_eq!(ty, Ty::I32);
assert!(diagnostics.is_empty());