mod expr_and;
mod expr_binary_op;
mod expr_cast;
mod expr_in_list;
mod expr_intersects;
mod expr_is_null;
mod expr_is_superset;
mod expr_list;
mod expr_match;
mod expr_not;
mod expr_or;
mod expr_record;
#[cfg(test)]
mod tests;
use toasty_core::stmt::{self, Expr, Node, VisitMut};
pub(crate) fn fold_stmt<T: Node>(stmt: &mut T) {
Fold.visit_mut(stmt);
}
struct Fold;
impl VisitMut for Fold {
fn visit_expr_mut(&mut self, i: &mut Expr) {
stmt::visit_mut::visit_expr_mut(self, i);
if let Some(mut expr) = fold_one(i) {
self.visit_expr_mut(&mut expr);
*i = expr;
}
}
}
fn fold_one(i: &mut Expr) -> Option<Expr> {
match i {
Expr::And(expr) => expr_and::fold_expr_and(expr),
Expr::BinaryOp(expr) => {
expr_binary_op::fold_expr_binary_op(expr.op, &mut expr.lhs, &mut expr.rhs)
}
Expr::Cast(expr) => expr_cast::fold_expr_cast(expr),
Expr::InList(expr) => expr_in_list::fold_expr_in_list(expr),
Expr::Intersects(expr) => expr_intersects::fold_expr_intersects(expr),
Expr::IsNull(expr) => expr_is_null::fold_expr_is_null(expr),
Expr::IsSuperset(expr) => expr_is_superset::fold_expr_is_superset(expr),
Expr::List(expr) => expr_list::fold_expr_list(expr),
Expr::Match(expr) => expr_match::fold_expr_match(expr),
Expr::Not(expr) => expr_not::fold_expr_not(expr),
Expr::Or(expr) => expr_or::fold_expr_or(expr),
Expr::Record(expr) => expr_record::fold_expr_record(expr),
Expr::AllOp(_)
| Expr::Any(_)
| Expr::AnyOp(_)
| Expr::Arg(_)
| Expr::Default
| Expr::Error(_)
| Expr::Exists(_)
| Expr::Func(_)
| Expr::Ident(_)
| Expr::InSubquery(_)
| Expr::IsVariant(_)
| Expr::Length(_)
| Expr::Let(_)
| Expr::Like(_)
| Expr::Map(_)
| Expr::Project(_)
| Expr::Reference(_)
| Expr::StartsWith(_)
| Expr::Stmt(_)
| Expr::Value(_) => None,
}
}