use oxc_allocator::{Box, Vec};
use oxc_span::{Atom, Span};
#[cfg(feature = "serde")]
use serde::Serialize;
#[allow(clippy::wildcard_imports)]
use crate::ast::*;
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serde", derive(Serialize), serde(tag = "type", rename_all = "camelCase"))]
pub struct JSXElement<'a> {
#[cfg_attr(feature = "serde", serde(flatten))]
pub span: Span,
pub opening_element: Box<'a, JSXOpeningElement<'a>>,
pub closing_element: Option<Box<'a, JSXClosingElement<'a>>>,
pub children: Vec<'a, JSXChild<'a>>,
}
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serde", derive(Serialize), serde(tag = "type", rename_all = "camelCase"))]
pub struct JSXOpeningElement<'a> {
#[cfg_attr(feature = "serde", serde(flatten))]
pub span: Span,
pub self_closing: bool,
pub name: JSXElementName<'a>,
pub attributes: Vec<'a, JSXAttributeItem<'a>>,
pub type_parameters: Option<Box<'a, TSTypeParameterInstantiation<'a>>>,
}
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serde", derive(Serialize), serde(tag = "type"))]
pub struct JSXClosingElement<'a> {
#[cfg_attr(feature = "serde", serde(flatten))]
pub span: Span,
pub name: JSXElementName<'a>,
}
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serde", derive(Serialize), serde(tag = "type", rename_all = "camelCase"))]
pub struct JSXFragment<'a> {
#[cfg_attr(feature = "serde", serde(flatten))]
pub span: Span,
pub opening_fragment: JSXOpeningFragment,
pub closing_fragment: JSXClosingFragment,
pub children: Vec<'a, JSXChild<'a>>,
}
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serde", derive(Serialize), serde(tag = "type"))]
pub struct JSXOpeningFragment {
#[cfg_attr(feature = "serde", serde(flatten))]
pub span: Span,
}
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serde", derive(Serialize), serde(tag = "type"))]
pub struct JSXClosingFragment {
#[cfg_attr(feature = "serde", serde(flatten))]
pub span: Span,
}
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serde", derive(Serialize), serde(untagged))]
pub enum JSXElementName<'a> {
Identifier(JSXIdentifier),
NamespacedName(Box<'a, JSXNamespacedName>),
MemberExpression(Box<'a, JSXMemberExpression<'a>>),
}
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serde", derive(Serialize), serde(tag = "type"))]
pub struct JSXNamespacedName {
#[cfg_attr(feature = "serde", serde(flatten))]
pub span: Span,
pub namespace: JSXIdentifier,
pub property: JSXIdentifier,
}
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serde", derive(Serialize), serde(tag = "type"))]
pub struct JSXMemberExpression<'a> {
#[cfg_attr(feature = "serde", serde(flatten))]
pub span: Span,
pub object: JSXMemberExpressionObject<'a>,
pub property: JSXIdentifier,
}
impl<'a> JSXMemberExpression<'a> {
pub fn get_object_identifier(&self) -> &JSXIdentifier {
match &self.object {
JSXMemberExpressionObject::Identifier(ident) => ident,
JSXMemberExpressionObject::MemberExpression(expr) => expr.get_object_identifier(),
}
}
}
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serde", derive(Serialize), serde(untagged))]
pub enum JSXMemberExpressionObject<'a> {
Identifier(JSXIdentifier),
MemberExpression(Box<'a, JSXMemberExpression<'a>>),
}
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serde", derive(Serialize), serde(tag = "type"))]
pub struct JSXExpressionContainer<'a> {
#[cfg_attr(feature = "serde", serde(flatten))]
pub span: Span,
pub expression: JSXExpression<'a>,
}
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serde", derive(Serialize), serde(untagged))]
pub enum JSXExpression<'a> {
Expression(Expression<'a>),
EmptyExpression(JSXEmptyExpression),
}
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serde", derive(Serialize), serde(tag = "type"))]
pub struct JSXEmptyExpression {
#[cfg_attr(feature = "serde", serde(flatten))]
pub span: Span,
}
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serde", derive(Serialize), serde(untagged))]
pub enum JSXAttributeItem<'a> {
Attribute(Box<'a, JSXAttribute<'a>>),
SpreadAttribute(Box<'a, JSXSpreadAttribute<'a>>),
}
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serde", derive(Serialize), serde(tag = "type"))]
pub struct JSXAttribute<'a> {
#[cfg_attr(feature = "serde", serde(flatten))]
pub span: Span,
pub name: JSXAttributeName<'a>,
pub value: Option<JSXAttributeValue<'a>>,
}
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serde", derive(Serialize), serde(tag = "type"))]
pub struct JSXSpreadAttribute<'a> {
#[cfg_attr(feature = "serde", serde(flatten))]
pub span: Span,
pub argument: Expression<'a>,
}
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serde", derive(Serialize), serde(untagged))]
pub enum JSXAttributeName<'a> {
Identifier(JSXIdentifier),
NamespacedName(Box<'a, JSXNamespacedName>),
}
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serde", derive(Serialize), serde(untagged))]
pub enum JSXAttributeValue<'a> {
StringLiteral(StringLiteral),
ExpressionContainer(JSXExpressionContainer<'a>),
Element(Box<'a, JSXElement<'a>>),
Fragment(Box<'a, JSXFragment<'a>>),
}
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serde", derive(Serialize), serde(tag = "type"))]
pub struct JSXIdentifier {
#[cfg_attr(feature = "serde", serde(flatten))]
pub span: Span,
pub name: Atom,
}
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serde", derive(Serialize), serde(untagged))]
pub enum JSXChild<'a> {
Text(JSXText),
Element(Box<'a, JSXElement<'a>>),
Fragment(Box<'a, JSXFragment<'a>>),
ExpressionContainer(JSXExpressionContainer<'a>),
Spread(JSXSpreadChild<'a>),
}
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serde", derive(Serialize), serde(tag = "type"))]
pub struct JSXSpreadChild<'a> {
#[cfg_attr(feature = "serde", serde(flatten))]
pub span: Span,
pub expression: Expression<'a>,
}
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serde", derive(Serialize), serde(tag = "type"))]
pub struct JSXText {
#[cfg_attr(feature = "serde", serde(flatten))]
pub span: Span,
pub value: Atom,
}