use tsv_lang::Span;
use super::{
Decorator, Expression, FunctionExpression, Identifier, Statement, TSIndexSignature,
TSInterfaceHeritage, TSTypeAnnotation, TSTypeParameterDeclaration,
TSTypeParameterInstantiation,
};
#[derive(Debug, Clone)]
pub struct ClassDeclaration<'arena> {
pub decorators: Option<&'arena [Decorator<'arena>]>,
pub id: Option<Identifier<'arena>>,
pub super_class: Option<&'arena Expression<'arena>>,
pub super_type_parameters: Option<TSTypeParameterInstantiation<'arena>>,
pub implements: &'arena [TSInterfaceHeritage<'arena>],
pub body: ClassBody<'arena>,
pub declare: bool,
pub r#abstract: bool,
pub type_parameters: Option<TSTypeParameterDeclaration<'arena>>,
pub span: Span,
}
#[derive(Debug, Clone)]
pub struct ClassExpression<'arena> {
pub decorators: Option<&'arena [Decorator<'arena>]>,
pub id: Option<Identifier<'arena>>,
pub super_class: Option<&'arena Expression<'arena>>,
pub super_type_parameters: Option<TSTypeParameterInstantiation<'arena>>,
pub implements: &'arena [TSInterfaceHeritage<'arena>],
pub body: ClassBody<'arena>,
pub r#abstract: bool,
pub type_parameters: Option<TSTypeParameterDeclaration<'arena>>,
}
#[derive(Debug, Clone)]
pub struct ClassBody<'arena> {
pub body: &'arena [ClassMember<'arena>],
pub span: Span,
}
#[derive(Debug, Clone)]
pub enum ClassMember<'arena> {
MethodDefinition(MethodDefinition<'arena>),
PropertyDefinition(PropertyDefinition<'arena>),
StaticBlock(StaticBlock<'arena>),
IndexSignature(TSIndexSignature<'arena>),
}
impl<'arena> ClassMember<'arena> {
pub fn span(&self) -> Span {
match self {
ClassMember::MethodDefinition(m) => m.span,
ClassMember::PropertyDefinition(p) => p.span,
ClassMember::StaticBlock(s) => s.span,
ClassMember::IndexSignature(i) => i.span,
}
}
}
#[derive(Debug, Clone)]
pub struct StaticBlock<'arena> {
pub decorators: Option<&'arena [Decorator<'arena>]>,
pub body: &'arena [Statement<'arena>],
pub span: Span,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[repr(u8)]
pub enum MethodKind {
Constructor = 0,
Method = 1,
Get = 2,
Set = 3,
}
impl MethodKind {
#[inline]
pub const fn as_str(self) -> &'static str {
match self {
MethodKind::Constructor => "constructor",
MethodKind::Method => "method",
MethodKind::Get => "get",
MethodKind::Set => "set",
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Accessibility {
Public,
Private,
Protected,
}
impl Accessibility {
pub const fn as_str(self) -> &'static str {
match self {
Accessibility::Public => "public",
Accessibility::Private => "private",
Accessibility::Protected => "protected",
}
}
pub const fn as_keyword(self) -> &'static str {
match self {
Accessibility::Public => "public ",
Accessibility::Private => "private ",
Accessibility::Protected => "protected ",
}
}
}
#[derive(Debug, Clone)]
pub struct TSParameterProperty<'arena> {
pub accessibility: Option<Accessibility>,
pub readonly: bool,
pub r#override: bool,
pub parameter: &'arena Expression<'arena>,
}
#[derive(Debug, Clone)]
#[expect(clippy::struct_excessive_bools)] pub struct MethodDefinition<'arena> {
pub decorators: Option<&'arena [Decorator<'arena>]>,
pub key: Expression<'arena>,
pub value: FunctionExpression<'arena>,
pub kind: MethodKind,
pub accessibility: Option<Accessibility>,
pub is_static: bool,
pub r#override: bool,
pub r#abstract: bool,
pub computed: bool,
pub optional: bool,
pub span: Span,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum PropertyModifier {
#[default]
None,
Optional,
Definite,
}
#[expect(clippy::struct_excessive_bools)]
#[derive(Debug, Clone)]
pub struct PropertyDefinition<'arena> {
pub decorators: Option<&'arena [Decorator<'arena>]>,
pub key: Expression<'arena>,
pub type_annotation: Option<TSTypeAnnotation<'arena>>,
pub value: Option<Expression<'arena>>,
pub accessibility: Option<Accessibility>,
pub is_static: bool,
pub declare: bool,
pub r#abstract: bool,
pub r#override: bool,
pub readonly: bool,
pub computed: bool,
pub accessor: bool,
pub modifier: PropertyModifier,
pub span: Span,
}