use std::fmt::Display;
use getset::Getters;
use crate::base::{
log::{Message, Severity, SourceCodeDisplay},
source_file::Span,
};
use super::{token, token_stream::Delimiter};
#[allow(missing_docs)]
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, thiserror::Error)]
pub enum Error {
#[error(transparent)]
UnterminatedDelimitedComment(#[from] UnterminatedDelimitedComment),
#[error(transparent)]
UndelimitedDelimiter(#[from] UndelimitedDelimiter),
#[error("Tokenize error: {0}")]
TokenizeError(#[from] token::TokenizeError),
}
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Getters, thiserror::Error)]
pub struct UnterminatedDelimitedComment {
pub span: Span,
}
impl Display for UnterminatedDelimitedComment {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(
f,
"{}\n{}",
Message::new(Severity::Error, "found an unclosed `/*` comment"),
SourceCodeDisplay::new(&self.span, Option::<i32>::None)
)
}
}
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Getters, thiserror::Error)]
pub struct UndelimitedDelimiter {
pub opening_span: Span,
pub delimiter: Delimiter,
}
impl Display for UndelimitedDelimiter {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(
f,
"{}\n{}",
Message::new(Severity::Error, "found an undelimited delimiter"),
SourceCodeDisplay::new(
&self.opening_span,
Some("this delimiter is not closed by its corresponding closing pair")
)
)
}
}