mod literals;
mod operators;
mod references;
mod sigils;
mod structs;
use brink_syntax::ast;
use crate::Expr;
use super::context::{LowerScope, LowerSink, Lowered};
pub trait LowerExpr {
fn lower_expr(&self, scope: &LowerScope, sink: &mut impl LowerSink) -> Lowered<Expr>;
}
impl LowerExpr for ast::Expr {
fn lower_expr(&self, scope: &LowerScope, sink: &mut impl LowerSink) -> Lowered<Expr> {
match self {
ast::Expr::IntegerLit(lit) => lit.lower_expr(scope, sink),
ast::Expr::FloatLit(lit) => lit.lower_expr(scope, sink),
ast::Expr::BooleanLit(lit) => lit.lower_expr(scope, sink),
ast::Expr::StringLit(lit) => lit.lower_expr(scope, sink),
ast::Expr::Path(path) => path.lower_expr(scope, sink),
ast::Expr::Prefix(pe) => pe.lower_expr(scope, sink),
ast::Expr::Infix(ie) => ie.lower_expr(scope, sink),
ast::Expr::Postfix(pe) => pe.lower_expr(scope, sink),
ast::Expr::Paren(pe) => pe.lower_expr(scope, sink),
ast::Expr::FunctionCall(fc) => fc.lower_expr(scope, sink),
ast::Expr::DivertTarget(dt) => dt.lower_expr(scope, sink),
ast::Expr::ListExpr(le) => le.lower_expr(scope, sink),
ast::Expr::ArrayLiteral(al) => al.lower_expr(scope, sink),
ast::Expr::MapLiteral(ml) => ml.lower_expr(scope, sink),
ast::Expr::Index(ie) => ie.lower_expr(scope, sink),
ast::Expr::StructLiteral(sl) => sl.lower_expr(scope, sink),
ast::Expr::FieldAccess(fa) => fa.lower_expr(scope, sink),
ast::Expr::FnLiteral(fl) => fl.lower_expr(scope, sink),
ast::Expr::RefExpr(re) => re.lower_expr(scope, sink),
ast::Expr::ComputedCall(cc) => cc.lower_expr(scope, sink),
ast::Expr::Range(re) => re.lower_expr(scope, sink),
}
}
}