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))]
11#[non_exhaustive]
12pub struct FunctionDecl<'arena, 'src> {
13 pub name: Ident<'src>,
15 pub params: ArenaVec<'arena, Param<'arena, 'src>>,
17 #[cfg_attr(feature = "serde", serde(skip_serializing_if = "super::is_false"))]
19 pub missing_param_list: bool,
20 pub body: &'arena Block<'arena, 'src>,
22 pub return_type: Option<TypeHint<'arena, 'src>>,
24 pub by_ref: bool,
26 pub attributes: ArenaVec<'arena, Attribute<'arena, 'src>>,
28 #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
35 pub doc_comment: Option<Comment<'src>>,
36}
37
38impl<'arena, 'src> FunctionDecl<'arena, 'src> {
39 pub fn new(
42 arena: &'arena bumpalo::Bump,
43 name: Ident<'src>,
44 body: &'arena Block<'arena, 'src>,
45 ) -> Self {
46 Self {
47 name,
48 params: ArenaVec::new_in(arena),
49 missing_param_list: false,
50 body,
51 return_type: None,
52 by_ref: false,
53 attributes: ArenaVec::new_in(arena),
54 doc_comment: None,
55 }
56 }
57}
58
59#[derive(Debug)]
61#[cfg_attr(feature = "serde", derive(Serialize))]
62#[non_exhaustive]
63pub struct Param<'arena, 'src> {
64 pub name: Ident<'src>,
66 pub type_hint: Option<TypeHint<'arena, 'src>>,
68 pub default: Option<Expr<'arena, 'src>>,
70 pub by_ref: bool,
72 pub variadic: bool,
74 #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Modifiers::is_empty"))]
76 pub modifiers: Modifiers,
77 pub attributes: ArenaVec<'arena, Attribute<'arena, 'src>>,
79 #[cfg_attr(feature = "serde", serde(skip_serializing_if = "ArenaVec::is_empty"))]
81 pub hooks: ArenaVec<'arena, PropertyHook<'arena, 'src>>,
82 #[cfg_attr(feature = "serde", serde(skip_serializing_if = "super::is_false"))]
84 pub empty_hook_list: bool,
85 #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
90 pub doc_comment: Option<Comment<'src>>,
91 pub span: Span,
93}
94
95impl<'arena, 'src> Param<'arena, 'src> {
96 pub fn new(arena: &'arena bumpalo::Bump, name: Ident<'src>, span: Span) -> Self {
101 Self {
102 name,
103 type_hint: None,
104 default: None,
105 by_ref: false,
106 variadic: false,
107 modifiers: Modifiers::new(),
108 attributes: ArenaVec::new_in(arena),
109 hooks: ArenaVec::new_in(arena),
110 empty_hook_list: false,
111 doc_comment: None,
112 span,
113 }
114 }
115}
116
117#[derive(Debug, Clone, Copy, Default, PartialEq, Eq)]
120#[cfg_attr(feature = "serde", derive(Serialize))]
121#[non_exhaustive]
122pub struct Modifiers {
123 #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
125 pub visibility: Option<Visibility>,
126 #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
128 pub set_visibility: Option<Visibility>,
129 #[cfg_attr(feature = "serde", serde(skip_serializing_if = "super::is_false"))]
131 pub is_static: bool,
132 #[cfg_attr(feature = "serde", serde(skip_serializing_if = "super::is_false"))]
134 pub is_abstract: bool,
135 #[cfg_attr(feature = "serde", serde(skip_serializing_if = "super::is_false"))]
137 pub is_final: bool,
138 #[cfg_attr(feature = "serde", serde(skip_serializing_if = "super::is_false"))]
140 pub is_readonly: bool,
141 #[cfg_attr(feature = "serde", serde(skip_serializing_if = "super::is_false"))]
143 pub is_var: bool,
144}
145
146impl Modifiers {
147 pub const fn new() -> Self {
151 Self {
152 visibility: None,
153 set_visibility: None,
154 is_static: false,
155 is_abstract: false,
156 is_final: false,
157 is_readonly: false,
158 is_var: false,
159 }
160 }
161
162 pub fn is_empty(&self) -> bool {
164 *self == Self::new()
165 }
166}
167
168#[derive(Debug, Clone, Copy, PartialEq, Eq)]
170#[cfg_attr(feature = "serde", derive(Serialize))]
171#[non_exhaustive]
172pub enum Visibility {
173 Public,
175 Protected,
177 Private,
179}
180
181#[derive(Debug)]
183#[cfg_attr(feature = "serde", derive(Serialize))]
184pub struct ClassBody<'arena, 'src> {
185 pub members: ArenaVec<'arena, ClassMember<'arena, 'src>>,
187 #[cfg_attr(feature = "serde", serde(skip))]
189 pub span: Span,
190}
191
192#[derive(Debug)]
194#[cfg_attr(feature = "serde", derive(Serialize))]
195#[non_exhaustive]
196pub struct ClassDecl<'arena, 'src> {
197 pub name: Option<Ident<'src>>,
199 pub modifiers: ClassModifiers,
201 pub extends: Option<Name<'arena, 'src>>,
203 pub implements: ArenaVec<'arena, Name<'arena, 'src>>,
205 #[cfg_attr(feature = "serde", serde(flatten))]
207 pub body: ClassBody<'arena, 'src>,
208 pub attributes: ArenaVec<'arena, Attribute<'arena, 'src>>,
210 #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
212 pub doc_comment: Option<Comment<'src>>,
213}
214
215impl<'arena, 'src> ClassDecl<'arena, 'src> {
216 pub fn new(
219 arena: &'arena bumpalo::Bump,
220 name: Option<Ident<'src>>,
221 body: ClassBody<'arena, 'src>,
222 ) -> Self {
223 Self {
224 name,
225 modifiers: ClassModifiers::default(),
226 extends: None,
227 implements: ArenaVec::new_in(arena),
228 body,
229 attributes: ArenaVec::new_in(arena),
230 doc_comment: None,
231 }
232 }
233}
234
235#[derive(Debug, Clone, Default)]
237#[cfg_attr(feature = "serde", derive(Serialize))]
238#[non_exhaustive]
239pub struct ClassModifiers {
240 pub is_abstract: bool,
242 pub is_final: bool,
244 pub is_readonly: bool,
246}
247
248#[derive(Debug)]
250#[cfg_attr(feature = "serde", derive(Serialize))]
251pub struct ClassMember<'arena, 'src> {
252 pub kind: ClassMemberKind<'arena, 'src>,
254 pub span: Span,
256}
257
258#[derive(Debug)]
260#[cfg_attr(feature = "serde", derive(Serialize))]
261#[non_exhaustive]
262pub enum ClassMemberKind<'arena, 'src> {
263 Property(PropertyDecl<'arena, 'src>),
265 Method(MethodDecl<'arena, 'src>),
267 ClassConst(ClassConstDecl<'arena, 'src>),
269 TraitUse(TraitUseDecl<'arena, 'src>),
271}
272
273#[derive(Debug)]
275#[cfg_attr(feature = "serde", derive(Serialize))]
276#[non_exhaustive]
277pub struct PropertyDecl<'arena, 'src> {
278 pub name: Ident<'src>,
280 #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Modifiers::is_empty"))]
282 pub modifiers: Modifiers,
283 pub type_hint: Option<TypeHint<'arena, 'src>>,
285 pub default: Option<Expr<'arena, 'src>>,
287 pub attributes: ArenaVec<'arena, Attribute<'arena, 'src>>,
289 #[cfg_attr(feature = "serde", serde(skip_serializing_if = "ArenaVec::is_empty"))]
291 pub hooks: ArenaVec<'arena, PropertyHook<'arena, 'src>>,
292 #[cfg_attr(feature = "serde", serde(skip_serializing_if = "super::is_false"))]
294 pub empty_hook_list: bool,
295 #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
297 pub doc_comment: Option<Comment<'src>>,
298}
299
300impl<'arena, 'src> PropertyDecl<'arena, 'src> {
301 pub fn new(arena: &'arena bumpalo::Bump, name: Ident<'src>) -> Self {
304 Self {
305 name,
306 modifiers: Modifiers::new(),
307 type_hint: None,
308 default: None,
309 attributes: ArenaVec::new_in(arena),
310 hooks: ArenaVec::new_in(arena),
311 empty_hook_list: false,
312 doc_comment: None,
313 }
314 }
315}
316
317#[derive(Debug, Clone, Copy, PartialEq, Eq)]
319#[cfg_attr(feature = "serde", derive(Serialize))]
320#[non_exhaustive]
321pub enum PropertyHookKind {
322 Get,
324 Set,
326}
327
328#[derive(Debug)]
330#[cfg_attr(feature = "serde", derive(Serialize))]
331#[non_exhaustive]
332pub enum PropertyHookBody<'arena, 'src> {
333 Block(&'arena Block<'arena, 'src>),
335 Expression(Expr<'arena, 'src>),
337 Abstract,
339}
340
341#[derive(Debug)]
343#[cfg_attr(feature = "serde", derive(Serialize))]
344#[non_exhaustive]
345pub struct PropertyHook<'arena, 'src> {
346 pub kind: PropertyHookKind,
348 pub body: PropertyHookBody<'arena, 'src>,
350 #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Modifiers::is_empty"))]
352 pub modifiers: Modifiers,
353 pub by_ref: bool,
355 pub params: ArenaVec<'arena, Param<'arena, 'src>>,
357 pub attributes: ArenaVec<'arena, Attribute<'arena, 'src>>,
359 pub span: Span,
361}
362
363impl<'arena, 'src> PropertyHook<'arena, 'src> {
364 pub fn new(
367 arena: &'arena bumpalo::Bump,
368 kind: PropertyHookKind,
369 body: PropertyHookBody<'arena, 'src>,
370 span: Span,
371 ) -> Self {
372 Self {
373 kind,
374 body,
375 modifiers: Modifiers::new(),
376 by_ref: false,
377 params: ArenaVec::new_in(arena),
378 attributes: ArenaVec::new_in(arena),
379 span,
380 }
381 }
382}
383
384#[derive(Debug)]
386#[cfg_attr(feature = "serde", derive(Serialize))]
387#[non_exhaustive]
388pub struct MethodDecl<'arena, 'src> {
389 pub name: Ident<'src>,
391 #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Modifiers::is_empty"))]
393 pub modifiers: Modifiers,
394 pub by_ref: bool,
396 pub params: ArenaVec<'arena, Param<'arena, 'src>>,
398 #[cfg_attr(feature = "serde", serde(skip_serializing_if = "super::is_false"))]
400 pub missing_param_list: bool,
401 pub return_type: Option<TypeHint<'arena, 'src>>,
403 pub body: Option<&'arena Block<'arena, 'src>>,
405 pub attributes: ArenaVec<'arena, Attribute<'arena, 'src>>,
407 #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
409 pub doc_comment: Option<Comment<'src>>,
410}
411
412impl<'arena, 'src> MethodDecl<'arena, 'src> {
413 pub fn new(arena: &'arena bumpalo::Bump, name: Ident<'src>) -> Self {
417 Self {
418 name,
419 modifiers: Modifiers::new(),
420 by_ref: false,
421 params: ArenaVec::new_in(arena),
422 missing_param_list: false,
423 return_type: None,
424 body: None,
425 attributes: ArenaVec::new_in(arena),
426 doc_comment: None,
427 }
428 }
429}
430
431#[derive(Debug)]
433#[cfg_attr(feature = "serde", derive(Serialize))]
434#[non_exhaustive]
435pub struct ClassConstDecl<'arena, 'src> {
436 pub name: Ident<'src>,
438 #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Modifiers::is_empty"))]
440 pub modifiers: Modifiers,
441 #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
443 pub type_hint: Option<&'arena TypeHint<'arena, 'src>>,
444 pub value: Expr<'arena, 'src>,
446 pub attributes: ArenaVec<'arena, Attribute<'arena, 'src>>,
448 #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
450 pub doc_comment: Option<Comment<'src>>,
451}
452
453impl<'arena, 'src> ClassConstDecl<'arena, 'src> {
454 pub fn new(arena: &'arena bumpalo::Bump, name: Ident<'src>, value: Expr<'arena, 'src>) -> Self {
457 Self {
458 name,
459 modifiers: Modifiers::new(),
460 type_hint: None,
461 value,
462 attributes: ArenaVec::new_in(arena),
463 doc_comment: None,
464 }
465 }
466}
467
468#[derive(Debug)]
470#[cfg_attr(feature = "serde", derive(Serialize))]
471#[non_exhaustive]
472pub struct TraitUseDecl<'arena, 'src> {
473 pub traits: ArenaVec<'arena, Name<'arena, 'src>>,
475 pub adaptations: ArenaVec<'arena, TraitAdaptation<'arena, 'src>>,
477 #[cfg_attr(feature = "serde", serde(skip))]
480 #[doc(hidden)]
481 pub adaptations_brace_span: Option<Span>,
482 #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
484 pub doc_comment: Option<Comment<'src>>,
485}
486
487impl<'arena, 'src> TraitUseDecl<'arena, 'src> {
488 pub fn new(arena: &'arena bumpalo::Bump, traits: ArenaVec<'arena, Name<'arena, 'src>>) -> Self {
491 Self {
492 traits,
493 adaptations: ArenaVec::new_in(arena),
494 adaptations_brace_span: None,
495 doc_comment: None,
496 }
497 }
498}
499
500#[derive(Debug)]
502#[cfg_attr(feature = "serde", derive(Serialize))]
503pub struct TraitAdaptation<'arena, 'src> {
504 pub kind: TraitAdaptationKind<'arena, 'src>,
506 pub span: Span,
508}
509
510#[derive(Debug)]
512#[cfg_attr(feature = "serde", derive(Serialize))]
513#[non_exhaustive]
514pub enum TraitAdaptationKind<'arena, 'src> {
515 Precedence {
517 trait_name: Name<'arena, 'src>,
519 method: Name<'arena, 'src>,
521 insteadof: ArenaVec<'arena, Name<'arena, 'src>>,
523 },
524 Alias {
526 trait_name: Option<Name<'arena, 'src>>,
528 method: Name<'arena, 'src>,
530 new_modifier: Option<Visibility>,
532 #[cfg_attr(feature = "serde", serde(skip_serializing_if = "super::is_false"))]
534 is_final: bool,
535 new_name: Option<Name<'arena, 'src>>,
537 },
538}
539
540#[derive(Debug)]
542#[cfg_attr(feature = "serde", derive(Serialize))]
543#[non_exhaustive]
544pub struct InterfaceDecl<'arena, 'src> {
545 pub name: Ident<'src>,
547 pub extends: ArenaVec<'arena, Name<'arena, 'src>>,
549 #[cfg_attr(feature = "serde", serde(flatten))]
551 pub body: ClassBody<'arena, 'src>,
552 pub attributes: ArenaVec<'arena, Attribute<'arena, 'src>>,
554 #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
556 pub doc_comment: Option<Comment<'src>>,
557}
558
559impl<'arena, 'src> InterfaceDecl<'arena, 'src> {
560 pub fn new(
563 arena: &'arena bumpalo::Bump,
564 name: Ident<'src>,
565 body: ClassBody<'arena, 'src>,
566 ) -> Self {
567 Self {
568 name,
569 extends: ArenaVec::new_in(arena),
570 body,
571 attributes: ArenaVec::new_in(arena),
572 doc_comment: None,
573 }
574 }
575}
576
577#[derive(Debug)]
579#[cfg_attr(feature = "serde", derive(Serialize))]
580#[non_exhaustive]
581pub struct TraitDecl<'arena, 'src> {
582 pub name: Ident<'src>,
584 #[cfg_attr(feature = "serde", serde(flatten))]
586 pub body: ClassBody<'arena, 'src>,
587 pub attributes: ArenaVec<'arena, Attribute<'arena, 'src>>,
589 #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
591 pub doc_comment: Option<Comment<'src>>,
592}
593
594impl<'arena, 'src> TraitDecl<'arena, 'src> {
595 pub fn new(
598 arena: &'arena bumpalo::Bump,
599 name: Ident<'src>,
600 body: ClassBody<'arena, 'src>,
601 ) -> Self {
602 Self {
603 name,
604 body,
605 attributes: ArenaVec::new_in(arena),
606 doc_comment: None,
607 }
608 }
609}
610
611#[derive(Debug)]
613#[cfg_attr(feature = "serde", derive(Serialize))]
614pub struct EnumBody<'arena, 'src> {
615 pub members: ArenaVec<'arena, EnumMember<'arena, 'src>>,
617 #[cfg_attr(feature = "serde", serde(skip))]
619 pub span: Span,
620}
621
622#[derive(Debug)]
624#[cfg_attr(feature = "serde", derive(Serialize))]
625#[non_exhaustive]
626pub struct EnumDecl<'arena, 'src> {
627 pub name: Ident<'src>,
629 pub scalar_type: Option<Name<'arena, 'src>>,
631 pub implements: ArenaVec<'arena, Name<'arena, 'src>>,
633 #[cfg_attr(feature = "serde", serde(flatten))]
635 pub body: EnumBody<'arena, 'src>,
636 pub attributes: ArenaVec<'arena, Attribute<'arena, 'src>>,
638 #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
640 pub doc_comment: Option<Comment<'src>>,
641}
642
643impl<'arena, 'src> EnumDecl<'arena, 'src> {
644 pub fn new(
647 arena: &'arena bumpalo::Bump,
648 name: Ident<'src>,
649 body: EnumBody<'arena, 'src>,
650 ) -> Self {
651 Self {
652 name,
653 scalar_type: None,
654 implements: ArenaVec::new_in(arena),
655 body,
656 attributes: ArenaVec::new_in(arena),
657 doc_comment: None,
658 }
659 }
660}
661
662#[derive(Debug)]
664#[cfg_attr(feature = "serde", derive(Serialize))]
665pub struct EnumMember<'arena, 'src> {
666 pub kind: EnumMemberKind<'arena, 'src>,
668 pub span: Span,
670}
671
672#[derive(Debug)]
674#[cfg_attr(feature = "serde", derive(Serialize))]
675#[non_exhaustive]
676pub enum EnumMemberKind<'arena, 'src> {
677 Case(EnumCase<'arena, 'src>),
679 Method(MethodDecl<'arena, 'src>),
681 ClassConst(ClassConstDecl<'arena, 'src>),
683 TraitUse(TraitUseDecl<'arena, 'src>),
685 Property(PropertyDecl<'arena, 'src>),
687}
688
689#[derive(Debug)]
691#[cfg_attr(feature = "serde", derive(Serialize))]
692#[non_exhaustive]
693pub struct EnumCase<'arena, 'src> {
694 pub name: Ident<'src>,
696 pub value: Option<Expr<'arena, 'src>>,
698 pub attributes: ArenaVec<'arena, Attribute<'arena, 'src>>,
700 #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
702 pub doc_comment: Option<Comment<'src>>,
703}
704
705impl<'arena, 'src> EnumCase<'arena, 'src> {
706 pub fn new(arena: &'arena bumpalo::Bump, name: Ident<'src>) -> Self {
709 Self {
710 name,
711 value: None,
712 attributes: ArenaVec::new_in(arena),
713 doc_comment: None,
714 }
715 }
716}