Skip to main content

react_compiler_ast/
jsx.rs

1use serde::{Deserialize, Serialize};
2
3use crate::common::BaseNode;
4use crate::common::RawNode;
5use crate::expressions::Expression;
6use crate::literals::StringLiteral;
7
8#[derive(Debug, Clone, Serialize, Deserialize)]
9pub struct JSXElement {
10    #[serde(flatten)]
11    pub base: BaseNode,
12    #[serde(rename = "openingElement")]
13    pub opening_element: JSXOpeningElement,
14    #[serde(rename = "closingElement")]
15    pub closing_element: Option<JSXClosingElement>,
16    pub children: Vec<JSXChild>,
17    #[serde(rename = "selfClosing", default, skip_serializing_if = "Option::is_none")]
18    pub self_closing: Option<bool>,
19}
20
21#[derive(Debug, Clone, Serialize, Deserialize)]
22pub struct JSXFragment {
23    #[serde(flatten)]
24    pub base: BaseNode,
25    #[serde(rename = "openingFragment")]
26    pub opening_fragment: JSXOpeningFragment,
27    #[serde(rename = "closingFragment")]
28    pub closing_fragment: JSXClosingFragment,
29    pub children: Vec<JSXChild>,
30}
31
32#[derive(Debug, Clone, Serialize, Deserialize)]
33pub struct JSXOpeningElement {
34    #[serde(flatten)]
35    pub base: BaseNode,
36    pub name: JSXElementName,
37    pub attributes: Vec<JSXAttributeItem>,
38    #[serde(rename = "selfClosing")]
39    pub self_closing: bool,
40    #[serde(
41        default,
42        skip_serializing_if = "Option::is_none",
43        rename = "typeParameters"
44    )]
45    pub type_parameters: Option<RawNode>,
46}
47
48#[derive(Debug, Clone, Serialize, Deserialize)]
49pub struct JSXClosingElement {
50    #[serde(flatten)]
51    pub base: BaseNode,
52    pub name: JSXElementName,
53}
54
55#[derive(Debug, Clone, Serialize, Deserialize)]
56pub struct JSXOpeningFragment {
57    #[serde(flatten)]
58    pub base: BaseNode,
59}
60
61#[derive(Debug, Clone, Serialize, Deserialize)]
62pub struct JSXClosingFragment {
63    #[serde(flatten)]
64    pub base: BaseNode,
65}
66
67#[derive(Debug, Clone, Serialize, Deserialize)]
68#[serde(tag = "type")]
69pub enum JSXElementName {
70    JSXIdentifier(JSXIdentifier),
71    JSXMemberExpression(JSXMemberExpression),
72    JSXNamespacedName(JSXNamespacedName),
73}
74
75#[derive(Debug, Clone, Serialize, Deserialize)]
76#[serde(tag = "type")]
77pub enum JSXChild {
78    JSXElement(Box<JSXElement>),
79    JSXFragment(JSXFragment),
80    JSXExpressionContainer(JSXExpressionContainer),
81    JSXSpreadChild(JSXSpreadChild),
82    JSXText(JSXText),
83}
84
85#[derive(Debug, Clone, Serialize, Deserialize)]
86#[serde(tag = "type")]
87pub enum JSXAttributeItem {
88    JSXAttribute(JSXAttribute),
89    JSXSpreadAttribute(JSXSpreadAttribute),
90}
91
92#[derive(Debug, Clone, Serialize, Deserialize)]
93pub struct JSXAttribute {
94    #[serde(flatten)]
95    pub base: BaseNode,
96    pub name: JSXAttributeName,
97    pub value: Option<JSXAttributeValue>,
98}
99
100#[derive(Debug, Clone, Serialize, Deserialize)]
101#[serde(tag = "type")]
102pub enum JSXAttributeName {
103    JSXIdentifier(JSXIdentifier),
104    JSXNamespacedName(JSXNamespacedName),
105}
106
107#[derive(Debug, Clone, Serialize, Deserialize)]
108#[serde(tag = "type")]
109pub enum JSXAttributeValue {
110    StringLiteral(StringLiteral),
111    JSXExpressionContainer(JSXExpressionContainer),
112    JSXElement(Box<JSXElement>),
113    JSXFragment(JSXFragment),
114}
115
116#[derive(Debug, Clone, Serialize, Deserialize)]
117pub struct JSXSpreadAttribute {
118    #[serde(flatten)]
119    pub base: BaseNode,
120    pub argument: Box<Expression>,
121}
122
123#[derive(Debug, Clone, Serialize, Deserialize)]
124pub struct JSXExpressionContainer {
125    #[serde(flatten)]
126    pub base: BaseNode,
127    pub expression: JSXExpressionContainerExpr,
128}
129
130#[derive(Debug, Clone, Serialize, Deserialize)]
131#[serde(tag = "type")]
132pub enum JSXExpressionContainerExpr {
133    JSXEmptyExpression(JSXEmptyExpression),
134    #[serde(untagged)]
135    Expression(Box<Expression>),
136}
137
138#[derive(Debug, Clone, Serialize, Deserialize)]
139pub struct JSXSpreadChild {
140    #[serde(flatten)]
141    pub base: BaseNode,
142    pub expression: Box<Expression>,
143}
144
145#[derive(Debug, Clone, Serialize, Deserialize)]
146pub struct JSXText {
147    #[serde(flatten)]
148    pub base: BaseNode,
149    pub value: String,
150}
151
152#[derive(Debug, Clone, Serialize, Deserialize)]
153pub struct JSXEmptyExpression {
154    #[serde(flatten)]
155    pub base: BaseNode,
156}
157
158#[derive(Debug, Clone, Serialize, Deserialize)]
159pub struct JSXIdentifier {
160    #[serde(flatten)]
161    pub base: BaseNode,
162    pub name: String,
163}
164
165#[derive(Debug, Clone, Serialize, Deserialize)]
166pub struct JSXMemberExpression {
167    #[serde(flatten)]
168    pub base: BaseNode,
169    pub object: Box<JSXMemberExprObject>,
170    pub property: JSXIdentifier,
171}
172
173#[derive(Debug, Clone, Serialize, Deserialize)]
174#[serde(tag = "type")]
175pub enum JSXMemberExprObject {
176    JSXIdentifier(JSXIdentifier),
177    JSXMemberExpression(Box<JSXMemberExpression>),
178}
179
180#[derive(Debug, Clone, Serialize, Deserialize)]
181pub struct JSXNamespacedName {
182    #[serde(flatten)]
183    pub base: BaseNode,
184    pub namespace: JSXIdentifier,
185    pub name: JSXIdentifier,
186}