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 #[cfg_attr(feature = "serde", serde(skip_serializing_if = "super::is_false"))]
359 pub empty_param_list: bool,
360 pub attributes: ArenaVec<'arena, Attribute<'arena, 'src>>,
362 #[cfg_attr(feature = "serde", serde(skip))]
364 #[doc(hidden)]
365 pub name_span: Span,
366 pub span: Span,
368}
369
370impl<'arena, 'src> PropertyHook<'arena, 'src> {
371 pub fn new(
374 arena: &'arena bumpalo::Bump,
375 kind: PropertyHookKind,
376 body: PropertyHookBody<'arena, 'src>,
377 span: Span,
378 ) -> Self {
379 Self {
380 kind,
381 body,
382 modifiers: Modifiers::new(),
383 by_ref: false,
384 params: ArenaVec::new_in(arena),
385 empty_param_list: false,
386 attributes: ArenaVec::new_in(arena),
387 name_span: Span::DUMMY,
388 span,
389 }
390 }
391}
392
393#[derive(Debug)]
395#[cfg_attr(feature = "serde", derive(Serialize))]
396#[non_exhaustive]
397pub struct MethodDecl<'arena, 'src> {
398 pub name: Ident<'src>,
400 #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Modifiers::is_empty"))]
402 pub modifiers: Modifiers,
403 pub by_ref: bool,
405 pub params: ArenaVec<'arena, Param<'arena, 'src>>,
407 #[cfg_attr(feature = "serde", serde(skip_serializing_if = "super::is_false"))]
409 pub missing_param_list: bool,
410 pub return_type: Option<TypeHint<'arena, 'src>>,
412 pub body: Option<&'arena Block<'arena, 'src>>,
414 pub attributes: ArenaVec<'arena, Attribute<'arena, 'src>>,
416 #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
418 pub doc_comment: Option<Comment<'src>>,
419}
420
421impl<'arena, 'src> MethodDecl<'arena, 'src> {
422 pub fn new(arena: &'arena bumpalo::Bump, name: Ident<'src>) -> Self {
426 Self {
427 name,
428 modifiers: Modifiers::new(),
429 by_ref: false,
430 params: ArenaVec::new_in(arena),
431 missing_param_list: false,
432 return_type: None,
433 body: None,
434 attributes: ArenaVec::new_in(arena),
435 doc_comment: None,
436 }
437 }
438}
439
440#[derive(Debug)]
442#[cfg_attr(feature = "serde", derive(Serialize))]
443#[non_exhaustive]
444pub struct ClassConstDecl<'arena, 'src> {
445 pub name: Ident<'src>,
447 #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Modifiers::is_empty"))]
449 pub modifiers: Modifiers,
450 #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
452 pub type_hint: Option<&'arena TypeHint<'arena, 'src>>,
453 pub value: Expr<'arena, 'src>,
455 pub attributes: ArenaVec<'arena, Attribute<'arena, 'src>>,
457 #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
459 pub doc_comment: Option<Comment<'src>>,
460}
461
462impl<'arena, 'src> ClassConstDecl<'arena, 'src> {
463 pub fn new(arena: &'arena bumpalo::Bump, name: Ident<'src>, value: Expr<'arena, 'src>) -> Self {
466 Self {
467 name,
468 modifiers: Modifiers::new(),
469 type_hint: None,
470 value,
471 attributes: ArenaVec::new_in(arena),
472 doc_comment: None,
473 }
474 }
475}
476
477#[derive(Debug)]
479#[cfg_attr(feature = "serde", derive(Serialize))]
480#[non_exhaustive]
481pub struct TraitUseDecl<'arena, 'src> {
482 pub traits: ArenaVec<'arena, Name<'arena, 'src>>,
484 pub adaptations: ArenaVec<'arena, TraitAdaptation<'arena, 'src>>,
486 #[cfg_attr(feature = "serde", serde(skip))]
489 #[doc(hidden)]
490 pub adaptations_brace_span: Option<Span>,
491 #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
493 pub doc_comment: Option<Comment<'src>>,
494}
495
496impl<'arena, 'src> TraitUseDecl<'arena, 'src> {
497 pub fn new(arena: &'arena bumpalo::Bump, traits: ArenaVec<'arena, Name<'arena, 'src>>) -> Self {
500 Self {
501 traits,
502 adaptations: ArenaVec::new_in(arena),
503 adaptations_brace_span: None,
504 doc_comment: None,
505 }
506 }
507}
508
509#[derive(Debug)]
511#[cfg_attr(feature = "serde", derive(Serialize))]
512pub struct TraitAdaptation<'arena, 'src> {
513 pub kind: TraitAdaptationKind<'arena, 'src>,
515 pub span: Span,
517}
518
519#[derive(Debug)]
521#[cfg_attr(feature = "serde", derive(Serialize))]
522#[non_exhaustive]
523pub enum TraitAdaptationKind<'arena, 'src> {
524 Precedence {
526 trait_name: Name<'arena, 'src>,
528 method: Name<'arena, 'src>,
530 insteadof: ArenaVec<'arena, Name<'arena, 'src>>,
532 },
533 Alias {
535 trait_name: Option<Name<'arena, 'src>>,
537 method: Name<'arena, 'src>,
539 new_modifier: Option<Visibility>,
541 #[cfg_attr(feature = "serde", serde(skip_serializing_if = "super::is_false"))]
543 is_final: bool,
544 #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
546 invalid_modifier: Option<Ident<'src>>,
547 new_name: Option<Name<'arena, 'src>>,
549 },
550}
551
552#[derive(Debug)]
554#[cfg_attr(feature = "serde", derive(Serialize))]
555#[non_exhaustive]
556pub struct InterfaceDecl<'arena, 'src> {
557 pub name: Ident<'src>,
559 pub extends: ArenaVec<'arena, Name<'arena, 'src>>,
561 #[cfg_attr(feature = "serde", serde(flatten))]
563 pub body: ClassBody<'arena, 'src>,
564 pub attributes: ArenaVec<'arena, Attribute<'arena, 'src>>,
566 #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
568 pub doc_comment: Option<Comment<'src>>,
569}
570
571impl<'arena, 'src> InterfaceDecl<'arena, 'src> {
572 pub fn new(
575 arena: &'arena bumpalo::Bump,
576 name: Ident<'src>,
577 body: ClassBody<'arena, 'src>,
578 ) -> Self {
579 Self {
580 name,
581 extends: ArenaVec::new_in(arena),
582 body,
583 attributes: ArenaVec::new_in(arena),
584 doc_comment: None,
585 }
586 }
587}
588
589#[derive(Debug)]
591#[cfg_attr(feature = "serde", derive(Serialize))]
592#[non_exhaustive]
593pub struct TraitDecl<'arena, 'src> {
594 pub name: Ident<'src>,
596 #[cfg_attr(feature = "serde", serde(flatten))]
598 pub body: ClassBody<'arena, 'src>,
599 pub attributes: ArenaVec<'arena, Attribute<'arena, 'src>>,
601 #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
603 pub doc_comment: Option<Comment<'src>>,
604}
605
606impl<'arena, 'src> TraitDecl<'arena, 'src> {
607 pub fn new(
610 arena: &'arena bumpalo::Bump,
611 name: Ident<'src>,
612 body: ClassBody<'arena, 'src>,
613 ) -> Self {
614 Self {
615 name,
616 body,
617 attributes: ArenaVec::new_in(arena),
618 doc_comment: None,
619 }
620 }
621}
622
623#[derive(Debug)]
625#[cfg_attr(feature = "serde", derive(Serialize))]
626pub struct EnumBody<'arena, 'src> {
627 pub members: ArenaVec<'arena, EnumMember<'arena, 'src>>,
629 #[cfg_attr(feature = "serde", serde(skip))]
631 pub span: Span,
632}
633
634#[derive(Debug)]
636#[cfg_attr(feature = "serde", derive(Serialize))]
637#[non_exhaustive]
638pub struct EnumDecl<'arena, 'src> {
639 pub name: Ident<'src>,
641 pub scalar_type: Option<Name<'arena, 'src>>,
643 pub implements: ArenaVec<'arena, Name<'arena, 'src>>,
645 #[cfg_attr(feature = "serde", serde(flatten))]
647 pub body: EnumBody<'arena, 'src>,
648 pub attributes: ArenaVec<'arena, Attribute<'arena, 'src>>,
650 #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
652 pub doc_comment: Option<Comment<'src>>,
653}
654
655impl<'arena, 'src> EnumDecl<'arena, 'src> {
656 pub fn new(
659 arena: &'arena bumpalo::Bump,
660 name: Ident<'src>,
661 body: EnumBody<'arena, 'src>,
662 ) -> Self {
663 Self {
664 name,
665 scalar_type: None,
666 implements: ArenaVec::new_in(arena),
667 body,
668 attributes: ArenaVec::new_in(arena),
669 doc_comment: None,
670 }
671 }
672}
673
674#[derive(Debug)]
676#[cfg_attr(feature = "serde", derive(Serialize))]
677pub struct EnumMember<'arena, 'src> {
678 pub kind: EnumMemberKind<'arena, 'src>,
680 pub span: Span,
682}
683
684#[derive(Debug)]
686#[cfg_attr(feature = "serde", derive(Serialize))]
687#[non_exhaustive]
688pub enum EnumMemberKind<'arena, 'src> {
689 Case(EnumCase<'arena, 'src>),
691 Method(MethodDecl<'arena, 'src>),
693 ClassConst(ClassConstDecl<'arena, 'src>),
695 TraitUse(TraitUseDecl<'arena, 'src>),
697 Property(PropertyDecl<'arena, 'src>),
699}
700
701#[derive(Debug)]
703#[cfg_attr(feature = "serde", derive(Serialize))]
704#[non_exhaustive]
705pub struct EnumCase<'arena, 'src> {
706 pub name: Ident<'src>,
708 pub value: Option<Expr<'arena, 'src>>,
710 pub attributes: ArenaVec<'arena, Attribute<'arena, 'src>>,
712 #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
714 pub doc_comment: Option<Comment<'src>>,
715}
716
717impl<'arena, 'src> EnumCase<'arena, 'src> {
718 pub fn new(arena: &'arena bumpalo::Bump, name: Ident<'src>) -> Self {
721 Self {
722 name,
723 value: None,
724 attributes: ArenaVec::new_in(arena),
725 doc_comment: None,
726 }
727 }
728}