1#[cfg(feature = "serde")]
2use serde::Serialize;
3
4use crate::Span;
5
6use super::{ArenaVec, Attribute, Block, Comment, Expr, Ident, Name, TypeHint};
7
8#[derive(Debug)]
10#[cfg_attr(feature = "serde", derive(Serialize))]
11pub struct FunctionDecl<'arena, 'src> {
12 pub name: Ident<'src>,
14 pub params: ArenaVec<'arena, Param<'arena, 'src>>,
16 pub body: &'arena Block<'arena, 'src>,
18 pub return_type: Option<TypeHint<'arena, 'src>>,
20 pub by_ref: bool,
22 pub attributes: ArenaVec<'arena, Attribute<'arena, 'src>>,
24 #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
31 pub doc_comment: Option<Comment<'src>>,
32}
33
34#[derive(Debug)]
36#[cfg_attr(feature = "serde", derive(Serialize))]
37#[non_exhaustive]
38pub struct Param<'arena, 'src> {
39 pub name: Ident<'src>,
41 pub type_hint: Option<TypeHint<'arena, 'src>>,
43 pub default: Option<Expr<'arena, 'src>>,
45 pub by_ref: bool,
47 pub variadic: bool,
49 pub is_readonly: bool,
51 pub is_final: bool,
53 pub visibility: Option<Visibility>,
55 pub set_visibility: Option<Visibility>,
57 pub attributes: ArenaVec<'arena, Attribute<'arena, 'src>>,
59 #[cfg_attr(feature = "serde", serde(skip_serializing_if = "ArenaVec::is_empty"))]
61 pub hooks: ArenaVec<'arena, PropertyHook<'arena, 'src>>,
62 #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
67 pub doc_comment: Option<Comment<'src>>,
68 pub span: Span,
70}
71
72impl<'arena, 'src> Param<'arena, 'src> {
73 pub fn new(arena: &'arena bumpalo::Bump, name: Ident<'src>, span: Span) -> Self {
78 Self {
79 name,
80 type_hint: None,
81 default: None,
82 by_ref: false,
83 variadic: false,
84 is_readonly: false,
85 is_final: false,
86 visibility: None,
87 set_visibility: None,
88 attributes: ArenaVec::new_in(arena),
89 hooks: ArenaVec::new_in(arena),
90 doc_comment: None,
91 span,
92 }
93 }
94}
95
96#[derive(Debug, Clone, Copy, PartialEq, Eq)]
98#[cfg_attr(feature = "serde", derive(Serialize))]
99#[non_exhaustive]
100pub enum Visibility {
101 Public,
103 Protected,
105 Private,
107}
108
109#[derive(Debug)]
111#[cfg_attr(feature = "serde", derive(Serialize))]
112pub struct ClassBody<'arena, 'src> {
113 pub members: ArenaVec<'arena, ClassMember<'arena, 'src>>,
115 #[cfg_attr(feature = "serde", serde(skip))]
117 pub span: Span,
118}
119
120#[derive(Debug)]
122#[cfg_attr(feature = "serde", derive(Serialize))]
123pub struct ClassDecl<'arena, 'src> {
124 pub name: Option<Ident<'src>>,
126 pub modifiers: ClassModifiers,
128 pub extends: Option<Name<'arena, 'src>>,
130 pub implements: ArenaVec<'arena, Name<'arena, 'src>>,
132 #[cfg_attr(feature = "serde", serde(flatten))]
134 pub body: ClassBody<'arena, 'src>,
135 pub attributes: ArenaVec<'arena, Attribute<'arena, 'src>>,
137 #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
139 pub doc_comment: Option<Comment<'src>>,
140}
141
142#[derive(Debug, Clone, Default)]
144#[cfg_attr(feature = "serde", derive(Serialize))]
145#[non_exhaustive]
146pub struct ClassModifiers {
147 pub is_abstract: bool,
149 pub is_final: bool,
151 pub is_readonly: bool,
153}
154
155#[derive(Debug)]
157#[cfg_attr(feature = "serde", derive(Serialize))]
158pub struct ClassMember<'arena, 'src> {
159 pub kind: ClassMemberKind<'arena, 'src>,
161 pub span: Span,
163}
164
165#[derive(Debug)]
167#[cfg_attr(feature = "serde", derive(Serialize))]
168#[non_exhaustive]
169pub enum ClassMemberKind<'arena, 'src> {
170 Property(PropertyDecl<'arena, 'src>),
172 Method(MethodDecl<'arena, 'src>),
174 ClassConst(ClassConstDecl<'arena, 'src>),
176 TraitUse(TraitUseDecl<'arena, 'src>),
178}
179
180#[derive(Debug)]
182#[cfg_attr(feature = "serde", derive(Serialize))]
183pub struct PropertyDecl<'arena, 'src> {
184 pub name: Ident<'src>,
186 pub visibility: Option<Visibility>,
188 pub set_visibility: Option<Visibility>,
190 pub is_static: bool,
192 pub is_readonly: bool,
194 pub type_hint: Option<TypeHint<'arena, 'src>>,
196 pub default: Option<Expr<'arena, 'src>>,
198 pub attributes: ArenaVec<'arena, Attribute<'arena, 'src>>,
200 #[cfg_attr(feature = "serde", serde(skip_serializing_if = "ArenaVec::is_empty"))]
202 pub hooks: ArenaVec<'arena, PropertyHook<'arena, 'src>>,
203 #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
205 pub doc_comment: Option<Comment<'src>>,
206}
207
208#[derive(Debug, Clone, Copy, PartialEq, Eq)]
210#[cfg_attr(feature = "serde", derive(Serialize))]
211#[non_exhaustive]
212pub enum PropertyHookKind {
213 Get,
215 Set,
217}
218
219#[derive(Debug)]
221#[cfg_attr(feature = "serde", derive(Serialize))]
222#[non_exhaustive]
223pub enum PropertyHookBody<'arena, 'src> {
224 Block(&'arena Block<'arena, 'src>),
226 Expression(Expr<'arena, 'src>),
228 Abstract,
230}
231
232#[derive(Debug)]
234#[cfg_attr(feature = "serde", derive(Serialize))]
235pub struct PropertyHook<'arena, 'src> {
236 pub kind: PropertyHookKind,
238 pub body: PropertyHookBody<'arena, 'src>,
240 pub is_final: bool,
242 pub by_ref: bool,
244 pub params: ArenaVec<'arena, Param<'arena, 'src>>,
246 pub attributes: ArenaVec<'arena, Attribute<'arena, 'src>>,
248 pub span: Span,
250}
251
252#[derive(Debug)]
254#[cfg_attr(feature = "serde", derive(Serialize))]
255#[non_exhaustive]
256pub struct MethodDecl<'arena, 'src> {
257 pub name: Ident<'src>,
259 pub visibility: Option<Visibility>,
261 pub is_static: bool,
263 pub is_abstract: bool,
265 pub is_final: bool,
267 pub by_ref: bool,
269 pub params: ArenaVec<'arena, Param<'arena, 'src>>,
271 pub return_type: Option<TypeHint<'arena, 'src>>,
273 pub body: Option<&'arena Block<'arena, 'src>>,
275 pub attributes: ArenaVec<'arena, Attribute<'arena, 'src>>,
277 #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
279 pub doc_comment: Option<Comment<'src>>,
280}
281
282impl<'arena, 'src> MethodDecl<'arena, 'src> {
283 pub fn new(arena: &'arena bumpalo::Bump, name: Ident<'src>) -> Self {
287 Self {
288 name,
289 visibility: None,
290 is_static: false,
291 is_abstract: false,
292 is_final: false,
293 by_ref: false,
294 params: ArenaVec::new_in(arena),
295 return_type: None,
296 body: None,
297 attributes: ArenaVec::new_in(arena),
298 doc_comment: None,
299 }
300 }
301}
302
303#[derive(Debug)]
305#[cfg_attr(feature = "serde", derive(Serialize))]
306pub struct ClassConstDecl<'arena, 'src> {
307 pub name: Ident<'src>,
309 pub visibility: Option<Visibility>,
311 pub is_final: bool,
313 #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
315 pub type_hint: Option<&'arena TypeHint<'arena, 'src>>,
316 pub value: Expr<'arena, 'src>,
318 pub attributes: ArenaVec<'arena, Attribute<'arena, 'src>>,
320 #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
322 pub doc_comment: Option<Comment<'src>>,
323}
324
325#[derive(Debug)]
327#[cfg_attr(feature = "serde", derive(Serialize))]
328pub struct TraitUseDecl<'arena, 'src> {
329 pub traits: ArenaVec<'arena, Name<'arena, 'src>>,
331 pub adaptations: ArenaVec<'arena, TraitAdaptation<'arena, 'src>>,
333 #[cfg_attr(feature = "serde", serde(skip))]
336 pub adaptations_brace_span: Option<Span>,
337 #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
339 pub doc_comment: Option<Comment<'src>>,
340}
341
342#[derive(Debug)]
344#[cfg_attr(feature = "serde", derive(Serialize))]
345pub struct TraitAdaptation<'arena, 'src> {
346 pub kind: TraitAdaptationKind<'arena, 'src>,
348 pub span: Span,
350}
351
352#[derive(Debug)]
354#[cfg_attr(feature = "serde", derive(Serialize))]
355#[non_exhaustive]
356pub enum TraitAdaptationKind<'arena, 'src> {
357 Precedence {
359 trait_name: Name<'arena, 'src>,
361 method: Name<'arena, 'src>,
363 insteadof: ArenaVec<'arena, Name<'arena, 'src>>,
365 },
366 Alias {
368 trait_name: Option<Name<'arena, 'src>>,
370 method: Name<'arena, 'src>,
372 new_modifier: Option<Visibility>,
374 new_name: Option<Name<'arena, 'src>>,
376 },
377}
378
379#[derive(Debug)]
381#[cfg_attr(feature = "serde", derive(Serialize))]
382pub struct InterfaceDecl<'arena, 'src> {
383 pub name: Ident<'src>,
385 pub extends: ArenaVec<'arena, Name<'arena, 'src>>,
387 #[cfg_attr(feature = "serde", serde(flatten))]
389 pub body: ClassBody<'arena, 'src>,
390 pub attributes: ArenaVec<'arena, Attribute<'arena, 'src>>,
392 #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
394 pub doc_comment: Option<Comment<'src>>,
395}
396
397#[derive(Debug)]
399#[cfg_attr(feature = "serde", derive(Serialize))]
400pub struct TraitDecl<'arena, 'src> {
401 pub name: Ident<'src>,
403 #[cfg_attr(feature = "serde", serde(flatten))]
405 pub body: ClassBody<'arena, 'src>,
406 pub attributes: ArenaVec<'arena, Attribute<'arena, 'src>>,
408 #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
410 pub doc_comment: Option<Comment<'src>>,
411}
412
413#[derive(Debug)]
415#[cfg_attr(feature = "serde", derive(Serialize))]
416pub struct EnumBody<'arena, 'src> {
417 pub members: ArenaVec<'arena, EnumMember<'arena, 'src>>,
419 #[cfg_attr(feature = "serde", serde(skip))]
421 pub span: Span,
422}
423
424#[derive(Debug)]
426#[cfg_attr(feature = "serde", derive(Serialize))]
427pub struct EnumDecl<'arena, 'src> {
428 pub name: Ident<'src>,
430 pub scalar_type: Option<Name<'arena, 'src>>,
432 pub implements: ArenaVec<'arena, Name<'arena, 'src>>,
434 #[cfg_attr(feature = "serde", serde(flatten))]
436 pub body: EnumBody<'arena, 'src>,
437 pub attributes: ArenaVec<'arena, Attribute<'arena, 'src>>,
439 #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
441 pub doc_comment: Option<Comment<'src>>,
442}
443
444#[derive(Debug)]
446#[cfg_attr(feature = "serde", derive(Serialize))]
447pub struct EnumMember<'arena, 'src> {
448 pub kind: EnumMemberKind<'arena, 'src>,
450 pub span: Span,
452}
453
454#[derive(Debug)]
456#[cfg_attr(feature = "serde", derive(Serialize))]
457#[non_exhaustive]
458pub enum EnumMemberKind<'arena, 'src> {
459 Case(EnumCase<'arena, 'src>),
461 Method(MethodDecl<'arena, 'src>),
463 ClassConst(ClassConstDecl<'arena, 'src>),
465 TraitUse(TraitUseDecl<'arena, 'src>),
467}
468
469#[derive(Debug)]
471#[cfg_attr(feature = "serde", derive(Serialize))]
472pub struct EnumCase<'arena, 'src> {
473 pub name: Ident<'src>,
475 pub value: Option<Expr<'arena, 'src>>,
477 pub attributes: ArenaVec<'arena, Attribute<'arena, 'src>>,
479 #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
481 pub doc_comment: Option<Comment<'src>>,
482}