1use serde::{Deserialize, Serialize};
2
3use crate::common::BaseNode;
4use crate::jsx::{JSXElement, JSXFragment};
5use crate::literals::*;
6use crate::operators::*;
7use crate::patterns::{AssignmentPattern, PatternLike};
8use crate::statements::BlockStatement;
9
10#[derive(Debug, Clone, Serialize, Deserialize)]
11pub struct Identifier {
12 #[serde(flatten)]
13 pub base: BaseNode,
14 pub name: String,
15 #[serde(
16 default,
17 skip_serializing_if = "Option::is_none",
18 rename = "typeAnnotation"
19 )]
20 pub type_annotation: Option<Box<serde_json::Value>>,
21 #[serde(default, skip_serializing_if = "Option::is_none")]
22 pub optional: Option<bool>,
23 #[serde(default, skip_serializing_if = "Option::is_none")]
24 pub decorators: Option<Vec<serde_json::Value>>,
25}
26
27#[derive(Debug, Clone, Serialize, Deserialize)]
28#[serde(tag = "type")]
29pub enum Expression {
30 Identifier(Identifier),
31 StringLiteral(StringLiteral),
32 NumericLiteral(NumericLiteral),
33 BooleanLiteral(BooleanLiteral),
34 NullLiteral(NullLiteral),
35 BigIntLiteral(BigIntLiteral),
36 RegExpLiteral(RegExpLiteral),
37 CallExpression(CallExpression),
38 MemberExpression(MemberExpression),
39 OptionalCallExpression(OptionalCallExpression),
40 OptionalMemberExpression(OptionalMemberExpression),
41 BinaryExpression(BinaryExpression),
42 LogicalExpression(LogicalExpression),
43 UnaryExpression(UnaryExpression),
44 UpdateExpression(UpdateExpression),
45 ConditionalExpression(ConditionalExpression),
46 AssignmentExpression(AssignmentExpression),
47 SequenceExpression(SequenceExpression),
48 ArrowFunctionExpression(ArrowFunctionExpression),
49 FunctionExpression(FunctionExpression),
50 ObjectExpression(ObjectExpression),
51 ArrayExpression(ArrayExpression),
52 NewExpression(NewExpression),
53 TemplateLiteral(TemplateLiteral),
54 TaggedTemplateExpression(TaggedTemplateExpression),
55 AwaitExpression(AwaitExpression),
56 YieldExpression(YieldExpression),
57 SpreadElement(SpreadElement),
58 MetaProperty(MetaProperty),
59 ClassExpression(ClassExpression),
60 PrivateName(PrivateName),
61 Super(Super),
62 Import(Import),
63 ThisExpression(ThisExpression),
64 ParenthesizedExpression(ParenthesizedExpression),
65 JSXElement(Box<JSXElement>),
67 JSXFragment(JSXFragment),
68 AssignmentPattern(AssignmentPattern),
70 TSAsExpression(TSAsExpression),
72 TSSatisfiesExpression(TSSatisfiesExpression),
73 TSNonNullExpression(TSNonNullExpression),
74 TSTypeAssertion(TSTypeAssertion),
75 TSInstantiationExpression(TSInstantiationExpression),
76 TypeCastExpression(TypeCastExpression),
78}
79
80#[derive(Debug, Clone, Serialize, Deserialize)]
81pub struct CallExpression {
82 #[serde(flatten)]
83 pub base: BaseNode,
84 pub callee: Box<Expression>,
85 pub arguments: Vec<Expression>,
86 #[serde(
87 default,
88 skip_serializing_if = "Option::is_none",
89 rename = "typeParameters"
90 )]
91 pub type_parameters: Option<Box<serde_json::Value>>,
92 #[serde(
93 default,
94 skip_serializing_if = "Option::is_none",
95 rename = "typeArguments"
96 )]
97 pub type_arguments: Option<Box<serde_json::Value>>,
98 #[serde(default, skip_serializing_if = "Option::is_none")]
99 pub optional: Option<bool>,
100}
101
102#[derive(Debug, Clone, Serialize, Deserialize)]
103pub struct MemberExpression {
104 #[serde(flatten)]
105 pub base: BaseNode,
106 pub object: Box<Expression>,
107 pub property: Box<Expression>,
108 pub computed: bool,
109}
110
111#[derive(Debug, Clone, Serialize, Deserialize)]
112pub struct OptionalCallExpression {
113 #[serde(flatten)]
114 pub base: BaseNode,
115 pub callee: Box<Expression>,
116 pub arguments: Vec<Expression>,
117 pub optional: bool,
118 #[serde(
119 default,
120 skip_serializing_if = "Option::is_none",
121 rename = "typeParameters"
122 )]
123 pub type_parameters: Option<Box<serde_json::Value>>,
124 #[serde(
125 default,
126 skip_serializing_if = "Option::is_none",
127 rename = "typeArguments"
128 )]
129 pub type_arguments: Option<Box<serde_json::Value>>,
130}
131
132#[derive(Debug, Clone, Serialize, Deserialize)]
133pub struct OptionalMemberExpression {
134 #[serde(flatten)]
135 pub base: BaseNode,
136 pub object: Box<Expression>,
137 pub property: Box<Expression>,
138 pub computed: bool,
139 pub optional: bool,
140}
141
142#[derive(Debug, Clone, Serialize, Deserialize)]
143pub struct BinaryExpression {
144 #[serde(flatten)]
145 pub base: BaseNode,
146 pub operator: BinaryOperator,
147 pub left: Box<Expression>,
148 pub right: Box<Expression>,
149}
150
151#[derive(Debug, Clone, Serialize, Deserialize)]
152pub struct LogicalExpression {
153 #[serde(flatten)]
154 pub base: BaseNode,
155 pub operator: LogicalOperator,
156 pub left: Box<Expression>,
157 pub right: Box<Expression>,
158}
159
160#[derive(Debug, Clone, Serialize, Deserialize)]
161pub struct UnaryExpression {
162 #[serde(flatten)]
163 pub base: BaseNode,
164 pub operator: UnaryOperator,
165 pub prefix: bool,
166 pub argument: Box<Expression>,
167}
168
169#[derive(Debug, Clone, Serialize, Deserialize)]
170pub struct UpdateExpression {
171 #[serde(flatten)]
172 pub base: BaseNode,
173 pub operator: UpdateOperator,
174 pub argument: Box<Expression>,
175 pub prefix: bool,
176}
177
178#[derive(Debug, Clone, Serialize, Deserialize)]
179pub struct ConditionalExpression {
180 #[serde(flatten)]
181 pub base: BaseNode,
182 pub test: Box<Expression>,
183 pub consequent: Box<Expression>,
184 pub alternate: Box<Expression>,
185}
186
187#[derive(Debug, Clone, Serialize, Deserialize)]
188pub struct AssignmentExpression {
189 #[serde(flatten)]
190 pub base: BaseNode,
191 pub operator: AssignmentOperator,
192 pub left: Box<PatternLike>,
193 pub right: Box<Expression>,
194}
195
196#[derive(Debug, Clone, Serialize, Deserialize)]
197pub struct SequenceExpression {
198 #[serde(flatten)]
199 pub base: BaseNode,
200 pub expressions: Vec<Expression>,
201}
202
203#[derive(Debug, Clone, Serialize, Deserialize)]
204pub struct ArrowFunctionExpression {
205 #[serde(flatten)]
206 pub base: BaseNode,
207 pub params: Vec<PatternLike>,
208 pub body: Box<ArrowFunctionBody>,
209 #[serde(default)]
210 pub id: Option<Identifier>,
211 #[serde(default)]
212 pub generator: bool,
213 #[serde(default, rename = "async")]
214 pub is_async: bool,
215 #[serde(default, skip_serializing_if = "Option::is_none")]
216 pub expression: Option<bool>,
217 #[serde(
218 default,
219 skip_serializing_if = "Option::is_none",
220 rename = "returnType"
221 )]
222 pub return_type: Option<Box<serde_json::Value>>,
223 #[serde(
224 default,
225 skip_serializing_if = "Option::is_none",
226 rename = "typeParameters"
227 )]
228 pub type_parameters: Option<Box<serde_json::Value>>,
229 #[serde(
230 default,
231 skip_serializing_if = "Option::is_none",
232 rename = "predicate"
233 )]
234 pub predicate: Option<Box<serde_json::Value>>,
235}
236
237#[derive(Debug, Clone, Serialize, Deserialize)]
238#[serde(tag = "type")]
239pub enum ArrowFunctionBody {
240 BlockStatement(BlockStatement),
241 #[serde(untagged)]
242 Expression(Box<Expression>),
243}
244
245#[derive(Debug, Clone, Serialize, Deserialize)]
246pub struct FunctionExpression {
247 #[serde(flatten)]
248 pub base: BaseNode,
249 pub params: Vec<PatternLike>,
250 pub body: BlockStatement,
251 #[serde(default)]
252 pub id: Option<Identifier>,
253 #[serde(default)]
254 pub generator: bool,
255 #[serde(default, rename = "async")]
256 pub is_async: bool,
257 #[serde(
258 default,
259 skip_serializing_if = "Option::is_none",
260 rename = "returnType"
261 )]
262 pub return_type: Option<Box<serde_json::Value>>,
263 #[serde(
264 default,
265 skip_serializing_if = "Option::is_none",
266 rename = "typeParameters"
267 )]
268 pub type_parameters: Option<Box<serde_json::Value>>,
269 #[serde(
270 default,
271 skip_serializing_if = "Option::is_none",
272 rename = "predicate"
273 )]
274 pub predicate: Option<Box<serde_json::Value>>,
275}
276
277#[derive(Debug, Clone, Serialize, Deserialize)]
278pub struct ObjectExpression {
279 #[serde(flatten)]
280 pub base: BaseNode,
281 pub properties: Vec<ObjectExpressionProperty>,
282}
283
284#[derive(Debug, Clone, Serialize, Deserialize)]
285#[serde(tag = "type")]
286pub enum ObjectExpressionProperty {
287 ObjectProperty(ObjectProperty),
288 ObjectMethod(ObjectMethod),
289 SpreadElement(SpreadElement),
290}
291
292#[derive(Debug, Clone, Serialize, Deserialize)]
293pub struct ObjectProperty {
294 #[serde(flatten)]
295 pub base: BaseNode,
296 pub key: Box<Expression>,
297 pub value: Box<Expression>,
298 pub computed: bool,
299 pub shorthand: bool,
300 #[serde(default, skip_serializing_if = "Option::is_none")]
301 pub decorators: Option<Vec<serde_json::Value>>,
302 #[serde(default, skip_serializing_if = "Option::is_none")]
303 pub method: Option<bool>,
304}
305
306#[derive(Debug, Clone, Serialize, Deserialize)]
307pub struct ObjectMethod {
308 #[serde(flatten)]
309 pub base: BaseNode,
310 pub method: bool,
311 pub kind: ObjectMethodKind,
312 pub key: Box<Expression>,
313 pub params: Vec<PatternLike>,
314 pub body: BlockStatement,
315 pub computed: bool,
316 #[serde(default)]
317 pub id: Option<Identifier>,
318 #[serde(default)]
319 pub generator: bool,
320 #[serde(default, rename = "async")]
321 pub is_async: bool,
322 #[serde(default, skip_serializing_if = "Option::is_none")]
323 pub decorators: Option<Vec<serde_json::Value>>,
324 #[serde(
325 default,
326 skip_serializing_if = "Option::is_none",
327 rename = "returnType"
328 )]
329 pub return_type: Option<Box<serde_json::Value>>,
330 #[serde(
331 default,
332 skip_serializing_if = "Option::is_none",
333 rename = "typeParameters"
334 )]
335 pub type_parameters: Option<Box<serde_json::Value>>,
336 #[serde(
337 default,
338 skip_serializing_if = "Option::is_none",
339 rename = "predicate"
340 )]
341 pub predicate: Option<Box<serde_json::Value>>,
342}
343
344#[derive(Debug, Clone, Serialize, Deserialize)]
345#[serde(rename_all = "lowercase")]
346pub enum ObjectMethodKind {
347 Method,
348 Get,
349 Set,
350}
351
352#[derive(Debug, Clone, Serialize, Deserialize)]
353pub struct ArrayExpression {
354 #[serde(flatten)]
355 pub base: BaseNode,
356 pub elements: Vec<Option<Expression>>,
357}
358
359#[derive(Debug, Clone, Serialize, Deserialize)]
360pub struct NewExpression {
361 #[serde(flatten)]
362 pub base: BaseNode,
363 pub callee: Box<Expression>,
364 pub arguments: Vec<Expression>,
365 #[serde(
366 default,
367 skip_serializing_if = "Option::is_none",
368 rename = "typeParameters"
369 )]
370 pub type_parameters: Option<Box<serde_json::Value>>,
371 #[serde(
372 default,
373 skip_serializing_if = "Option::is_none",
374 deserialize_with = "crate::common::nullable_value",
375 rename = "typeArguments"
376 )]
377 pub type_arguments: Option<Box<serde_json::Value>>,
378}
379
380#[derive(Debug, Clone, Serialize, Deserialize)]
381pub struct TemplateLiteral {
382 #[serde(flatten)]
383 pub base: BaseNode,
384 pub quasis: Vec<TemplateElement>,
385 pub expressions: Vec<Expression>,
386}
387
388#[derive(Debug, Clone, Serialize, Deserialize)]
389pub struct TaggedTemplateExpression {
390 #[serde(flatten)]
391 pub base: BaseNode,
392 pub tag: Box<Expression>,
393 pub quasi: TemplateLiteral,
394 #[serde(
395 default,
396 skip_serializing_if = "Option::is_none",
397 rename = "typeParameters"
398 )]
399 pub type_parameters: Option<Box<serde_json::Value>>,
400}
401
402#[derive(Debug, Clone, Serialize, Deserialize)]
403pub struct AwaitExpression {
404 #[serde(flatten)]
405 pub base: BaseNode,
406 pub argument: Box<Expression>,
407}
408
409#[derive(Debug, Clone, Serialize, Deserialize)]
410pub struct YieldExpression {
411 #[serde(flatten)]
412 pub base: BaseNode,
413 #[serde(default, skip_serializing_if = "Option::is_none")]
414 pub argument: Option<Box<Expression>>,
415 pub delegate: bool,
416}
417
418#[derive(Debug, Clone, Serialize, Deserialize)]
419pub struct SpreadElement {
420 #[serde(flatten)]
421 pub base: BaseNode,
422 pub argument: Box<Expression>,
423}
424
425#[derive(Debug, Clone, Serialize, Deserialize)]
426pub struct MetaProperty {
427 #[serde(flatten)]
428 pub base: BaseNode,
429 pub meta: Identifier,
430 pub property: Identifier,
431}
432
433#[derive(Debug, Clone, Serialize, Deserialize)]
434pub struct ClassExpression {
435 #[serde(flatten)]
436 pub base: BaseNode,
437 #[serde(default)]
438 pub id: Option<Identifier>,
439 #[serde(rename = "superClass")]
440 pub super_class: Option<Box<Expression>>,
441 pub body: ClassBody,
442 #[serde(default, skip_serializing_if = "Option::is_none")]
443 pub decorators: Option<Vec<serde_json::Value>>,
444 #[serde(
445 default,
446 skip_serializing_if = "Option::is_none",
447 rename = "implements"
448 )]
449 pub implements: Option<Vec<serde_json::Value>>,
450 #[serde(
451 default,
452 skip_serializing_if = "Option::is_none",
453 rename = "superTypeParameters"
454 )]
455 pub super_type_parameters: Option<Box<serde_json::Value>>,
456 #[serde(
457 default,
458 skip_serializing_if = "Option::is_none",
459 rename = "typeParameters"
460 )]
461 pub type_parameters: Option<Box<serde_json::Value>>,
462}
463
464#[derive(Debug, Clone, Serialize, Deserialize)]
465pub struct ClassBody {
466 #[serde(flatten)]
467 pub base: BaseNode,
468 pub body: Vec<serde_json::Value>,
469}
470
471#[derive(Debug, Clone, Serialize, Deserialize)]
472pub struct PrivateName {
473 #[serde(flatten)]
474 pub base: BaseNode,
475 pub id: Identifier,
476}
477
478#[derive(Debug, Clone, Serialize, Deserialize)]
479pub struct Super {
480 #[serde(flatten)]
481 pub base: BaseNode,
482}
483
484#[derive(Debug, Clone, Serialize, Deserialize)]
485pub struct Import {
486 #[serde(flatten)]
487 pub base: BaseNode,
488}
489
490#[derive(Debug, Clone, Serialize, Deserialize)]
491pub struct ThisExpression {
492 #[serde(flatten)]
493 pub base: BaseNode,
494}
495
496#[derive(Debug, Clone, Serialize, Deserialize)]
497pub struct ParenthesizedExpression {
498 #[serde(flatten)]
499 pub base: BaseNode,
500 pub expression: Box<Expression>,
501}
502
503#[derive(Debug, Clone, Serialize, Deserialize)]
505pub struct TSAsExpression {
506 #[serde(flatten)]
507 pub base: BaseNode,
508 pub expression: Box<Expression>,
509 #[serde(rename = "typeAnnotation")]
510 pub type_annotation: Box<serde_json::Value>,
511}
512
513#[derive(Debug, Clone, Serialize, Deserialize)]
514pub struct TSSatisfiesExpression {
515 #[serde(flatten)]
516 pub base: BaseNode,
517 pub expression: Box<Expression>,
518 #[serde(rename = "typeAnnotation")]
519 pub type_annotation: Box<serde_json::Value>,
520}
521
522#[derive(Debug, Clone, Serialize, Deserialize)]
523pub struct TSNonNullExpression {
524 #[serde(flatten)]
525 pub base: BaseNode,
526 pub expression: Box<Expression>,
527}
528
529#[derive(Debug, Clone, Serialize, Deserialize)]
530pub struct TSTypeAssertion {
531 #[serde(flatten)]
532 pub base: BaseNode,
533 pub expression: Box<Expression>,
534 #[serde(rename = "typeAnnotation")]
535 pub type_annotation: Box<serde_json::Value>,
536}
537
538#[derive(Debug, Clone, Serialize, Deserialize)]
539pub struct TSInstantiationExpression {
540 #[serde(flatten)]
541 pub base: BaseNode,
542 pub expression: Box<Expression>,
543 #[serde(rename = "typeParameters")]
544 pub type_parameters: Box<serde_json::Value>,
545}
546
547#[derive(Debug, Clone, Serialize, Deserialize)]
549pub struct TypeCastExpression {
550 #[serde(flatten)]
551 pub base: BaseNode,
552 pub expression: Box<Expression>,
553 #[serde(rename = "typeAnnotation")]
554 pub type_annotation: Box<serde_json::Value>,
555}