use oxc_allocator::Dummy;
use oxc_diagnostics::OxcDiagnostic;
use crate::{ParserImpl, diagnostics, lexer::Kind};
#[derive(Debug, Clone)]
pub struct FatalError {
pub error: OxcDiagnostic,
pub errors_len: usize,
}
impl<'a> ParserImpl<'a> {
#[cold]
pub(crate) fn set_unexpected(&mut self) {
if matches!(self.cur_kind(), Kind::Eof | Kind::Undetermined)
&& let Some(error) = self.lexer.errors.pop()
{
self.set_fatal_error(error);
return;
}
let error = diagnostics::unexpected_token(self.cur_token().span());
self.set_fatal_error(error);
}
#[must_use]
#[cold]
pub(crate) fn unexpected<T: Dummy<'a>>(&mut self) -> T {
self.set_unexpected();
Dummy::dummy(self.ast.allocator)
}
#[cold]
pub(crate) fn error(&mut self, error: OxcDiagnostic) {
self.errors.push(error);
}
pub(crate) fn errors_count(&self) -> usize {
self.errors.len() + self.lexer.errors.len()
}
#[cold]
pub(crate) fn set_fatal_error(&mut self, error: OxcDiagnostic) {
if self.fatal_error.is_none() {
self.lexer.advance_to_end();
self.fatal_error = Some(FatalError { error, errors_len: self.errors.len() });
}
}
#[cold]
pub(crate) fn fatal_error<T: Dummy<'a>>(&mut self, error: OxcDiagnostic) -> T {
self.set_fatal_error(error);
Dummy::dummy(self.ast.allocator)
}
pub(crate) fn has_fatal_error(&self) -> bool {
matches!(self.cur_kind(), Kind::Eof | Kind::Undetermined) || self.fatal_error.is_some()
}
}