react_compiler_ast/
patterns.rs1use serde::{Deserialize, Serialize};
2
3use crate::common::BaseNode;
4use crate::expressions::{Expression, Identifier};
5
6#[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 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}