Skip to main content

oak_typescript/ast/
jsx_node.rs

1use 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}