Skip to main content

react_compiler_ast/
patterns.rs

1use serde::{Deserialize, Serialize};
2
3use crate::common::BaseNode;
4use crate::expressions::{Expression, Identifier};
5
6/// Covers assignment targets and patterns.
7/// In Babel, LVal includes Identifier, MemberExpression, ObjectPattern, ArrayPattern,
8/// RestElement, AssignmentPattern.
9#[derive(Debug, Clone, Serialize, Deserialize)]
10#[serde(tag = "type")]
11pub enum PatternLike {
12    Identifier(Identifier),
13    ObjectPattern(ObjectPattern),
14    ArrayPattern(ArrayPattern),
15    AssignmentPattern(AssignmentPattern),
16    RestElement(RestElement),
17    // Expressions can appear in pattern positions (e.g., MemberExpression as LVal)
18    MemberExpression(crate::expressions::MemberExpression),
19    TSAsExpression(crate::expressions::TSAsExpression),
20    TSSatisfiesExpression(crate::expressions::TSSatisfiesExpression),
21    TSNonNullExpression(crate::expressions::TSNonNullExpression),
22    TSTypeAssertion(crate::expressions::TSTypeAssertion),
23    // Flow's analogue of the TS cast wrappers: `(expr: SomeType)`.
24    TypeCastExpression(crate::expressions::TypeCastExpression),
25}
26
27#[derive(Debug, Clone, Serialize, Deserialize)]
28pub struct ObjectPattern {
29    #[serde(flatten)]
30    pub base: BaseNode,
31    pub properties: Vec<ObjectPatternProperty>,
32    #[serde(
33        default,
34        skip_serializing_if = "Option::is_none",
35        rename = "typeAnnotation"
36    )]
37    pub type_annotation: Option<Box<serde_json::Value>>,
38    #[serde(default, skip_serializing_if = "Option::is_none")]
39    pub decorators: Option<Vec<serde_json::Value>>,
40}
41
42#[derive(Debug, Clone, Serialize, Deserialize)]
43#[serde(tag = "type")]
44pub enum ObjectPatternProperty {
45    ObjectProperty(ObjectPatternProp),
46    RestElement(RestElement),
47}
48
49#[derive(Debug, Clone, Serialize, Deserialize)]
50pub struct ObjectPatternProp {
51    #[serde(flatten)]
52    pub base: BaseNode,
53    pub key: Box<Expression>,
54    pub value: Box<PatternLike>,
55    pub computed: bool,
56    pub shorthand: bool,
57    #[serde(default, skip_serializing_if = "Option::is_none")]
58    pub decorators: Option<Vec<serde_json::Value>>,
59    #[serde(default, skip_serializing_if = "Option::is_none")]
60    pub method: Option<bool>,
61}
62
63#[derive(Debug, Clone, Serialize, Deserialize)]
64pub struct ArrayPattern {
65    #[serde(flatten)]
66    pub base: BaseNode,
67    pub elements: Vec<Option<PatternLike>>,
68    #[serde(
69        default,
70        skip_serializing_if = "Option::is_none",
71        rename = "typeAnnotation"
72    )]
73    pub type_annotation: Option<Box<serde_json::Value>>,
74    #[serde(default, skip_serializing_if = "Option::is_none")]
75    pub decorators: Option<Vec<serde_json::Value>>,
76}
77
78#[derive(Debug, Clone, Serialize, Deserialize)]
79pub struct AssignmentPattern {
80    #[serde(flatten)]
81    pub base: BaseNode,
82    pub left: Box<PatternLike>,
83    pub right: Box<Expression>,
84    #[serde(
85        default,
86        skip_serializing_if = "Option::is_none",
87        rename = "typeAnnotation"
88    )]
89    pub type_annotation: Option<Box<serde_json::Value>>,
90    #[serde(default, skip_serializing_if = "Option::is_none")]
91    pub decorators: Option<Vec<serde_json::Value>>,
92}
93
94#[derive(Debug, Clone, Serialize, Deserialize)]
95pub struct RestElement {
96    #[serde(flatten)]
97    pub base: BaseNode,
98    pub argument: Box<PatternLike>,
99    #[serde(
100        default,
101        skip_serializing_if = "Option::is_none",
102        rename = "typeAnnotation"
103    )]
104    pub type_annotation: Option<Box<serde_json::Value>>,
105    #[serde(default, skip_serializing_if = "Option::is_none")]
106    pub decorators: Option<Vec<serde_json::Value>>,
107}