#[derive(Debug, Clone)]
pub enum TmplPart {
Text(String),
Expr(Box<Expr>),
}
#[derive(Debug, Clone)]
pub enum Expr {
Number(f64),
Str(String),
Bool(bool),
Null,
Undefined,
Template(Vec<TmplPart>),
Ident(String),
Array(Vec<Expr>),
Object(Vec<(String, Expr)>),
Member(Box<Expr>, String),
Index(Box<Expr>, Box<Expr>),
Call(Box<Expr>, Vec<Expr>),
New(Box<Expr>, Vec<Expr>),
Unary(UnOp, Box<Expr>),
Binary(BinOp, Box<Expr>, Box<Expr>),
Logical(LogOp, Box<Expr>, Box<Expr>),
Ternary(Box<Expr>, Box<Expr>, Box<Expr>),
Assign(Box<Expr>, AssignOp, Box<Expr>),
Func(Option<String>, Vec<String>, Vec<Stmt>),
This,
Seq(Vec<Expr>),
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum UnOp {
Neg,
Not,
Typeof,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum BinOp {
Add,
Sub,
Mul,
Div,
Mod,
Eq,
StrictEq,
Ne,
StrictNe,
Lt,
Gt,
Le,
Ge,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum LogOp {
And,
Or,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum AssignOp {
Assign,
AddAssign,
SubAssign,
MulAssign,
DivAssign,
ModAssign,
}
#[derive(Debug, Clone)]
pub enum Stmt {
Var {
#[allow(dead_code)]
kind: VarKind,
decls: Vec<(String, Option<Expr>)>,
},
Expr(Expr),
If {
cond: Expr,
then: Box<Stmt>,
else_: Option<Box<Stmt>>,
},
For {
init: Option<Box<Stmt>>,
cond: Option<Expr>,
update: Option<Expr>,
body: Box<Stmt>,
},
ForOf {
name: String,
iter: Expr,
body: Box<Stmt>,
},
While {
cond: Expr,
body: Box<Stmt>,
},
Func {
name: String,
params: Vec<String>,
body: Vec<Stmt>,
},
Return(Option<Expr>),
Break,
Continue,
Block(Vec<Stmt>),
Empty,
Throw(Expr),
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum VarKind {
Var,
Let,
Const,
}