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}
24
25#[derive(Debug, Clone, Serialize, Deserialize)]
26pub struct ObjectPattern {
27    #[serde(flatten)]
28    pub base: BaseNode,
29    pub properties: Vec<ObjectPatternProperty>,
30    #[serde(
31        default,
32        skip_serializing_if = "Option::is_none",
33        rename = "typeAnnotation"
34    )]
35    pub type_annotation: Option<Box<serde_json::Value>>,
36    #[serde(default, skip_serializing_if = "Option::is_none")]
37    pub decorators: Option<Vec<serde_json::Value>>,
38}
39
40#[derive(Debug, Clone, Serialize, Deserialize)]
41#[serde(tag = "type")]
42pub enum ObjectPatternProperty {
43    ObjectProperty(ObjectPatternProp),
44    RestElement(RestElement),
45}
46
47#[derive(Debug, Clone, Serialize, Deserialize)]
48pub struct ObjectPatternProp {
49    #[serde(flatten)]
50    pub base: BaseNode,
51    pub key: Box<Expression>,
52    pub value: Box<PatternLike>,
53    pub computed: bool,
54    pub shorthand: bool,
55    #[serde(default, skip_serializing_if = "Option::is_none")]
56    pub decorators: Option<Vec<serde_json::Value>>,
57    #[serde(default, skip_serializing_if = "Option::is_none")]
58    pub method: Option<bool>,
59}
60
61#[derive(Debug, Clone, Serialize, Deserialize)]
62pub struct ArrayPattern {
63    #[serde(flatten)]
64    pub base: BaseNode,
65    pub elements: Vec<Option<PatternLike>>,
66    #[serde(
67        default,
68        skip_serializing_if = "Option::is_none",
69        rename = "typeAnnotation"
70    )]
71    pub type_annotation: Option<Box<serde_json::Value>>,
72    #[serde(default, skip_serializing_if = "Option::is_none")]
73    pub decorators: Option<Vec<serde_json::Value>>,
74}
75
76#[derive(Debug, Clone, Serialize, Deserialize)]
77pub struct AssignmentPattern {
78    #[serde(flatten)]
79    pub base: BaseNode,
80    pub left: Box<PatternLike>,
81    pub right: Box<Expression>,
82    #[serde(
83        default,
84        skip_serializing_if = "Option::is_none",
85        rename = "typeAnnotation"
86    )]
87    pub type_annotation: Option<Box<serde_json::Value>>,
88    #[serde(default, skip_serializing_if = "Option::is_none")]
89    pub decorators: Option<Vec<serde_json::Value>>,
90}
91
92#[derive(Debug, Clone, Serialize, Deserialize)]
93pub struct RestElement {
94    #[serde(flatten)]
95    pub base: BaseNode,
96    pub argument: Box<PatternLike>,
97    #[serde(
98        default,
99        skip_serializing_if = "Option::is_none",
100        rename = "typeAnnotation"
101    )]
102    pub type_annotation: Option<Box<serde_json::Value>>,
103    #[serde(default, skip_serializing_if = "Option::is_none")]
104    pub decorators: Option<Vec<serde_json::Value>>,
105}