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