Skip to main content

react_compiler_ast/
jsx.rs

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