use serde::Deserialize;
use serde::Serialize;
use strum::Display;
use mago_interner::StringIdentifier;
use mago_span::HasSpan;
use mago_span::Span;
use crate::ast::Sequence;
#[derive(Debug, Copy, Clone, Eq, PartialEq, Hash, Serialize, Deserialize, PartialOrd, Ord, Display)]
#[serde(tag = "type", content = "value")]
pub enum TriviaKind {
WhiteSpace,
SingleLineComment,
MultiLineComment,
HashComment,
DocBlockComment,
}
#[derive(Debug, Copy, Clone, Eq, PartialEq, Hash, Serialize, Deserialize, PartialOrd, Ord)]
pub struct Trivia {
pub kind: TriviaKind,
pub span: Span,
pub value: StringIdentifier,
}
impl TriviaKind {
#[inline]
pub const fn is_comment(&self) -> bool {
matches!(
self,
TriviaKind::SingleLineComment
| TriviaKind::MultiLineComment
| TriviaKind::HashComment
| TriviaKind::DocBlockComment
)
}
#[inline]
pub const fn is_docblock(&self) -> bool {
matches!(self, TriviaKind::DocBlockComment)
}
#[inline]
pub const fn is_block_comment(&self) -> bool {
matches!(self, TriviaKind::MultiLineComment | TriviaKind::DocBlockComment)
}
#[inline]
pub const fn is_single_line_comment(&self) -> bool {
matches!(self, TriviaKind::HashComment | TriviaKind::SingleLineComment)
}
}
impl HasSpan for Trivia {
fn span(&self) -> Span {
self.span
}
}
impl Sequence<Trivia> {
pub fn comments(&self) -> impl Iterator<Item = &Trivia> {
self.iter().filter(|trivia| trivia.kind.is_comment())
}
}