use crate::decl::VarDecl;
use crate::expr::Expr;
use crate::pat::Pat;
use crate::VarKind;
use crate::{Ident, ProgramPart};
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(
all(feature = "serde", not(feature = "esprima")),
derive(Deserialize, Serialize)
)]
#[cfg_attr(all(feature = "serde", feature = "esprima"), derive(Deserialize))]
pub enum Stmt<'a> {
Expr(Expr<'a>),
Block(BlockStmt<'a>),
Empty,
Debugger,
With(WithStmt<'a>),
Return(Option<Expr<'a>>),
Labeled(LabeledStmt<'a>),
Break(Option<Ident<'a>>),
Continue(Option<Ident<'a>>),
If(IfStmt<'a>),
Switch(SwitchStmt<'a>),
Throw(Expr<'a>),
Try(TryStmt<'a>),
While(WhileStmt<'a>),
DoWhile(DoWhileStmt<'a>),
For(ForStmt<'a>),
ForIn(ForInStmt<'a>),
ForOf(ForOfStmt<'a>),
Var(Vec<VarDecl<'a>>),
}
#[derive(PartialEq, Debug, Clone)]
#[cfg_attr(all(feature = "serialization"), derive(Deserialize, Serialize))]
pub struct WithStmt<'a> {
pub object: Expr<'a>,
pub body: Box<Stmt<'a>>,
}
#[derive(PartialEq, Debug, Clone)]
#[cfg_attr(all(feature = "serialization"), derive(Deserialize, Serialize))]
pub struct LabeledStmt<'a> {
pub label: Ident<'a>,
pub body: Box<Stmt<'a>>,
}
#[derive(PartialEq, Debug, Clone)]
#[cfg_attr(all(feature = "serialization"), derive(Deserialize, Serialize))]
pub struct IfStmt<'a> {
pub test: Expr<'a>,
pub consequent: Box<Stmt<'a>>,
pub alternate: Option<Box<Stmt<'a>>>,
}
#[derive(PartialEq, Debug, Clone)]
#[cfg_attr(all(feature = "serialization"), derive(Deserialize, Serialize))]
pub struct SwitchStmt<'a> {
pub discriminant: Expr<'a>,
pub cases: Vec<SwitchCase<'a>>,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(
all(feature = "serde", not(feature = "esprima")),
derive(Deserialize, Serialize)
)]
#[cfg_attr(all(feature = "serde", feature = "esprima"), derive(Deserialize))]
pub struct SwitchCase<'a> {
pub test: Option<Expr<'a>>,
pub consequent: Vec<ProgramPart<'a>>,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(
all(feature = "serde", not(feature = "esprima")),
derive(Deserialize, Serialize)
)]
#[cfg_attr(all(feature = "serde", feature = "esprima"), derive(Deserialize))]
pub struct BlockStmt<'a>(pub Vec<ProgramPart<'a>>);
#[derive(PartialEq, Debug, Clone)]
#[cfg_attr(all(feature = "serialization"), derive(Deserialize, Serialize))]
pub struct TryStmt<'a> {
pub block: BlockStmt<'a>,
pub handler: Option<CatchClause<'a>>,
pub finalizer: Option<BlockStmt<'a>>,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(
all(feature = "serde", not(feature = "esprima")),
derive(Deserialize, Serialize)
)]
#[cfg_attr(all(feature = "serde", feature = "esprima"), derive(Deserialize))]
pub struct CatchClause<'a> {
pub param: Option<Pat<'a>>,
pub body: BlockStmt<'a>,
}
#[derive(PartialEq, Debug, Clone)]
#[cfg_attr(all(feature = "serialization"), derive(Deserialize, Serialize))]
pub struct WhileStmt<'a> {
pub test: Expr<'a>,
pub body: Box<Stmt<'a>>,
}
#[derive(PartialEq, Debug, Clone)]
#[cfg_attr(all(feature = "serialization"), derive(Deserialize, Serialize))]
pub struct DoWhileStmt<'a> {
pub test: Expr<'a>,
pub body: Box<Stmt<'a>>,
}
#[derive(PartialEq, Debug, Clone)]
#[cfg_attr(all(feature = "serialization"), derive(Deserialize, Serialize))]
pub struct ForStmt<'a> {
pub init: Option<LoopInit<'a>>,
pub test: Option<Expr<'a>>,
pub update: Option<Expr<'a>>,
pub body: Box<Stmt<'a>>,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(
all(feature = "serde", not(feature = "esprima")),
derive(Deserialize, Serialize)
)]
#[cfg_attr(all(feature = "serde", feature = "esprima"), derive(Deserialize))]
pub enum LoopInit<'a> {
Variable(VarKind, Vec<VarDecl<'a>>),
Expr(Expr<'a>),
}
#[derive(PartialEq, Debug, Clone)]
#[cfg_attr(all(feature = "serialization"), derive(Deserialize, Serialize))]
pub struct ForInStmt<'a> {
pub left: LoopLeft<'a>,
pub right: Expr<'a>,
pub body: Box<Stmt<'a>>,
}
#[derive(PartialEq, Debug, Clone)]
#[cfg_attr(all(feature = "serialization"), derive(Deserialize, Serialize))]
pub struct ForOfStmt<'a> {
pub left: LoopLeft<'a>,
pub right: Expr<'a>,
pub body: Box<Stmt<'a>>,
pub is_await: bool,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(
all(feature = "serde", not(feature = "esprima")),
derive(Deserialize, Serialize)
)]
#[cfg_attr(all(feature = "serde", feature = "esprima"), derive(Deserialize))]
pub enum LoopLeft<'a> {
Expr(Expr<'a>),
Variable(VarKind, VarDecl<'a>),
Pat(Pat<'a>),
}