swc_estree_ast/
pat.rs

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}