use serde::Serialize;
use crate::Span;
use super::{
ArenaVec, Attribute, ClassDecl, Comment, EnumDecl, Expr, FunctionDecl, InterfaceDecl, Name,
TraitDecl,
};
#[derive(Debug, Serialize)]
pub struct Stmt<'arena, 'src> {
pub kind: StmtKind<'arena, 'src>,
pub span: Span,
}
#[derive(Debug, Serialize)]
pub enum StmtKind<'arena, 'src> {
Expression(&'arena Expr<'arena, 'src>),
Echo(ArenaVec<'arena, Expr<'arena, 'src>>),
Return(Option<&'arena Expr<'arena, 'src>>),
Block(ArenaVec<'arena, Stmt<'arena, 'src>>),
If(&'arena IfStmt<'arena, 'src>),
While(&'arena WhileStmt<'arena, 'src>),
For(&'arena ForStmt<'arena, 'src>),
Foreach(&'arena ForeachStmt<'arena, 'src>),
DoWhile(&'arena DoWhileStmt<'arena, 'src>),
Function(&'arena FunctionDecl<'arena, 'src>),
Break(Option<&'arena Expr<'arena, 'src>>),
Continue(Option<&'arena Expr<'arena, 'src>>),
Switch(&'arena SwitchStmt<'arena, 'src>),
Goto(&'src str),
Label(&'arena str),
Declare(&'arena DeclareStmt<'arena, 'src>),
Unset(ArenaVec<'arena, Expr<'arena, 'src>>),
Throw(&'arena Expr<'arena, 'src>),
TryCatch(&'arena TryCatchStmt<'arena, 'src>),
Global(ArenaVec<'arena, Expr<'arena, 'src>>),
Class(&'arena ClassDecl<'arena, 'src>),
Interface(&'arena InterfaceDecl<'arena, 'src>),
Trait(&'arena TraitDecl<'arena, 'src>),
Enum(&'arena EnumDecl<'arena, 'src>),
Namespace(&'arena NamespaceDecl<'arena, 'src>),
Use(&'arena UseDecl<'arena, 'src>),
Const(ArenaVec<'arena, ConstItem<'arena, 'src>>),
StaticVar(ArenaVec<'arena, StaticVar<'arena, 'src>>),
HaltCompiler(&'src str),
Nop,
InlineHtml(&'src str),
Error,
}
#[derive(Debug, Serialize)]
pub struct IfStmt<'arena, 'src> {
pub condition: Expr<'arena, 'src>,
pub then_branch: &'arena Stmt<'arena, 'src>,
pub elseif_branches: ArenaVec<'arena, ElseIfBranch<'arena, 'src>>,
pub else_branch: Option<&'arena Stmt<'arena, 'src>>,
}
#[derive(Debug, Serialize)]
pub struct ElseIfBranch<'arena, 'src> {
pub condition: Expr<'arena, 'src>,
pub body: Stmt<'arena, 'src>,
pub span: Span,
}
#[derive(Debug, Serialize)]
pub struct WhileStmt<'arena, 'src> {
pub condition: Expr<'arena, 'src>,
pub body: &'arena Stmt<'arena, 'src>,
}
#[derive(Debug, Serialize)]
pub struct ForStmt<'arena, 'src> {
pub init: ArenaVec<'arena, Expr<'arena, 'src>>,
pub condition: ArenaVec<'arena, Expr<'arena, 'src>>,
pub update: ArenaVec<'arena, Expr<'arena, 'src>>,
pub body: &'arena Stmt<'arena, 'src>,
}
#[derive(Debug, Serialize)]
pub struct ForeachStmt<'arena, 'src> {
pub expr: Expr<'arena, 'src>,
pub key: Option<Expr<'arena, 'src>>,
pub value: Expr<'arena, 'src>,
pub body: &'arena Stmt<'arena, 'src>,
}
#[derive(Debug, Serialize)]
pub struct DoWhileStmt<'arena, 'src> {
pub body: &'arena Stmt<'arena, 'src>,
pub condition: Expr<'arena, 'src>,
}
#[derive(Debug, Serialize)]
pub struct SwitchStmt<'arena, 'src> {
pub expr: Expr<'arena, 'src>,
pub cases: ArenaVec<'arena, SwitchCase<'arena, 'src>>,
}
#[derive(Debug, Serialize)]
pub struct SwitchCase<'arena, 'src> {
pub value: Option<Expr<'arena, 'src>>,
pub body: ArenaVec<'arena, Stmt<'arena, 'src>>,
pub span: Span,
}
#[derive(Debug, Serialize)]
pub struct TryCatchStmt<'arena, 'src> {
pub body: ArenaVec<'arena, Stmt<'arena, 'src>>,
pub catches: ArenaVec<'arena, CatchClause<'arena, 'src>>,
pub finally: Option<ArenaVec<'arena, Stmt<'arena, 'src>>>,
}
#[derive(Debug, Serialize)]
pub struct CatchClause<'arena, 'src> {
pub types: ArenaVec<'arena, Name<'arena, 'src>>,
pub var: Option<&'src str>,
pub body: ArenaVec<'arena, Stmt<'arena, 'src>>,
pub span: Span,
}
#[derive(Debug, Serialize)]
pub struct NamespaceDecl<'arena, 'src> {
pub name: Option<Name<'arena, 'src>>,
pub body: NamespaceBody<'arena, 'src>,
}
#[derive(Debug, Serialize)]
pub enum NamespaceBody<'arena, 'src> {
Braced(ArenaVec<'arena, Stmt<'arena, 'src>>),
Simple,
}
#[derive(Debug, Serialize)]
pub struct DeclareStmt<'arena, 'src> {
pub directives: ArenaVec<'arena, (&'src str, Expr<'arena, 'src>)>,
pub body: Option<&'arena Stmt<'arena, 'src>>,
}
#[derive(Debug, Serialize)]
pub struct UseDecl<'arena, 'src> {
pub kind: UseKind,
pub uses: ArenaVec<'arena, UseItem<'arena, 'src>>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize)]
pub enum UseKind {
Normal,
Function,
Const,
}
#[derive(Debug, Serialize)]
pub struct UseItem<'arena, 'src> {
pub name: Name<'arena, 'src>,
pub alias: Option<&'src str>,
#[serde(skip_serializing_if = "Option::is_none")]
pub kind: Option<UseKind>,
pub span: Span,
}
#[derive(Debug, Serialize)]
pub struct ConstItem<'arena, 'src> {
pub name: &'src str,
pub value: Expr<'arena, 'src>,
pub attributes: ArenaVec<'arena, Attribute<'arena, 'src>>,
pub span: Span,
#[serde(skip_serializing_if = "Option::is_none")]
pub doc_comment: Option<Comment<'src>>,
}
#[derive(Debug, Serialize)]
pub struct StaticVar<'arena, 'src> {
pub name: &'src str,
pub default: Option<Expr<'arena, 'src>>,
pub span: Span,
}