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 #[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 #[tag("ClassMethod")]
66 Method(ClassMethod),
67 #[tag("PrivateMethod")]
68 PrivateMethod(PrivateMethod),
69 #[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 #[tag("StaticBlock")]
81 StaticBlock(StaticBlock),
82
83 #[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 #[cfg_attr(feature = "serde-impl", serde(default))]
118 pub accessibility: Option<Accessibility>,
119
120 #[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 #[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#[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 #[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}