swc_estree_ast/
jsx.rs

1use swc_atoms::Atom;
2use swc_common::ast_serde;
3
4use crate::{
5    common::{BaseNode, Identifier, SuperTypeParams},
6    expr::Expression,
7    lit::StringLiteral,
8};
9
10#[derive(Debug, Clone, PartialEq)]
11#[ast_serde]
12pub enum JSX {
13    #[tag("JSXAttribute")]
14    Attr(JSXAttribute),
15    #[tag("JSXClosingElement")]
16    ClosingEl(JSXClosingElement),
17    #[tag("JSXElement")]
18    El(JSXElement),
19    #[tag("JSXEmptyExpression")]
20    EmptyExpr(JSXEmptyExpression),
21    #[tag("JSXExpressionContainer")]
22    ExprContainer(JSXExpressionContainer),
23    #[tag("JSXSpreadChild")]
24    SpreadChild(JSXSpreadChild),
25    #[tag("JSXIdentifier")]
26    Id(JSXIdentifier),
27    #[tag("JSXMemberExpression")]
28    MemberExpr(JSXMemberExpression),
29    #[tag("JSXNamespacedName")]
30    NamespacedName(JSXNamespacedName),
31    #[tag("JSXOpeningElement")]
32    OpeningEl(JSXOpeningElement),
33    #[tag("JSXSpreadAttribute")]
34    SpreadAttr(JSXSpreadAttribute),
35    #[tag("JSXText")]
36    Text(JSXText),
37    #[tag("JSXFragment")]
38    Fragment(JSXFragment),
39    #[tag("JSXOpeningFragment")]
40    OpeningFragment(JSXOpeningFragment),
41    #[tag("JSXClosingFragment")]
42    ClosingFragment(JSXClosingFragment),
43}
44
45#[derive(Debug, Clone, PartialEq, Eq)]
46#[ast_serde]
47pub enum JSXAttrName {
48    #[tag("JSXIdentifier")]
49    Id(JSXIdentifier),
50    #[tag("JSXNamespacedName")]
51    Name(JSXNamespacedName),
52}
53
54#[derive(Debug, Clone, PartialEq)]
55#[ast_serde]
56pub enum JSXAttrVal {
57    #[tag("JSXElement")]
58    Element(JSXElement),
59    #[tag("JSXFragment")]
60    Fragment(JSXFragment),
61    #[tag("StringLiteral")]
62    String(StringLiteral),
63    #[tag("JSXExpressionContainer")]
64    Expr(JSXExpressionContainer),
65}
66
67#[derive(Debug, Clone, PartialEq)]
68#[ast_serde("JSXAttribute")]
69pub struct JSXAttribute {
70    #[serde(flatten)]
71    pub base: BaseNode,
72    pub name: JSXAttrName,
73    #[serde(default)]
74    pub value: Option<JSXAttrVal>,
75}
76
77#[derive(Debug, Clone, PartialEq)]
78#[ast_serde("JSXClosingElement")]
79pub struct JSXClosingElement {
80    #[serde(flatten)]
81    pub base: BaseNode,
82    pub name: JSXElementName,
83}
84
85#[derive(Debug, Clone, PartialEq)]
86#[ast_serde("JSXElement")]
87pub struct JSXElement {
88    #[serde(flatten)]
89    pub base: BaseNode,
90    pub opening_element: JSXOpeningElement,
91    #[serde(default)]
92    pub closing_element: Option<JSXClosingElement>,
93    #[serde(default)]
94    pub children: Vec<JSXElementChild>,
95    #[serde(default)]
96    pub self_closing: Option<bool>,
97}
98
99#[derive(Debug, Clone, PartialEq, Eq)]
100#[ast_serde("JSXEmptyExpression")]
101pub struct JSXEmptyExpression {
102    #[serde(flatten)]
103    pub base: BaseNode,
104}
105
106#[derive(Debug, Clone, PartialEq)]
107#[ast_serde]
108pub enum JSXExprContainerExpr {
109    #[tag("JSXEmptyExpression")]
110    Empty(JSXEmptyExpression),
111    #[tag("*")]
112    Expr(Box<Expression>),
113}
114
115#[derive(Debug, Clone, PartialEq)]
116#[ast_serde("JSXExpressionContainer")]
117pub struct JSXExpressionContainer {
118    #[serde(flatten)]
119    pub base: BaseNode,
120    pub expression: JSXExprContainerExpr,
121}
122
123#[derive(Debug, Clone, PartialEq)]
124#[ast_serde("JSXSpreadChild")]
125pub struct JSXSpreadChild {
126    #[serde(flatten)]
127    pub base: BaseNode,
128    pub expression: Box<Expression>,
129}
130
131#[derive(Debug, Clone, PartialEq, Eq)]
132#[ast_serde("JSXIdentifier")]
133pub struct JSXIdentifier {
134    #[serde(flatten)]
135    pub base: BaseNode,
136    #[serde(default)]
137    pub name: Atom,
138}
139
140impl From<Identifier> for JSXIdentifier {
141    fn from(id: Identifier) -> Self {
142        JSXIdentifier {
143            base: id.base,
144            name: id.name,
145        }
146    }
147}
148
149#[derive(Debug, Clone, PartialEq)]
150#[ast_serde]
151pub enum JSXMemberExprObject {
152    #[tag("JSXMemberExpression")]
153    Expr(JSXMemberExpression),
154    #[tag("JSXIdentifier")]
155    Id(JSXIdentifier),
156}
157
158#[derive(Debug, Clone, PartialEq)]
159#[ast_serde("JSXMemberExpression")]
160pub struct JSXMemberExpression {
161    #[serde(flatten)]
162    pub base: BaseNode,
163    pub object: Box<JSXMemberExprObject>,
164    pub property: JSXIdentifier,
165}
166
167#[derive(Debug, Clone, PartialEq, Eq)]
168#[ast_serde("JSXNamespacedName")]
169pub struct JSXNamespacedName {
170    #[serde(flatten)]
171    pub base: BaseNode,
172    pub namespace: JSXIdentifier,
173    pub name: JSXIdentifier,
174}
175
176#[derive(Debug, Clone, PartialEq)]
177#[ast_serde]
178pub enum JSXOpeningElAttr {
179    #[tag("JSXAttribute")]
180    Attr(JSXAttribute),
181    #[tag("JSXSpreadAttribute")]
182    Spread(JSXSpreadAttribute),
183}
184
185#[derive(Debug, Clone, PartialEq)]
186#[ast_serde("JSXOpeningElement")]
187pub struct JSXOpeningElement {
188    #[serde(flatten)]
189    pub base: BaseNode,
190    pub name: JSXElementName,
191    #[serde(default)]
192    pub attributes: Vec<JSXOpeningElAttr>,
193    #[serde(default)]
194    pub self_closing: bool,
195    #[serde(default)]
196    pub type_parameters: Option<SuperTypeParams>,
197}
198
199#[derive(Debug, Clone, PartialEq)]
200#[ast_serde("JSXSpreadAttribute")]
201pub struct JSXSpreadAttribute {
202    #[serde(flatten)]
203    pub base: BaseNode,
204    pub argument: Box<Expression>,
205}
206
207// impl From<SpreadElement> for JSXSpreadAttribute {
208//     fn from(spread: SpreadElement) -> Self {
209//         JSXSpreadAttribute {
210//             // base: spread.base.clone(),
211//             base: spread.base,
212//             argument: spread.argument,
213//         }
214//     }
215// }
216
217#[derive(Debug, Clone, PartialEq, Eq)]
218#[ast_serde("JSXText")]
219pub struct JSXText {
220    #[serde(flatten)]
221    pub base: BaseNode,
222    pub value: Atom,
223}
224
225#[derive(Debug, Clone, PartialEq)]
226#[ast_serde("JSXFragment")]
227pub struct JSXFragment {
228    #[serde(flatten)]
229    pub base: BaseNode,
230    pub opening_fragment: JSXOpeningFragment,
231    pub closing_fragment: JSXClosingFragment,
232    #[serde(default)]
233    pub children: Vec<JSXElementChild>,
234}
235
236#[derive(Debug, Clone, PartialEq, Eq)]
237#[ast_serde("JSXOpeningFragment")]
238pub struct JSXOpeningFragment {
239    #[serde(flatten)]
240    pub base: BaseNode,
241}
242
243#[derive(Debug, Clone, PartialEq, Eq)]
244#[ast_serde("JSXClosingElement")]
245pub struct JSXClosingFragment {
246    #[serde(flatten)]
247    pub base: BaseNode,
248}
249
250#[derive(Debug, Clone, PartialEq)]
251#[ast_serde]
252pub enum JSXElementName {
253    #[tag("JSXIdentifier")]
254    Id(JSXIdentifier),
255    #[tag("JSXMemberExpression")]
256    Expr(JSXMemberExpression),
257    #[tag("JSXNamespacedName")]
258    Name(JSXNamespacedName),
259}
260
261#[derive(Debug, Clone, PartialEq)]
262#[ast_serde]
263pub enum JSXElementChild {
264    #[tag("JSXText")]
265    Text(JSXText),
266    #[tag("JSXExpressionContainer")]
267    Expr(JSXExpressionContainer),
268    #[tag("JSXSpreadChild")]
269    Spread(JSXSpreadChild),
270    #[tag("JSXElement")]
271    Element(JSXElement),
272    #[tag("JSXFragment")]
273    Fragment(JSXFragment),
274}