swc_ecma_ast/
class.rs

1use is_macro::Is;
2use swc_common::{ast_node, util::take::Take, EqIgnoreSpan, Span, SyntaxContext, DUMMY_SP};
3
4use crate::{
5    expr::Expr,
6    function::{Function, ParamOrTsParamProp},
7    ident::PrivateName,
8    prop::PropName,
9    stmt::BlockStmt,
10    typescript::{
11        Accessibility, TsExprWithTypeArgs, TsIndexSignature, TsTypeAnn, TsTypeParamDecl,
12        TsTypeParamInstantiation,
13    },
14    BigInt, ComputedPropName, EmptyStmt, Id, Ident, IdentName, Number,
15};
16
17#[ast_node]
18#[derive(Eq, Hash, EqIgnoreSpan, Default)]
19#[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))]
20#[cfg_attr(feature = "shrink-to-fit", derive(shrink_to_fit::ShrinkToFit))]
21pub struct Class {
22    pub span: Span,
23
24    pub ctxt: SyntaxContext,
25
26    #[cfg_attr(feature = "serde-impl", serde(default))]
27    pub decorators: Vec<Decorator>,
28
29    #[cfg_attr(feature = "serde-impl", serde(default))]
30    pub body: Vec<ClassMember>,
31
32    #[cfg_attr(feature = "serde-impl", serde(default))]
33    pub super_class: Option<Box<Expr>>,
34
35    #[cfg_attr(feature = "serde-impl", serde(default))]
36    pub is_abstract: bool,
37
38    #[cfg_attr(feature = "serde-impl", serde(default))]
39    pub type_params: Option<Box<TsTypeParamDecl>>,
40
41    #[cfg_attr(feature = "serde-impl", serde(default))]
42    pub super_type_params: Option<Box<TsTypeParamInstantiation>>,
43
44    /// Typescript extension.
45    #[cfg_attr(feature = "serde-impl", serde(default))]
46    pub implements: Vec<TsExprWithTypeArgs>,
47}
48
49impl Take for Class {
50    fn dummy() -> Self {
51        Class {
52            ..Default::default()
53        }
54    }
55}
56
57#[ast_node]
58#[derive(Eq, Hash, Is, EqIgnoreSpan)]
59#[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))]
60#[cfg_attr(feature = "shrink-to-fit", derive(shrink_to_fit::ShrinkToFit))]
61pub enum ClassMember {
62    #[tag("Constructor")]
63    Constructor(Constructor),
64    /// `es2015`
65    #[tag("ClassMethod")]
66    Method(ClassMethod),
67    #[tag("PrivateMethod")]
68    PrivateMethod(PrivateMethod),
69    /// stage 0 / Typescript
70    #[tag("ClassProperty")]
71    ClassProp(ClassProp),
72    #[tag("PrivateProperty")]
73    PrivateProp(PrivateProp),
74    #[tag("TsIndexSignature")]
75    TsIndexSignature(TsIndexSignature),
76    #[tag("EmptyStatement")]
77    Empty(EmptyStmt),
78
79    /// Stage 3
80    #[tag("StaticBlock")]
81    StaticBlock(StaticBlock),
82
83    /// Stage 3
84    #[tag("AutoAccessor")]
85    AutoAccessor(AutoAccessor),
86}
87
88impl Take for ClassMember {
89    fn dummy() -> Self {
90        ClassMember::Empty(EmptyStmt { span: DUMMY_SP })
91    }
92}
93
94#[ast_node("ClassProperty")]
95#[derive(Eq, Hash, EqIgnoreSpan, Default)]
96#[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))]
97#[cfg_attr(feature = "shrink-to-fit", derive(shrink_to_fit::ShrinkToFit))]
98pub struct ClassProp {
99    #[cfg_attr(feature = "serde-impl", serde(default))]
100    pub span: Span,
101
102    pub key: PropName,
103
104    #[cfg_attr(feature = "serde-impl", serde(default))]
105    pub value: Option<Box<Expr>>,
106
107    #[cfg_attr(feature = "serde-impl", serde(default, rename = "typeAnnotation"))]
108    pub type_ann: Option<Box<TsTypeAnn>>,
109
110    #[cfg_attr(feature = "serde-impl", serde(default))]
111    pub is_static: bool,
112
113    #[cfg_attr(feature = "serde-impl", serde(default))]
114    pub decorators: Vec<Decorator>,
115
116    /// Typescript extension.
117    #[cfg_attr(feature = "serde-impl", serde(default))]
118    pub accessibility: Option<Accessibility>,
119
120    /// Typescript extension.
121    #[cfg_attr(feature = "serde-impl", serde(default))]
122    pub is_abstract: bool,
123
124    #[cfg_attr(feature = "serde-impl", serde(default))]
125    pub is_optional: bool,
126
127    #[cfg_attr(feature = "serde-impl", serde(default))]
128    pub is_override: bool,
129
130    #[cfg_attr(feature = "serde-impl", serde(default))]
131    pub readonly: bool,
132
133    #[cfg_attr(feature = "serde-impl", serde(default))]
134    pub declare: bool,
135
136    #[cfg_attr(feature = "serde-impl", serde(default))]
137    pub definite: bool,
138}
139
140#[ast_node("PrivateProperty")]
141#[derive(Eq, Hash, EqIgnoreSpan, Default)]
142#[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))]
143#[cfg_attr(feature = "shrink-to-fit", derive(shrink_to_fit::ShrinkToFit))]
144pub struct PrivateProp {
145    #[cfg_attr(feature = "serde-impl", serde(default))]
146    pub span: Span,
147
148    #[cfg_attr(feature = "serde-impl", serde(default))]
149    pub ctxt: SyntaxContext,
150
151    pub key: PrivateName,
152
153    #[cfg_attr(feature = "serde-impl", serde(default))]
154    pub value: Option<Box<Expr>>,
155
156    #[cfg_attr(feature = "serde-impl", serde(default, rename = "typeAnnotation"))]
157    pub type_ann: Option<Box<TsTypeAnn>>,
158
159    #[cfg_attr(feature = "serde-impl", serde(default))]
160    pub is_static: bool,
161
162    #[cfg_attr(feature = "serde-impl", serde(default))]
163    pub decorators: Vec<Decorator>,
164
165    /// Typescript extension.
166    #[cfg_attr(feature = "serde-impl", serde(default))]
167    pub accessibility: Option<Accessibility>,
168
169    #[cfg_attr(feature = "serde-impl", serde(default))]
170    pub is_optional: bool,
171
172    #[cfg_attr(feature = "serde-impl", serde(default))]
173    pub is_override: bool,
174
175    #[cfg_attr(feature = "serde-impl", serde(default))]
176    pub readonly: bool,
177
178    #[cfg_attr(feature = "serde-impl", serde(default))]
179    pub definite: bool,
180}
181
182#[ast_node("ClassMethod")]
183#[derive(Eq, Hash, EqIgnoreSpan, Default)]
184#[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))]
185#[cfg_attr(feature = "shrink-to-fit", derive(shrink_to_fit::ShrinkToFit))]
186pub struct ClassMethod {
187    #[cfg_attr(feature = "serde-impl", serde(default))]
188    pub span: Span,
189    pub key: PropName,
190    pub function: Box<Function>,
191    pub kind: MethodKind,
192    #[cfg_attr(feature = "serde-impl", serde(default))]
193    pub is_static: bool,
194    #[doc = r" Typescript extension."]
195    #[cfg_attr(feature = "serde-impl", serde(default))]
196    pub accessibility: Option<Accessibility>,
197    #[doc = r" Typescript extension."]
198    #[cfg_attr(feature = "serde-impl", serde(default))]
199    pub is_abstract: bool,
200    #[cfg_attr(feature = "serde-impl", serde(default))]
201    pub is_optional: bool,
202    #[cfg_attr(feature = "serde-impl", serde(default))]
203    pub is_override: bool,
204}
205
206#[ast_node("PrivateMethod")]
207#[derive(Eq, Hash, EqIgnoreSpan, Default)]
208#[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))]
209#[cfg_attr(feature = "shrink-to-fit", derive(shrink_to_fit::ShrinkToFit))]
210pub struct PrivateMethod {
211    #[cfg_attr(feature = "serde-impl", serde(default))]
212    pub span: Span,
213    pub key: PrivateName,
214    pub function: Box<Function>,
215    pub kind: MethodKind,
216    #[cfg_attr(feature = "serde-impl", serde(default))]
217    pub is_static: bool,
218    #[doc = r" Typescript extension."]
219    #[cfg_attr(feature = "serde-impl", serde(default))]
220    pub accessibility: Option<Accessibility>,
221    #[doc = r" Typescript extension."]
222    #[cfg_attr(feature = "serde-impl", serde(default))]
223    pub is_abstract: bool,
224    #[cfg_attr(feature = "serde-impl", serde(default))]
225    pub is_optional: bool,
226    #[cfg_attr(feature = "serde-impl", serde(default))]
227    pub is_override: bool,
228}
229
230#[ast_node("Constructor")]
231#[derive(Eq, Hash, EqIgnoreSpan, Default)]
232#[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))]
233#[cfg_attr(feature = "shrink-to-fit", derive(shrink_to_fit::ShrinkToFit))]
234pub struct Constructor {
235    pub span: Span,
236
237    pub ctxt: SyntaxContext,
238
239    pub key: PropName,
240
241    pub params: Vec<ParamOrTsParamProp>,
242
243    #[cfg_attr(feature = "serde-impl", serde(default))]
244    pub body: Option<BlockStmt>,
245
246    #[cfg_attr(feature = "serde-impl", serde(default))]
247    pub accessibility: Option<Accessibility>,
248
249    #[cfg_attr(feature = "serde-impl", serde(default))]
250    pub is_optional: bool,
251}
252
253#[ast_node("Decorator")]
254#[derive(Eq, Hash, EqIgnoreSpan, Default)]
255#[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))]
256#[cfg_attr(feature = "shrink-to-fit", derive(shrink_to_fit::ShrinkToFit))]
257pub struct Decorator {
258    pub span: Span,
259
260    #[cfg_attr(feature = "serde-impl", serde(rename = "expression"))]
261    pub expr: Box<Expr>,
262}
263
264#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, EqIgnoreSpan, Default)]
265#[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))]
266#[cfg_attr(
267    any(feature = "rkyv-impl"),
268    derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)
269)]
270#[cfg_attr(feature = "rkyv-impl", derive(bytecheck::CheckBytes))]
271#[cfg_attr(feature = "rkyv-impl", repr(u32))]
272#[cfg_attr(feature = "serde-impl", derive(serde::Serialize, serde::Deserialize))]
273#[cfg_attr(feature = "shrink-to-fit", derive(shrink_to_fit::ShrinkToFit))]
274pub enum MethodKind {
275    #[default]
276    #[cfg_attr(feature = "serde-impl", serde(rename = "method"))]
277    Method,
278    #[cfg_attr(feature = "serde-impl", serde(rename = "getter"))]
279    Getter,
280    #[cfg_attr(feature = "serde-impl", serde(rename = "setter"))]
281    Setter,
282}
283
284#[ast_node("StaticBlock")]
285#[derive(Eq, Hash, EqIgnoreSpan, Default)]
286#[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))]
287#[cfg_attr(feature = "shrink-to-fit", derive(shrink_to_fit::ShrinkToFit))]
288pub struct StaticBlock {
289    pub span: Span,
290    pub body: BlockStmt,
291}
292
293impl Take for StaticBlock {
294    fn dummy() -> Self {
295        StaticBlock {
296            span: DUMMY_SP,
297            body: Take::dummy(),
298        }
299    }
300}
301
302/// Either a private name or a public name.
303#[ast_node]
304#[derive(Is, Eq, Hash, EqIgnoreSpan)]
305#[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))]
306#[cfg_attr(feature = "shrink-to-fit", derive(shrink_to_fit::ShrinkToFit))]
307pub enum Key {
308    #[tag("PrivateName")]
309    Private(PrivateName),
310    #[tag("Identifier")]
311    #[tag("StringLiteral")]
312    #[tag("NumericLiteral")]
313    #[tag("Computed")]
314    #[tag("BigIntLiteral")]
315    Public(PropName),
316}
317
318bridge_from!(Key, IdentName, Ident);
319bridge_from!(Key, PropName, IdentName);
320bridge_from!(Key, PropName, Id);
321bridge_from!(Key, PropName, Number);
322bridge_from!(Key, PropName, ComputedPropName);
323bridge_from!(Key, PropName, BigInt);
324
325impl Take for Key {
326    fn dummy() -> Self {
327        Default::default()
328    }
329}
330
331impl Default for Key {
332    fn default() -> Self {
333        Key::Public(Default::default())
334    }
335}
336
337#[ast_node("AutoAccessor")]
338#[derive(Eq, Hash, EqIgnoreSpan, Default)]
339#[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))]
340#[cfg_attr(feature = "shrink-to-fit", derive(shrink_to_fit::ShrinkToFit))]
341pub struct AutoAccessor {
342    #[cfg_attr(feature = "serde-impl", serde(default))]
343    pub span: Span,
344
345    pub key: Key,
346
347    #[cfg_attr(feature = "serde-impl", serde(default))]
348    pub value: Option<Box<Expr>>,
349
350    #[cfg_attr(feature = "serde-impl", serde(default, rename = "typeAnnotation"))]
351    pub type_ann: Option<Box<TsTypeAnn>>,
352
353    #[cfg_attr(feature = "serde-impl", serde(default))]
354    pub is_static: bool,
355
356    #[cfg_attr(feature = "serde-impl", serde(default))]
357    pub decorators: Vec<Decorator>,
358
359    /// Typescript extension.
360    #[cfg_attr(feature = "serde-impl", serde(default))]
361    pub accessibility: Option<Accessibility>,
362
363    #[cfg_attr(feature = "serde-impl", serde(default))]
364    pub is_abstract: bool,
365
366    #[cfg_attr(feature = "serde-impl", serde(default))]
367    pub is_override: bool,
368
369    #[cfg_attr(feature = "serde-impl", serde(default))]
370    pub definite: bool,
371}
372
373impl Take for AutoAccessor {
374    fn dummy() -> AutoAccessor {
375        AutoAccessor {
376            span: Take::dummy(),
377            key: Take::dummy(),
378            value: Take::dummy(),
379            type_ann: None,
380            is_static: false,
381            decorators: Take::dummy(),
382            accessibility: None,
383            is_abstract: false,
384            is_override: false,
385            definite: false,
386        }
387    }
388}