Skip to main content

react_compiler_ast/
jsx.rs

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