use nova_diagnostics::Spanned;
use crate::{item::Param, pattern::Pattern, ty::Type, Block, Path};
#[derive(Debug, Clone)]
pub enum Expr {
Lit(Literal),
Path(Path),
Tuple(Vec<Spanned<Expr>>),
Array(Vec<Spanned<Expr>>),
ArrayRepeat {
init: Box<Spanned<Expr>>,
len: Box<Spanned<Expr>>,
},
Block(Block),
If {
cond: Box<Spanned<Expr>>,
then: Box<Spanned<Block>>,
else_: Option<Box<Spanned<Expr>>>,
},
Match {
scrutinee: Box<Spanned<Expr>>,
arms: Vec<MatchArm>,
},
While {
cond: Box<Spanned<Expr>>,
body: Box<Spanned<Block>>,
},
For {
pattern: Spanned<Pattern>,
iter: Box<Spanned<Expr>>,
body: Box<Spanned<Block>>,
},
Range {
lo: Box<Spanned<Expr>>,
hi: Box<Spanned<Expr>>,
inclusive: bool,
},
Return(Option<Box<Spanned<Expr>>>),
Break(Option<Box<Spanned<Expr>>>),
Continue,
Closure {
params: Vec<Param>,
ret: Option<Spanned<Type>>,
body: Box<Spanned<Expr>>,
},
Record {
path: Path,
fields: Vec<FieldInit>,
base: Option<Box<Spanned<Expr>>>,
},
Binary {
op: BinOp,
lhs: Box<Spanned<Expr>>,
rhs: Box<Spanned<Expr>>,
},
Unary {
op: UnOp,
expr: Box<Spanned<Expr>>,
},
Call {
callee: Box<Spanned<Expr>>,
args: Vec<Spanned<Expr>>,
},
Index {
target: Box<Spanned<Expr>>,
index: Box<Spanned<Expr>>,
},
Field {
target: Box<Spanned<Expr>>,
field: Spanned<String>,
},
Try(Box<Spanned<Expr>>),
Await(Box<Spanned<Expr>>),
Cast {
expr: Box<Spanned<Expr>>,
ty: Spanned<Type>,
},
Assign {
op: AssignOp,
lhs: Box<Spanned<Expr>>,
rhs: Box<Spanned<Expr>>,
},
StringInterp(Vec<StringPart>),
}
#[derive(Debug, Clone)]
pub enum StringPart {
Lit(String),
Expr(Spanned<Expr>),
}
#[derive(Debug, Clone)]
pub enum Literal {
Int(i64),
Float(f64),
Str(String),
Char(char),
Bool(bool),
}
#[derive(Debug, Clone)]
pub struct MatchArm {
pub pattern: Spanned<Pattern>,
pub guard: Option<Spanned<Expr>>,
pub body: Spanned<Expr>,
}
#[derive(Debug, Clone)]
pub struct FieldInit {
pub name: Spanned<String>,
pub value: Option<Spanned<Expr>>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum BinOp {
Or, And, Eq, Ne, Lt, Le, Gt, Ge, BitOr, BitXor, BitAnd, Shl, Shr, Add, Sub, Mul, Div, Rem, }
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum UnOp {
Neg, Not, BitNot, Ref, RefMut, Deref, }
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum AssignOp {
Assign,
AddAssign,
SubAssign,
MulAssign,
DivAssign,
RemAssign,
BitOrAssign,
BitAndAssign,
BitXorAssign,
ShlAssign,
ShrAssign,
}