1use serde::Serialize;
2
3use crate::Span;
4
5use super::{
6 ArenaVec, Attribute, ClassDecl, Comment, EnumDecl, Expr, FunctionDecl, InterfaceDecl, Name,
7 TraitDecl,
8};
9
10#[derive(Debug, Serialize)]
11pub struct Stmt<'arena, 'src> {
12 pub kind: StmtKind<'arena, 'src>,
13 pub span: Span,
14}
15
16#[derive(Debug, Serialize)]
17pub enum StmtKind<'arena, 'src> {
18 Expression(&'arena Expr<'arena, 'src>),
20
21 Echo(ArenaVec<'arena, Expr<'arena, 'src>>),
23
24 Return(Option<&'arena Expr<'arena, 'src>>),
26
27 Block(ArenaVec<'arena, Stmt<'arena, 'src>>),
29
30 If(&'arena IfStmt<'arena, 'src>),
32
33 While(&'arena WhileStmt<'arena, 'src>),
35
36 For(&'arena ForStmt<'arena, 'src>),
38
39 Foreach(&'arena ForeachStmt<'arena, 'src>),
41
42 DoWhile(&'arena DoWhileStmt<'arena, 'src>),
44
45 Function(&'arena FunctionDecl<'arena, 'src>),
47
48 Break(Option<&'arena Expr<'arena, 'src>>),
50
51 Continue(Option<&'arena Expr<'arena, 'src>>),
53
54 Switch(&'arena SwitchStmt<'arena, 'src>),
56
57 Goto(&'src str),
59
60 Label(&'arena str),
62
63 Declare(&'arena DeclareStmt<'arena, 'src>),
65
66 Unset(ArenaVec<'arena, Expr<'arena, 'src>>),
68
69 Throw(&'arena Expr<'arena, 'src>),
71
72 TryCatch(&'arena TryCatchStmt<'arena, 'src>),
74
75 Global(ArenaVec<'arena, Expr<'arena, 'src>>),
77
78 Class(&'arena ClassDecl<'arena, 'src>),
80
81 Interface(&'arena InterfaceDecl<'arena, 'src>),
83
84 Trait(&'arena TraitDecl<'arena, 'src>),
86
87 Enum(&'arena EnumDecl<'arena, 'src>),
89
90 Namespace(&'arena NamespaceDecl<'arena, 'src>),
92
93 Use(&'arena UseDecl<'arena, 'src>),
95
96 Const(ArenaVec<'arena, ConstItem<'arena, 'src>>),
98
99 StaticVar(ArenaVec<'arena, StaticVar<'arena, 'src>>),
101
102 HaltCompiler(&'src str),
104
105 Nop,
107
108 InlineHtml(&'src str),
110
111 Error,
113}
114
115#[derive(Debug, Serialize)]
116pub struct IfStmt<'arena, 'src> {
117 pub condition: Expr<'arena, 'src>,
118 pub then_branch: &'arena Stmt<'arena, 'src>,
119 pub elseif_branches: ArenaVec<'arena, ElseIfBranch<'arena, 'src>>,
120 pub else_branch: Option<&'arena Stmt<'arena, 'src>>,
121}
122
123#[derive(Debug, Serialize)]
124pub struct ElseIfBranch<'arena, 'src> {
125 pub condition: Expr<'arena, 'src>,
126 pub body: Stmt<'arena, 'src>,
127 pub span: Span,
128}
129
130#[derive(Debug, Serialize)]
131pub struct WhileStmt<'arena, 'src> {
132 pub condition: Expr<'arena, 'src>,
133 pub body: &'arena Stmt<'arena, 'src>,
134}
135
136#[derive(Debug, Serialize)]
137pub struct ForStmt<'arena, 'src> {
138 pub init: ArenaVec<'arena, Expr<'arena, 'src>>,
139 pub condition: ArenaVec<'arena, Expr<'arena, 'src>>,
140 pub update: ArenaVec<'arena, Expr<'arena, 'src>>,
141 pub body: &'arena Stmt<'arena, 'src>,
142}
143
144#[derive(Debug, Serialize)]
145pub struct ForeachStmt<'arena, 'src> {
146 pub expr: Expr<'arena, 'src>,
147 pub key: Option<Expr<'arena, 'src>>,
148 pub value: Expr<'arena, 'src>,
149 pub body: &'arena Stmt<'arena, 'src>,
150}
151
152#[derive(Debug, Serialize)]
153pub struct DoWhileStmt<'arena, 'src> {
154 pub body: &'arena Stmt<'arena, 'src>,
155 pub condition: Expr<'arena, 'src>,
156}
157
158#[derive(Debug, Serialize)]
159pub struct SwitchStmt<'arena, 'src> {
160 pub expr: Expr<'arena, 'src>,
161 pub cases: ArenaVec<'arena, SwitchCase<'arena, 'src>>,
162}
163
164#[derive(Debug, Serialize)]
165pub struct SwitchCase<'arena, 'src> {
166 pub value: Option<Expr<'arena, 'src>>,
167 pub body: ArenaVec<'arena, Stmt<'arena, 'src>>,
168 pub span: Span,
169}
170
171#[derive(Debug, Serialize)]
172pub struct TryCatchStmt<'arena, 'src> {
173 pub body: ArenaVec<'arena, Stmt<'arena, 'src>>,
174 pub catches: ArenaVec<'arena, CatchClause<'arena, 'src>>,
175 pub finally: Option<ArenaVec<'arena, Stmt<'arena, 'src>>>,
176}
177
178#[derive(Debug, Serialize)]
179pub struct CatchClause<'arena, 'src> {
180 pub types: ArenaVec<'arena, Name<'arena, 'src>>,
181 pub var: Option<&'src str>,
182 pub body: ArenaVec<'arena, Stmt<'arena, 'src>>,
183 pub span: Span,
184}
185
186#[derive(Debug, Serialize)]
187pub struct NamespaceDecl<'arena, 'src> {
188 pub name: Option<Name<'arena, 'src>>,
189 pub body: NamespaceBody<'arena, 'src>,
190}
191
192#[derive(Debug, Serialize)]
193pub enum NamespaceBody<'arena, 'src> {
194 Braced(ArenaVec<'arena, Stmt<'arena, 'src>>),
196 Simple,
198}
199
200#[derive(Debug, Serialize)]
201pub struct DeclareStmt<'arena, 'src> {
202 pub directives: ArenaVec<'arena, (&'src str, Expr<'arena, 'src>)>,
203 pub body: Option<&'arena Stmt<'arena, 'src>>,
204}
205
206#[derive(Debug, Serialize)]
207pub struct UseDecl<'arena, 'src> {
208 pub kind: UseKind,
209 pub uses: ArenaVec<'arena, UseItem<'arena, 'src>>,
210}
211
212#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize)]
213pub enum UseKind {
214 Normal,
216 Function,
218 Const,
220}
221
222#[derive(Debug, Serialize)]
223pub struct UseItem<'arena, 'src> {
224 pub name: Name<'arena, 'src>,
225 pub alias: Option<&'src str>,
226 #[serde(skip_serializing_if = "Option::is_none")]
227 pub kind: Option<UseKind>,
228 pub span: Span,
229}
230
231#[derive(Debug, Serialize)]
232pub struct ConstItem<'arena, 'src> {
233 pub name: &'src str,
234 pub value: Expr<'arena, 'src>,
235 pub attributes: ArenaVec<'arena, Attribute<'arena, 'src>>,
236 pub span: Span,
237 #[serde(skip_serializing_if = "Option::is_none")]
238 pub doc_comment: Option<Comment<'src>>,
239}
240
241#[derive(Debug, Serialize)]
242pub struct StaticVar<'arena, 'src> {
243 pub name: &'src str,
244 pub default: Option<Expr<'arena, 'src>>,
245 pub span: Span,
246}