oak_typescript/ast/
jsx_nodes.rs1use crate::ast::Expression;
2use core::range::Range;
3#[cfg(feature = "serde")]
4use serde::{Deserialize, Serialize};
5
6#[derive(Debug, Clone)]
8#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
9pub struct JsxElement {
10 pub opening_element: JsxOpeningElement,
12 pub children: Vec<JsxChild>,
14 pub closing_element: JsxClosingElement,
16 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
18 pub span: Range<usize>,
19}
20
21#[derive(Debug, Clone)]
23#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
24pub struct JsxOpeningElement {
25 pub name: JsxTagName,
27 pub attributes: Vec<JsxAttributeOrSpread>,
29 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
31 pub span: Range<usize>,
32}
33
34#[derive(Debug, Clone)]
36#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
37pub struct JsxClosingElement {
38 pub name: JsxTagName,
40 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
42 pub span: Range<usize>,
43}
44
45#[derive(Debug, Clone)]
47#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
48pub struct JsxSelfClosingElement {
49 pub name: JsxTagName,
51 pub attributes: Vec<JsxAttributeOrSpread>,
53 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
55 pub span: Range<usize>,
56}
57
58#[derive(Debug, Clone)]
60#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
61pub struct JsxFragment {
62 pub opening_fragment: JsxOpeningFragment,
64 pub children: Vec<JsxChild>,
66 pub closing_fragment: JsxClosingFragment,
68 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
70 pub span: Range<usize>,
71}
72
73#[derive(Debug, Clone)]
75#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
76pub struct JsxOpeningFragment {
77 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
79 pub span: Range<usize>,
80}
81
82#[derive(Debug, Clone)]
84#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
85pub struct JsxClosingFragment {
86 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
88 pub span: Range<usize>,
89}
90
91#[derive(Debug, Clone)]
93#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
94pub enum JsxChild {
95 JsxElement(Box<JsxElement>),
97 JsxFragment(Box<JsxFragment>),
99 JsxSelfClosingElement(Box<JsxSelfClosingElement>),
101 JsxText(String),
103 JsxExpressionContainer(Option<Expression>),
105}
106
107#[derive(Debug, Clone)]
109#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
110pub enum JsxTagName {
111 Identifier(String),
113 MemberExpression {
115 object: Box<JsxTagName>,
117 property: String,
119 },
120}
121
122#[derive(Debug, Clone)]
124#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
125pub enum JsxAttributeOrSpread {
126 Attribute(JsxAttribute),
128 Spread(Expression),
130}
131
132#[derive(Debug, Clone)]
134#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
135pub struct JsxAttribute {
136 pub name: String,
138 pub value: Option<JsxAttributeValue>,
140 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
142 pub span: Range<usize>,
143}
144
145#[derive(Debug, Clone)]
147#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
148pub enum JsxAttributeValue {
149 StringLiteral(String),
151 ExpressionContainer(Option<Expression>),
153 Element(Box<JsxElement>),
155 Fragment(Box<JsxFragment>),
157}