1use serde::Serialize;
2
3use crate::Span;
4
5use super::{ArenaVec, Attribute, Block, Comment, Expr, Ident, Name, TypeHint};
6
7#[derive(Debug, Serialize)]
9pub struct FunctionDecl<'arena, 'src> {
10 pub name: Ident<'src>,
12 pub params: ArenaVec<'arena, Param<'arena, 'src>>,
14 pub body: &'arena Block<'arena, 'src>,
16 pub return_type: Option<TypeHint<'arena, 'src>>,
18 pub by_ref: bool,
20 pub attributes: ArenaVec<'arena, Attribute<'arena, 'src>>,
22 #[serde(skip_serializing_if = "Option::is_none")]
29 pub doc_comment: Option<Comment<'src>>,
30}
31
32#[derive(Debug, Serialize)]
34pub struct Param<'arena, 'src> {
35 pub name: Ident<'src>,
37 pub type_hint: Option<TypeHint<'arena, 'src>>,
39 pub default: Option<Expr<'arena, 'src>>,
41 pub by_ref: bool,
43 pub variadic: bool,
45 pub is_readonly: bool,
47 pub is_final: bool,
49 pub visibility: Option<Visibility>,
51 pub set_visibility: Option<Visibility>,
53 pub attributes: ArenaVec<'arena, Attribute<'arena, 'src>>,
55 #[serde(skip_serializing_if = "ArenaVec::is_empty")]
57 pub hooks: ArenaVec<'arena, PropertyHook<'arena, 'src>>,
58 #[serde(skip_serializing_if = "Option::is_none")]
63 pub doc_comment: Option<Comment<'src>>,
64 pub span: Span,
66}
67
68#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize)]
70pub enum Visibility {
71 Public,
73 Protected,
75 Private,
77}
78
79#[derive(Debug, Serialize)]
81pub struct ClassBody<'arena, 'src> {
82 pub members: ArenaVec<'arena, ClassMember<'arena, 'src>>,
84 #[serde(skip)]
86 pub span: Span,
87}
88
89#[derive(Debug, Serialize)]
91pub struct ClassDecl<'arena, 'src> {
92 pub name: Option<Ident<'src>>,
94 pub modifiers: ClassModifiers,
96 pub extends: Option<Name<'arena, 'src>>,
98 pub implements: ArenaVec<'arena, Name<'arena, 'src>>,
100 #[serde(flatten)]
102 pub body: ClassBody<'arena, 'src>,
103 pub attributes: ArenaVec<'arena, Attribute<'arena, 'src>>,
105 #[serde(skip_serializing_if = "Option::is_none")]
107 pub doc_comment: Option<Comment<'src>>,
108}
109
110#[derive(Debug, Clone, Serialize, Default)]
112pub struct ClassModifiers {
113 pub is_abstract: bool,
115 pub is_final: bool,
117 pub is_readonly: bool,
119}
120
121#[derive(Debug, Serialize)]
123pub struct ClassMember<'arena, 'src> {
124 pub kind: ClassMemberKind<'arena, 'src>,
126 pub span: Span,
128}
129
130#[derive(Debug, Serialize)]
132pub enum ClassMemberKind<'arena, 'src> {
133 Property(PropertyDecl<'arena, 'src>),
135 Method(MethodDecl<'arena, 'src>),
137 ClassConst(ClassConstDecl<'arena, 'src>),
139 TraitUse(TraitUseDecl<'arena, 'src>),
141}
142
143#[derive(Debug, Serialize)]
145pub struct PropertyDecl<'arena, 'src> {
146 pub name: Ident<'src>,
148 pub visibility: Option<Visibility>,
150 pub set_visibility: Option<Visibility>,
152 pub is_static: bool,
154 pub is_readonly: bool,
156 pub type_hint: Option<TypeHint<'arena, 'src>>,
158 pub default: Option<Expr<'arena, 'src>>,
160 pub attributes: ArenaVec<'arena, Attribute<'arena, 'src>>,
162 #[serde(skip_serializing_if = "ArenaVec::is_empty")]
164 pub hooks: ArenaVec<'arena, PropertyHook<'arena, 'src>>,
165 #[serde(skip_serializing_if = "Option::is_none")]
167 pub doc_comment: Option<Comment<'src>>,
168}
169
170#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize)]
172pub enum PropertyHookKind {
173 Get,
175 Set,
177}
178
179#[derive(Debug, Serialize)]
181pub enum PropertyHookBody<'arena, 'src> {
182 Block(&'arena Block<'arena, 'src>),
184 Expression(Expr<'arena, 'src>),
186 Abstract,
188}
189
190#[derive(Debug, Serialize)]
192pub struct PropertyHook<'arena, 'src> {
193 pub kind: PropertyHookKind,
195 pub body: PropertyHookBody<'arena, 'src>,
197 pub is_final: bool,
199 pub by_ref: bool,
201 pub params: ArenaVec<'arena, Param<'arena, 'src>>,
203 pub attributes: ArenaVec<'arena, Attribute<'arena, 'src>>,
205 pub span: Span,
207}
208
209#[derive(Debug, Serialize)]
211pub struct MethodDecl<'arena, 'src> {
212 pub name: Ident<'src>,
214 pub visibility: Option<Visibility>,
216 pub is_static: bool,
218 pub is_abstract: bool,
220 pub is_final: bool,
222 pub by_ref: bool,
224 pub params: ArenaVec<'arena, Param<'arena, 'src>>,
226 pub return_type: Option<TypeHint<'arena, 'src>>,
228 pub body: Option<&'arena Block<'arena, 'src>>,
230 pub attributes: ArenaVec<'arena, Attribute<'arena, 'src>>,
232 #[serde(skip_serializing_if = "Option::is_none")]
234 pub doc_comment: Option<Comment<'src>>,
235}
236
237#[derive(Debug, Serialize)]
239pub struct ClassConstDecl<'arena, 'src> {
240 pub name: Ident<'src>,
242 pub visibility: Option<Visibility>,
244 pub is_final: bool,
246 #[serde(skip_serializing_if = "Option::is_none")]
248 pub type_hint: Option<&'arena TypeHint<'arena, 'src>>,
249 pub value: Expr<'arena, 'src>,
251 pub attributes: ArenaVec<'arena, Attribute<'arena, 'src>>,
253 #[serde(skip_serializing_if = "Option::is_none")]
255 pub doc_comment: Option<Comment<'src>>,
256}
257
258#[derive(Debug, Serialize)]
260pub struct TraitUseDecl<'arena, 'src> {
261 pub traits: ArenaVec<'arena, Name<'arena, 'src>>,
263 pub adaptations: ArenaVec<'arena, TraitAdaptation<'arena, 'src>>,
265 #[serde(skip)]
267 pub adaptations_brace_start: Option<u32>,
268 #[serde(skip_serializing_if = "Option::is_none")]
270 pub doc_comment: Option<Comment<'src>>,
271}
272
273#[derive(Debug, Serialize)]
275pub struct TraitAdaptation<'arena, 'src> {
276 pub kind: TraitAdaptationKind<'arena, 'src>,
278 pub span: Span,
280}
281
282#[derive(Debug, Serialize)]
284pub enum TraitAdaptationKind<'arena, 'src> {
285 Precedence {
287 trait_name: Name<'arena, 'src>,
289 method: Name<'arena, 'src>,
291 insteadof: ArenaVec<'arena, Name<'arena, 'src>>,
293 },
294 Alias {
296 trait_name: Option<Name<'arena, 'src>>,
298 method: Name<'arena, 'src>,
300 new_modifier: Option<Visibility>,
302 new_name: Option<Name<'arena, 'src>>,
304 },
305}
306
307#[derive(Debug, Serialize)]
309pub struct InterfaceDecl<'arena, 'src> {
310 pub name: Ident<'src>,
312 pub extends: ArenaVec<'arena, Name<'arena, 'src>>,
314 #[serde(flatten)]
316 pub body: ClassBody<'arena, 'src>,
317 pub attributes: ArenaVec<'arena, Attribute<'arena, 'src>>,
319 #[serde(skip_serializing_if = "Option::is_none")]
321 pub doc_comment: Option<Comment<'src>>,
322}
323
324#[derive(Debug, Serialize)]
326pub struct TraitDecl<'arena, 'src> {
327 pub name: Ident<'src>,
329 #[serde(flatten)]
331 pub body: ClassBody<'arena, 'src>,
332 pub attributes: ArenaVec<'arena, Attribute<'arena, 'src>>,
334 #[serde(skip_serializing_if = "Option::is_none")]
336 pub doc_comment: Option<Comment<'src>>,
337}
338
339#[derive(Debug, Serialize)]
341pub struct EnumBody<'arena, 'src> {
342 pub members: ArenaVec<'arena, EnumMember<'arena, 'src>>,
344 #[serde(skip)]
346 pub span: Span,
347}
348
349#[derive(Debug, Serialize)]
351pub struct EnumDecl<'arena, 'src> {
352 pub name: Ident<'src>,
354 pub scalar_type: Option<Name<'arena, 'src>>,
356 pub implements: ArenaVec<'arena, Name<'arena, 'src>>,
358 #[serde(flatten)]
360 pub body: EnumBody<'arena, 'src>,
361 pub attributes: ArenaVec<'arena, Attribute<'arena, 'src>>,
363 #[serde(skip_serializing_if = "Option::is_none")]
365 pub doc_comment: Option<Comment<'src>>,
366}
367
368#[derive(Debug, Serialize)]
370pub struct EnumMember<'arena, 'src> {
371 pub kind: EnumMemberKind<'arena, 'src>,
373 pub span: Span,
375}
376
377#[derive(Debug, Serialize)]
379pub enum EnumMemberKind<'arena, 'src> {
380 Case(EnumCase<'arena, 'src>),
382 Method(MethodDecl<'arena, 'src>),
384 ClassConst(ClassConstDecl<'arena, 'src>),
386 TraitUse(TraitUseDecl<'arena, 'src>),
388}
389
390#[derive(Debug, Serialize)]
392pub struct EnumCase<'arena, 'src> {
393 pub name: Ident<'src>,
395 pub value: Option<Expr<'arena, 'src>>,
397 pub attributes: ArenaVec<'arena, Attribute<'arena, 'src>>,
399 #[serde(skip_serializing_if = "Option::is_none")]
401 pub doc_comment: Option<Comment<'src>>,
402}