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))]
274#[cfg_attr(swc_ast_unknown, non_exhaustive)]
275pub enum MethodKind {
276    #[default]
277    #[cfg_attr(feature = "serde-impl", serde(rename = "method"))]
278    Method,
279    #[cfg_attr(feature = "serde-impl", serde(rename = "getter"))]
280    Getter,
281    #[cfg_attr(feature = "serde-impl", serde(rename = "setter"))]
282    Setter,
283}
284
285#[ast_node("StaticBlock")]
286#[derive(Eq, Hash, EqIgnoreSpan, Default)]
287#[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))]
288#[cfg_attr(feature = "shrink-to-fit", derive(shrink_to_fit::ShrinkToFit))]
289pub struct StaticBlock {
290    pub span: Span,
291    pub body: BlockStmt,
292}
293
294impl Take for StaticBlock {
295    fn dummy() -> Self {
296        StaticBlock {
297            span: DUMMY_SP,
298            body: Take::dummy(),
299        }
300    }
301}
302
303/// Either a private name or a public name.
304#[ast_node]
305#[derive(Is, Eq, Hash, EqIgnoreSpan)]
306#[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))]
307#[cfg_attr(feature = "shrink-to-fit", derive(shrink_to_fit::ShrinkToFit))]
308pub enum Key {
309    #[tag("PrivateName")]
310    Private(PrivateName),
311    #[tag("Identifier")]
312    #[tag("StringLiteral")]
313    #[tag("NumericLiteral")]
314    #[tag("Computed")]
315    #[tag("BigIntLiteral")]
316    Public(PropName),
317}
318
319bridge_from!(Key, IdentName, Ident);
320bridge_from!(Key, PropName, IdentName);
321bridge_from!(Key, PropName, Id);
322bridge_from!(Key, PropName, Number);
323bridge_from!(Key, PropName, ComputedPropName);
324bridge_from!(Key, PropName, BigInt);
325
326impl Take for Key {
327    fn dummy() -> Self {
328        Default::default()
329    }
330}
331
332impl Default for Key {
333    fn default() -> Self {
334        Key::Public(Default::default())
335    }
336}
337
338#[ast_node("AutoAccessor")]
339#[derive(Eq, Hash, EqIgnoreSpan, Default)]
340#[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))]
341#[cfg_attr(feature = "shrink-to-fit", derive(shrink_to_fit::ShrinkToFit))]
342pub struct AutoAccessor {
343    #[cfg_attr(feature = "serde-impl", serde(default))]
344    pub span: Span,
345
346    pub key: Key,
347
348    #[cfg_attr(feature = "serde-impl", serde(default))]
349    pub value: Option<Box<Expr>>,
350
351    #[cfg_attr(feature = "serde-impl", serde(default, rename = "typeAnnotation"))]
352    pub type_ann: Option<Box<TsTypeAnn>>,
353
354    #[cfg_attr(feature = "serde-impl", serde(default))]
355    pub is_static: bool,
356
357    #[cfg_attr(feature = "serde-impl", serde(default))]
358    pub decorators: Vec<Decorator>,
359
360    /// Typescript extension.
361    #[cfg_attr(feature = "serde-impl", serde(default))]
362    pub accessibility: Option<Accessibility>,
363
364    #[cfg_attr(feature = "serde-impl", serde(default))]
365    pub is_abstract: bool,
366
367    #[cfg_attr(feature = "serde-impl", serde(default))]
368    pub is_override: bool,
369
370    #[cfg_attr(feature = "serde-impl", serde(default))]
371    pub definite: bool,
372}
373
374impl Take for AutoAccessor {
375    fn dummy() -> AutoAccessor {
376        AutoAccessor {
377            span: Take::dummy(),
378            key: Take::dummy(),
379            value: Take::dummy(),
380            type_ann: None,
381            is_static: false,
382            decorators: Take::dummy(),
383            accessibility: None,
384            is_abstract: false,
385            is_override: false,
386            definite: false,
387        }
388    }
389}