use super::{Span, TypeExpr};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum BinOp {
Add,
Sub,
Mul,
Div,
Rem,
Eq,
Ne,
Lt,
Le,
Gt,
Ge,
And,
Or,
BitAnd,
BitOr,
BitXor,
Shl,
Shr,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum UnaryOp {
Neg,
Not,
BitNot,
}
#[derive(Debug, Clone)]
pub enum Expr {
IntLit {
value: i128,
span: Span,
},
FloatLit {
value: f64,
raw: String,
span: Span,
},
BoolLit {
value: bool,
span: Span,
},
Ident {
name: String,
span: Span,
},
Binary {
op: BinOp,
lhs: Box<Expr>,
rhs: Box<Expr>,
span: Span,
},
Unary {
op: UnaryOp,
operand: Box<Expr>,
span: Span,
},
Paren {
inner: Box<Expr>,
span: Span,
},
Call {
callee: Box<Expr>,
args: Vec<Expr>,
span: Span,
},
Field {
base: Box<Expr>,
field: String,
span: Span,
},
Addr {
operand: Box<Expr>,
span: Span,
},
Deref {
operand: Box<Expr>,
span: Span,
},
At {
base: Box<Expr>,
index: Box<Expr>,
span: Span,
},
Cast {
ty: TypeExpr,
expr: Box<Expr>,
span: Span,
},
CStr {
value: String,
span: Span,
},
Bytes {
value: String,
span: Span,
},
None {
ty: TypeExpr,
span: Span,
},
Some {
value: Box<Expr>,
span: Span,
},
Ok {
value: Box<Expr>,
span: Span,
},
Err {
value: Box<Expr>,
span: Span,
},
StructLit {
name: String,
fields: Vec<FieldInit>,
span: Span,
},
}
#[derive(Debug, Clone)]
pub struct FieldInit {
pub name: String,
pub value: Expr,
pub span: Span,
}
#[derive(Debug, Clone, PartialEq)]
pub enum ConstExpr {
IntLit(i128),
FloatLit(f64),
BoolLit(bool),
Ident(String),
Binary {
op: BinOp,
lhs: Box<ConstExpr>,
rhs: Box<ConstExpr>,
},
Unary {
op: UnaryOp,
operand: Box<ConstExpr>,
},
Paren(Box<ConstExpr>),
Cast {
ty: TypeExpr,
expr: Box<ConstExpr>,
},
CStr(String),
Bytes(String),
}
impl Expr {
pub fn span(&self) -> Span {
match self {
Expr::IntLit { span, .. }
| Expr::FloatLit { span, .. }
| Expr::BoolLit { span, .. }
| Expr::Ident { span, .. }
| Expr::Binary { span, .. }
| Expr::Unary { span, .. }
| Expr::Paren { span, .. }
| Expr::Call { span, .. }
| Expr::Field { span, .. }
| Expr::Addr { span, .. }
| Expr::Deref { span, .. }
| Expr::At { span, .. }
| Expr::Cast { span, .. }
| Expr::CStr { span, .. }
| Expr::Bytes { span, .. }
| Expr::None { span, .. }
| Expr::Some { span, .. }
| Expr::Ok { span, .. }
| Expr::Err { span, .. }
| Expr::StructLit { span, .. } => span.clone(),
}
}
}