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 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}