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