oak_typescript/ast/
jsx_nodes.rs1use crate::ast::Expression;
2use core::range::Range;
3
4#[derive(Debug, Clone)]
6#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
7pub struct JsxElement {
8 pub opening_element: JsxOpeningElement,
10 pub children: Vec<JsxChild>,
12 pub closing_element: JsxClosingElement,
14 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
16 pub span: Range<usize>,
17}
18
19#[derive(Debug, Clone)]
21#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
22pub struct JsxOpeningElement {
23 pub name: JsxTagName,
25 pub attributes: Vec<JsxAttributeOrSpread>,
27 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
29 pub span: Range<usize>,
30}
31
32#[derive(Debug, Clone)]
34#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
35pub struct JsxClosingElement {
36 pub name: JsxTagName,
38 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
40 pub span: Range<usize>,
41}
42
43#[derive(Debug, Clone)]
45#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
46pub struct JsxSelfClosingElement {
47 pub name: JsxTagName,
49 pub attributes: Vec<JsxAttributeOrSpread>,
51 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
53 pub span: Range<usize>,
54}
55
56#[derive(Debug, Clone)]
58#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
59pub struct JsxFragment {
60 pub opening_fragment: JsxOpeningFragment,
62 pub children: Vec<JsxChild>,
64 pub closing_fragment: JsxClosingFragment,
66 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
68 pub span: Range<usize>,
69}
70
71#[derive(Debug, Clone)]
73#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
74pub struct JsxOpeningFragment {
75 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
77 pub span: Range<usize>,
78}
79
80#[derive(Debug, Clone)]
82#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
83pub struct JsxClosingFragment {
84 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
86 pub span: Range<usize>,
87}
88
89#[derive(Debug, Clone)]
91#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
92pub enum JsxChild {
93 JsxElement(Box<JsxElement>),
95 JsxFragment(Box<JsxFragment>),
97 JsxSelfClosingElement(Box<JsxSelfClosingElement>),
99 JsxText(String),
101 JsxExpressionContainer(Option<Expression>),
103}
104
105#[derive(Debug, Clone)]
107#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
108pub enum JsxTagName {
109 Identifier(String),
111 MemberExpression {
113 object: Box<JsxTagName>,
115 property: String,
117 },
118}
119
120#[derive(Debug, Clone)]
122#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
123pub enum JsxAttributeOrSpread {
124 Attribute(JsxAttribute),
126 Spread(Expression),
128}
129
130#[derive(Debug, Clone)]
132#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
133pub struct JsxAttribute {
134 pub name: String,
136 pub value: Option<JsxAttributeValue>,
138 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
140 pub span: Range<usize>,
141}
142
143#[derive(Debug, Clone)]
145#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
146pub enum JsxAttributeValue {
147 StringLiteral(String),
149 ExpressionContainer(Option<Expression>),
151 Element(Box<JsxElement>),
153 Fragment(Box<JsxFragment>),
155}