1use serde::{Deserialize, Serialize};
2use swc_common::ast_serde;
3
4use crate::{
5 common::{BaseNode, Decorator, Identifier, PatternLike, RestElement, TypeAnnotOrNoop},
6 expr::{Expression, MemberExpression},
7 object::ObjectProperty,
8};
9
10#[derive(Debug, Clone, PartialEq)]
11#[ast_serde]
12pub enum Pattern {
13 #[tag("AssignmentPattern")]
14 Assignment(AssignmentPattern),
15 #[tag("ArrayPattern")]
16 Array(ArrayPattern),
17 #[tag("ObjectPattern")]
18 Object(ObjectPattern),
19}
20
21#[derive(Debug, Clone, PartialEq)]
22#[ast_serde]
23pub enum ObjectPatternProp {
24 #[tag("RestElement")]
25 Rest(RestElement),
26 #[tag("ObjectProperty")]
27 Prop(ObjectProperty),
28}
29
30#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
31#[serde(rename_all = "camelCase")]
32#[serde(tag = "type")]
33pub struct ObjectPattern {
34 #[serde(flatten)]
35 pub base: BaseNode,
36 #[serde(default)]
37 pub properties: Vec<ObjectPatternProp>,
38 #[serde(default, skip_serializing_if = "crate::flavor::Flavor::skip_empty")]
39 pub decorators: Option<Vec<Decorator>>,
40 #[serde(default, skip_serializing_if = "crate::flavor::Flavor::skip_none")]
41 pub type_annotation: Option<Box<TypeAnnotOrNoop>>,
42}
43
44#[derive(Debug, Clone, PartialEq)]
45#[ast_serde]
46pub enum AssignmentPatternLeft {
47 #[tag("Identifier")]
48 Id(Identifier),
49 #[tag("ObjectPattern")]
50 Object(ObjectPattern),
51 #[tag("ArrayPattern")]
52 Array(ArrayPattern),
53 #[tag("MemberExpression")]
54 Member(MemberExpression),
55}
56
57#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
58#[serde(tag = "type", rename_all = "camelCase")]
59pub struct AssignmentPattern {
60 #[serde(flatten)]
61 pub base: BaseNode,
62 pub left: AssignmentPatternLeft,
63 pub right: Box<Expression>,
64 #[serde(default, skip_serializing_if = "crate::flavor::Flavor::skip_empty")]
65 pub decorators: Option<Vec<Decorator>>,
66 #[serde(default, skip_serializing_if = "crate::flavor::Flavor::skip_none")]
67 pub type_annotation: Option<Box<TypeAnnotOrNoop>>,
68}
69
70#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
71#[serde(tag = "type", rename_all = "camelCase")]
72pub struct ArrayPattern {
73 #[serde(flatten)]
74 pub base: BaseNode,
75 #[serde(default)]
76 pub elements: Vec<Option<PatternLike>>,
77 #[serde(default, skip_serializing_if = "crate::flavor::Flavor::skip_empty")]
78 pub decorators: Option<Vec<Decorator>>,
79 #[serde(default, skip_serializing_if = "crate::flavor::Flavor::skip_none")]
80 pub type_annotation: Option<Box<TypeAnnotOrNoop>>,
81}