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