oak_typescript/ast/
jsx_node.rs1use crate::ast::Expression;
2use core::range::Range;
3#[cfg(feature = "serde")]
4use serde::{Deserialize, Serialize};
5
6#[derive(Debug, Clone)]
7#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
8pub struct JsxElement {
9 pub opening_element: JsxOpeningElement,
10 pub children: Vec<JsxChild>,
11 pub closing_element: JsxClosingElement,
12 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
13 pub span: Range<usize>,
14}
15
16#[derive(Debug, Clone)]
17#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
18pub struct JsxOpeningElement {
19 pub name: JsxTagName,
20 pub attributes: Vec<JsxAttributeOrSpread>,
21 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
22 pub span: Range<usize>,
23}
24
25#[derive(Debug, Clone)]
26#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
27pub struct JsxClosingElement {
28 pub name: JsxTagName,
29 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
30 pub span: Range<usize>,
31}
32
33#[derive(Debug, Clone)]
34#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
35pub struct JsxSelfClosingElement {
36 pub name: JsxTagName,
37 pub attributes: Vec<JsxAttributeOrSpread>,
38 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
39 pub span: Range<usize>,
40}
41
42#[derive(Debug, Clone)]
43#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
44pub struct JsxFragment {
45 pub opening_fragment: JsxOpeningFragment,
46 pub children: Vec<JsxChild>,
47 pub closing_fragment: JsxClosingFragment,
48 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
49 pub span: Range<usize>,
50}
51
52#[derive(Debug, Clone)]
53#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
54pub struct JsxOpeningFragment {
55 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
56 pub span: Range<usize>,
57}
58
59#[derive(Debug, Clone)]
60#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
61pub struct JsxClosingFragment {
62 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
63 pub span: Range<usize>,
64}
65
66#[derive(Debug, Clone)]
67#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
68pub enum JsxChild {
69 JsxElement(Box<JsxElement>),
70 JsxFragment(Box<JsxFragment>),
71 JsxSelfClosingElement(Box<JsxSelfClosingElement>),
72 JsxText(String),
73 JsxExpressionContainer(Option<Expression>),
74}
75
76#[derive(Debug, Clone)]
77#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
78pub enum JsxTagName {
79 Identifier(String),
80 MemberExpression { object: Box<JsxTagName>, property: String },
81}
82
83#[derive(Debug, Clone)]
84#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
85pub enum JsxAttributeOrSpread {
86 Attribute(JsxAttribute),
87 Spread(Expression),
88}
89
90#[derive(Debug, Clone)]
91#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
92pub struct JsxAttribute {
93 pub name: String,
94 pub value: Option<JsxAttributeValue>,
95 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
96 pub span: Range<usize>,
97}
98
99#[derive(Debug, Clone)]
100#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
101pub enum JsxAttributeValue {
102 StringLiteral(String),
103 ExpressionContainer(Option<Expression>),
104 Element(Box<JsxElement>),
105 Fragment(Box<JsxFragment>),
106}