Skip to main content

react_compiler_ast/
expressions.rs

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