use tsv_lang::Span;
use super::{
ClassDeclaration, Expression, FunctionDeclaration, Identifier, Literal, Statement,
TSDeclareFunction, TSEntityName, TSInterfaceDeclaration,
};
#[derive(Debug, Clone)]
pub struct ExportNamedDeclaration<'arena> {
pub declaration: Option<&'arena Statement<'arena>>,
pub specifiers: &'arena [ExportSpecifier<'arena>],
pub source: Option<Literal<'arena>>,
pub attributes: Option<&'arena [ImportAttribute<'arena>]>,
pub export_kind: ExportKind,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum ExportKind {
#[default]
Value,
Type,
}
#[derive(Debug, Clone)]
pub struct ExportDefaultDeclaration<'arena> {
pub declaration: ExportDefaultValue<'arena>,
}
#[derive(Debug, Clone)]
pub enum ExportFunctionDeclaration<'arena> {
Declaration(FunctionDeclaration<'arena>),
Declare(TSDeclareFunction<'arena>),
}
#[derive(Debug, Clone)]
pub enum ExportDefaultValue<'arena> {
Expression(Expression<'arena>),
FunctionDeclaration(FunctionDeclaration<'arena>),
TSDeclareFunction(TSDeclareFunction<'arena>),
ClassDeclaration(ClassDeclaration<'arena>),
TSInterfaceDeclaration(TSInterfaceDeclaration<'arena>),
}
impl ExportDefaultValue<'_> {
pub fn span(&self) -> Span {
match self {
ExportDefaultValue::Expression(expr) => expr.span(),
ExportDefaultValue::FunctionDeclaration(func) => func.span,
ExportDefaultValue::TSDeclareFunction(func) => func.span,
ExportDefaultValue::ClassDeclaration(class) => class.span,
ExportDefaultValue::TSInterfaceDeclaration(iface) => iface.span,
}
}
}
#[derive(Debug, Clone)]
pub struct ExportAllDeclaration<'arena> {
pub exported: Option<ModuleExportName<'arena>>,
pub source: Literal<'arena>,
pub attributes: Option<&'arena [ImportAttribute<'arena>]>,
pub export_kind: ExportKind,
}
#[derive(Debug, Clone)]
pub struct TSExportAssignment<'arena> {
pub expression: Expression<'arena>,
}
#[derive(Debug, Clone)]
pub struct TSNamespaceExportDeclaration<'arena> {
pub id: Identifier<'arena>,
}
#[derive(Debug, Clone)]
pub struct ExportSpecifier<'arena> {
pub local: ModuleExportName<'arena>,
pub exported: ModuleExportName<'arena>,
pub export_kind: ExportKind,
pub span: Span,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum ImportKind {
#[default]
Value,
Type,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum ImportPhase {
#[default]
None,
Source,
Defer,
}
impl ImportPhase {
pub fn as_str(self) -> Option<&'static str> {
match self {
ImportPhase::None => None,
ImportPhase::Source => Some("source"),
ImportPhase::Defer => Some("defer"),
}
}
}
#[derive(Debug, Clone)]
pub struct ImportDeclaration<'arena> {
pub specifiers: &'arena [ImportSpecifier<'arena>],
pub source: Literal<'arena>,
pub attributes: Option<&'arena [ImportAttribute<'arena>]>,
pub import_kind: ImportKind,
pub phase: ImportPhase,
}
#[derive(Debug, Clone)]
pub enum ImportSpecifier<'arena> {
Default(ImportDefaultSpecifier<'arena>),
Named(ImportNamedSpecifier<'arena>),
Namespace(ImportNamespaceSpecifier<'arena>),
}
#[derive(Debug, Clone)]
pub struct ImportDefaultSpecifier<'arena> {
pub local: Identifier<'arena>,
pub span: Span,
}
#[derive(Debug, Clone)]
pub struct ImportNamedSpecifier<'arena> {
pub imported: ModuleExportName<'arena>,
pub local: Identifier<'arena>,
pub import_kind: ImportKind,
pub span: Span,
}
#[derive(Debug, Clone)]
pub struct ImportNamespaceSpecifier<'arena> {
pub local: Identifier<'arena>,
pub span: Span,
}
#[derive(Debug, Clone)]
pub struct ImportAttribute<'arena> {
pub key: ImportAttributeKey<'arena>,
pub value: Literal<'arena>,
pub span: Span,
}
#[derive(Debug, Clone)]
pub enum ImportAttributeKey<'arena> {
Identifier(Identifier<'arena>),
Literal(Literal<'arena>),
}
impl<'arena> ImportAttributeKey<'arena> {
pub fn span(&self) -> Span {
match self {
ImportAttributeKey::Identifier(id) => id.span,
ImportAttributeKey::Literal(lit) => lit.span,
}
}
}
#[derive(Debug, Clone)]
pub enum ModuleExportName<'arena> {
Identifier(Identifier<'arena>),
Literal(Literal<'arena>),
}
impl<'arena> ModuleExportName<'arena> {
pub fn span(&self) -> Span {
match self {
ModuleExportName::Identifier(id) => id.span,
ModuleExportName::Literal(lit) => lit.span,
}
}
}
#[derive(Debug, Clone)]
pub struct TSImportEqualsDeclaration<'arena> {
pub id: Identifier<'arena>,
pub module_reference: TSModuleReference<'arena>,
pub import_kind: ImportKind,
pub is_export: bool,
}
#[derive(Debug, Clone)]
pub enum TSModuleReference<'arena> {
ExternalModuleReference(TSExternalModuleReference<'arena>),
EntityName(TSEntityName<'arena>),
}
#[derive(Debug, Clone)]
pub struct TSExternalModuleReference<'arena> {
pub expression: Literal<'arena>,
pub span: Span,
}