use super::{Name, Pattern, Stmt, Type, VersionCond};
use crate::source::token::Span;
#[derive(Debug, Clone, PartialEq)]
pub struct Expr {
pub kind: ExprKind,
pub span: Span,
}
#[derive(Debug, Clone, PartialEq)]
pub enum ExprKind {
Int(i64),
Float(f64),
Unit {
value: String,
unit: String,
},
Str(Vec<StrSeg>),
RawStr(String),
Char(char),
Text(String),
Content {
kind: String,
id: String,
},
Tag(String),
Bool(bool),
Null,
Ident(String),
This,
Base,
It,
Declare {
ty: Option<Type>,
name: Name,
mutable: bool,
},
TypeOf(Type),
NameOf(Box<Expr>),
Default(Option<Type>),
Mc(VersionCond),
Tuple(Vec<Expr>),
Collection(Vec<Element>),
New {
ty: Option<Type>,
args: Option<Vec<Arg>>,
init: Vec<(Name, Expr)>,
},
Lambda {
params: Vec<LambdaParam>,
body: LambdaBody,
},
Unary {
op: UnOp,
expr: Box<Expr>,
},
Cast {
ty: Type,
expr: Box<Expr>,
},
Binary {
op: BinOp,
left: Box<Expr>,
right: Box<Expr>,
},
Range {
from: Box<Expr>,
to: Box<Expr>,
inclusive: bool,
},
Is {
expr: Box<Expr>,
pattern: Box<Pattern>,
},
As {
expr: Box<Expr>,
ty: Type,
},
Has {
expr: Box<Expr>,
ty: Type,
},
Conditional {
cond: Box<Expr>,
then: Box<Expr>,
otherwise: Box<Expr>,
},
Switch {
expr: Box<Expr>,
arms: Vec<Arm>,
},
Call {
callee: Box<Expr>,
args: Vec<Arg>,
},
Index {
expr: Box<Expr>,
index: Box<Expr>,
},
TypeArgs {
expr: Box<Expr>,
args: Vec<Type>,
},
Member {
expr: Box<Expr>,
name: Name,
safe: bool,
},
Macro {
name: Name,
args: Vec<Expr>,
},
Move(Box<Expr>),
NotNull(Box<Expr>),
Error,
}
#[derive(Debug, Clone, PartialEq)]
pub enum StrSeg {
Text(String),
Expr(Expr),
}
#[derive(Debug, Clone, PartialEq)]
pub enum Element {
Item(Expr),
Entry(Expr, Expr),
Spread(Expr),
}
#[derive(Debug, Clone, PartialEq)]
pub struct LambdaParam {
pub ty: Option<Type>,
pub name: Name,
}
#[derive(Debug, Clone, PartialEq)]
pub enum LambdaBody {
Expr(Box<Expr>),
Block(Vec<Stmt>),
}
#[derive(Debug, Clone, PartialEq)]
pub struct Arg {
pub name: Option<Name>,
pub pass: Option<super::Pass>,
pub value: Expr,
}
#[derive(Debug, Clone, PartialEq)]
pub struct Arm {
pub pattern: Pattern,
pub guard: Option<Expr>,
pub value: Expr,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum UnOp {
Neg,
Not,
Try,
Await,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum BinOp {
Coalesce,
Or,
And,
Eq,
NotEq,
Lt,
LtEq,
Gt,
GtEq,
In,
Add,
Sub,
Mul,
Div,
Rem,
}