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)]
34#[non_exhaustive]
35pub struct Param<'arena, 'src> {
36 pub name: Ident<'src>,
38 pub type_hint: Option<TypeHint<'arena, 'src>>,
40 pub default: Option<Expr<'arena, 'src>>,
42 pub by_ref: bool,
44 pub variadic: bool,
46 pub is_readonly: bool,
48 pub is_final: bool,
50 pub visibility: Option<Visibility>,
52 pub set_visibility: Option<Visibility>,
54 pub attributes: ArenaVec<'arena, Attribute<'arena, 'src>>,
56 #[serde(skip_serializing_if = "ArenaVec::is_empty")]
58 pub hooks: ArenaVec<'arena, PropertyHook<'arena, 'src>>,
59 #[serde(skip_serializing_if = "Option::is_none")]
64 pub doc_comment: Option<Comment<'src>>,
65 pub span: Span,
67}
68
69impl<'arena, 'src> Param<'arena, 'src> {
70 pub fn new(arena: &'arena bumpalo::Bump, name: Ident<'src>, span: Span) -> Self {
75 Self {
76 name,
77 type_hint: None,
78 default: None,
79 by_ref: false,
80 variadic: false,
81 is_readonly: false,
82 is_final: false,
83 visibility: None,
84 set_visibility: None,
85 attributes: ArenaVec::new_in(arena),
86 hooks: ArenaVec::new_in(arena),
87 doc_comment: None,
88 span,
89 }
90 }
91}
92
93#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize)]
95#[non_exhaustive]
96pub enum Visibility {
97 Public,
99 Protected,
101 Private,
103}
104
105#[derive(Debug, Serialize)]
107pub struct ClassBody<'arena, 'src> {
108 pub members: ArenaVec<'arena, ClassMember<'arena, 'src>>,
110 #[serde(skip)]
112 pub span: Span,
113}
114
115#[derive(Debug, Serialize)]
117pub struct ClassDecl<'arena, 'src> {
118 pub name: Option<Ident<'src>>,
120 pub modifiers: ClassModifiers,
122 pub extends: Option<Name<'arena, 'src>>,
124 pub implements: ArenaVec<'arena, Name<'arena, 'src>>,
126 #[serde(flatten)]
128 pub body: ClassBody<'arena, 'src>,
129 pub attributes: ArenaVec<'arena, Attribute<'arena, 'src>>,
131 #[serde(skip_serializing_if = "Option::is_none")]
133 pub doc_comment: Option<Comment<'src>>,
134}
135
136#[derive(Debug, Clone, Serialize, Default)]
138#[non_exhaustive]
139pub struct ClassModifiers {
140 pub is_abstract: bool,
142 pub is_final: bool,
144 pub is_readonly: bool,
146}
147
148#[derive(Debug, Serialize)]
150pub struct ClassMember<'arena, 'src> {
151 pub kind: ClassMemberKind<'arena, 'src>,
153 pub span: Span,
155}
156
157#[derive(Debug, Serialize)]
159#[non_exhaustive]
160pub enum ClassMemberKind<'arena, 'src> {
161 Property(PropertyDecl<'arena, 'src>),
163 Method(MethodDecl<'arena, 'src>),
165 ClassConst(ClassConstDecl<'arena, 'src>),
167 TraitUse(TraitUseDecl<'arena, 'src>),
169}
170
171#[derive(Debug, Serialize)]
173pub struct PropertyDecl<'arena, 'src> {
174 pub name: Ident<'src>,
176 pub visibility: Option<Visibility>,
178 pub set_visibility: Option<Visibility>,
180 pub is_static: bool,
182 pub is_readonly: bool,
184 pub type_hint: Option<TypeHint<'arena, 'src>>,
186 pub default: Option<Expr<'arena, 'src>>,
188 pub attributes: ArenaVec<'arena, Attribute<'arena, 'src>>,
190 #[serde(skip_serializing_if = "ArenaVec::is_empty")]
192 pub hooks: ArenaVec<'arena, PropertyHook<'arena, 'src>>,
193 #[serde(skip_serializing_if = "Option::is_none")]
195 pub doc_comment: Option<Comment<'src>>,
196}
197
198#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize)]
200#[non_exhaustive]
201pub enum PropertyHookKind {
202 Get,
204 Set,
206}
207
208#[derive(Debug, Serialize)]
210#[non_exhaustive]
211pub enum PropertyHookBody<'arena, 'src> {
212 Block(&'arena Block<'arena, 'src>),
214 Expression(Expr<'arena, 'src>),
216 Abstract,
218}
219
220#[derive(Debug, Serialize)]
222pub struct PropertyHook<'arena, 'src> {
223 pub kind: PropertyHookKind,
225 pub body: PropertyHookBody<'arena, 'src>,
227 pub is_final: bool,
229 pub by_ref: bool,
231 pub params: ArenaVec<'arena, Param<'arena, 'src>>,
233 pub attributes: ArenaVec<'arena, Attribute<'arena, 'src>>,
235 pub span: Span,
237}
238
239#[derive(Debug, Serialize)]
241#[non_exhaustive]
242pub struct MethodDecl<'arena, 'src> {
243 pub name: Ident<'src>,
245 pub visibility: Option<Visibility>,
247 pub is_static: bool,
249 pub is_abstract: bool,
251 pub is_final: bool,
253 pub by_ref: bool,
255 pub params: ArenaVec<'arena, Param<'arena, 'src>>,
257 pub return_type: Option<TypeHint<'arena, 'src>>,
259 pub body: Option<&'arena Block<'arena, 'src>>,
261 pub attributes: ArenaVec<'arena, Attribute<'arena, 'src>>,
263 #[serde(skip_serializing_if = "Option::is_none")]
265 pub doc_comment: Option<Comment<'src>>,
266}
267
268impl<'arena, 'src> MethodDecl<'arena, 'src> {
269 pub fn new(arena: &'arena bumpalo::Bump, name: Ident<'src>) -> Self {
273 Self {
274 name,
275 visibility: None,
276 is_static: false,
277 is_abstract: false,
278 is_final: false,
279 by_ref: false,
280 params: ArenaVec::new_in(arena),
281 return_type: None,
282 body: None,
283 attributes: ArenaVec::new_in(arena),
284 doc_comment: None,
285 }
286 }
287}
288
289#[derive(Debug, Serialize)]
291pub struct ClassConstDecl<'arena, 'src> {
292 pub name: Ident<'src>,
294 pub visibility: Option<Visibility>,
296 pub is_final: bool,
298 #[serde(skip_serializing_if = "Option::is_none")]
300 pub type_hint: Option<&'arena TypeHint<'arena, 'src>>,
301 pub value: Expr<'arena, 'src>,
303 pub attributes: ArenaVec<'arena, Attribute<'arena, 'src>>,
305 #[serde(skip_serializing_if = "Option::is_none")]
307 pub doc_comment: Option<Comment<'src>>,
308}
309
310#[derive(Debug, Serialize)]
312pub struct TraitUseDecl<'arena, 'src> {
313 pub traits: ArenaVec<'arena, Name<'arena, 'src>>,
315 pub adaptations: ArenaVec<'arena, TraitAdaptation<'arena, 'src>>,
317 #[serde(skip)]
320 pub adaptations_brace_span: Option<Span>,
321 #[serde(skip_serializing_if = "Option::is_none")]
323 pub doc_comment: Option<Comment<'src>>,
324}
325
326#[derive(Debug, Serialize)]
328pub struct TraitAdaptation<'arena, 'src> {
329 pub kind: TraitAdaptationKind<'arena, 'src>,
331 pub span: Span,
333}
334
335#[derive(Debug, Serialize)]
337#[non_exhaustive]
338pub enum TraitAdaptationKind<'arena, 'src> {
339 Precedence {
341 trait_name: Name<'arena, 'src>,
343 method: Name<'arena, 'src>,
345 insteadof: ArenaVec<'arena, Name<'arena, 'src>>,
347 },
348 Alias {
350 trait_name: Option<Name<'arena, 'src>>,
352 method: Name<'arena, 'src>,
354 new_modifier: Option<Visibility>,
356 new_name: Option<Name<'arena, 'src>>,
358 },
359}
360
361#[derive(Debug, Serialize)]
363pub struct InterfaceDecl<'arena, 'src> {
364 pub name: Ident<'src>,
366 pub extends: ArenaVec<'arena, Name<'arena, 'src>>,
368 #[serde(flatten)]
370 pub body: ClassBody<'arena, 'src>,
371 pub attributes: ArenaVec<'arena, Attribute<'arena, 'src>>,
373 #[serde(skip_serializing_if = "Option::is_none")]
375 pub doc_comment: Option<Comment<'src>>,
376}
377
378#[derive(Debug, Serialize)]
380pub struct TraitDecl<'arena, 'src> {
381 pub name: Ident<'src>,
383 #[serde(flatten)]
385 pub body: ClassBody<'arena, 'src>,
386 pub attributes: ArenaVec<'arena, Attribute<'arena, 'src>>,
388 #[serde(skip_serializing_if = "Option::is_none")]
390 pub doc_comment: Option<Comment<'src>>,
391}
392
393#[derive(Debug, Serialize)]
395pub struct EnumBody<'arena, 'src> {
396 pub members: ArenaVec<'arena, EnumMember<'arena, 'src>>,
398 #[serde(skip)]
400 pub span: Span,
401}
402
403#[derive(Debug, Serialize)]
405pub struct EnumDecl<'arena, 'src> {
406 pub name: Ident<'src>,
408 pub scalar_type: Option<Name<'arena, 'src>>,
410 pub implements: ArenaVec<'arena, Name<'arena, 'src>>,
412 #[serde(flatten)]
414 pub body: EnumBody<'arena, 'src>,
415 pub attributes: ArenaVec<'arena, Attribute<'arena, 'src>>,
417 #[serde(skip_serializing_if = "Option::is_none")]
419 pub doc_comment: Option<Comment<'src>>,
420}
421
422#[derive(Debug, Serialize)]
424pub struct EnumMember<'arena, 'src> {
425 pub kind: EnumMemberKind<'arena, 'src>,
427 pub span: Span,
429}
430
431#[derive(Debug, Serialize)]
433#[non_exhaustive]
434pub enum EnumMemberKind<'arena, 'src> {
435 Case(EnumCase<'arena, 'src>),
437 Method(MethodDecl<'arena, 'src>),
439 ClassConst(ClassConstDecl<'arena, 'src>),
441 TraitUse(TraitUseDecl<'arena, 'src>),
443}
444
445#[derive(Debug, Serialize)]
447pub struct EnumCase<'arena, 'src> {
448 pub name: Ident<'src>,
450 pub value: Option<Expr<'arena, 'src>>,
452 pub attributes: ArenaVec<'arena, Attribute<'arena, 'src>>,
454 #[serde(skip_serializing_if = "Option::is_none")]
456 pub doc_comment: Option<Comment<'src>>,
457}