#[cfg(feature = "serde")]
use serde::Serialize;
use crate::Span;
use super::{ArenaVec, Expr, Name, Stmt};
#[derive(Debug, Clone, Copy)]
#[cfg_attr(feature = "serde", derive(Serialize))]
pub struct Comment<'src> {
pub kind: CommentKind,
pub text: &'src str,
pub span: Span,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(Serialize))]
#[non_exhaustive]
pub enum CommentKind {
Line,
Hash,
Block,
Doc,
}
#[derive(Debug)]
#[cfg_attr(feature = "serde", derive(Serialize))]
pub struct Program<'arena, 'src> {
pub stmts: ArenaVec<'arena, Stmt<'arena, 'src>>,
pub span: Span,
}
#[derive(Debug)]
#[cfg_attr(feature = "serde", derive(Serialize))]
#[non_exhaustive]
pub struct Arg<'arena, 'src> {
pub name: Option<Name<'arena, 'src>>,
pub kind: ArgKind<'arena, 'src>,
pub span: Span,
}
impl<'arena, 'src> Arg<'arena, 'src> {
pub fn new(name: Option<Name<'arena, 'src>>, kind: ArgKind<'arena, 'src>, span: Span) -> Self {
Self { name, kind, span }
}
}
#[derive(Debug)]
#[cfg_attr(feature = "serde", derive(Serialize))]
#[non_exhaustive]
pub enum ArgKind<'arena, 'src> {
Value(Expr<'arena, 'src>),
Spread(Expr<'arena, 'src>),
ByRef(Expr<'arena, 'src>),
Placeholder,
SpreadPlaceholder,
}
impl<'arena, 'src> Arg<'arena, 'src> {
pub fn value(&self) -> Option<&Expr<'arena, 'src>> {
match &self.kind {
ArgKind::Value(e) | ArgKind::Spread(e) | ArgKind::ByRef(e) => Some(e),
ArgKind::Placeholder | ArgKind::SpreadPlaceholder => None,
}
}
pub fn value_mut(&mut self) -> Option<&mut Expr<'arena, 'src>> {
match &mut self.kind {
ArgKind::Value(e) | ArgKind::Spread(e) | ArgKind::ByRef(e) => Some(e),
ArgKind::Placeholder | ArgKind::SpreadPlaceholder => None,
}
}
pub fn is_spread(&self) -> bool {
matches!(self.kind, ArgKind::Spread(_))
}
pub fn is_placeholder(&self) -> bool {
matches!(self.kind, ArgKind::Placeholder | ArgKind::SpreadPlaceholder)
}
}
#[derive(Debug)]
#[cfg_attr(feature = "serde", derive(Serialize))]
#[non_exhaustive]
pub struct Attribute<'arena, 'src> {
pub name: Name<'arena, 'src>,
pub args: ArenaVec<'arena, Arg<'arena, 'src>>,
pub span: Span,
}
impl<'arena, 'src> Attribute<'arena, 'src> {
pub fn new(arena: &'arena bumpalo::Bump, name: Name<'arena, 'src>, span: Span) -> Self {
Self {
name,
args: ArenaVec::new_in(arena),
span,
}
}
}