use std::cell::RefCell;
use oxc_diagnostics::OxcDiagnostic;
use vue_compiler_core::error::{CompilationError, CompilationErrorKind, ErrorHandler};
use crate::parser::parse::SourceLocatonSpan;
pub struct OxcErrorHandler<'a> {
errors: &'a RefCell<&'a mut Vec<OxcDiagnostic>>,
panicked: &'a RefCell<bool>,
}
impl<'a> OxcErrorHandler<'a> {
pub const fn new(
errors: &'a RefCell<&'a mut Vec<OxcDiagnostic>>,
panicked: &'a RefCell<bool>,
) -> Self {
Self { errors, panicked }
}
}
impl ErrorHandler for OxcErrorHandler<'_> {
fn on_error(&self, error: CompilationError) {
if should_panic(&error) {
*self.panicked.borrow_mut() = true;
}
if !is_warn(&error) {
self
.errors
.borrow_mut()
.push(OxcDiagnostic::error(error.to_string()).with_label(error.location.span()));
}
}
}
#[must_use]
const fn is_warn(error: &CompilationError) -> bool {
matches!(
error.kind,
CompilationErrorKind::InvalidFirstCharacterOfTagName
| CompilationErrorKind::NestedComment
| CompilationErrorKind::IncorrectlyClosedComment
| CompilationErrorKind::IncorrectlyOpenedComment
| CompilationErrorKind::AbruptClosingOfEmptyComment
| CompilationErrorKind::MissingWhitespaceBetweenAttributes
| CompilationErrorKind::MissingDirectiveArg
)
}
#[must_use]
const fn should_panic(error: &CompilationError) -> bool {
matches!(
error.kind,
CompilationErrorKind::EofInTag
| CompilationErrorKind::EofInComment
| CompilationErrorKind::EofInCdata
| CompilationErrorKind::EofBeforeTagName
| CompilationErrorKind::EofInScriptHtmlCommentLikeText
| CompilationErrorKind::MissingInterpolationEnd
| CompilationErrorKind::MissingDynamicDirectiveArgumentEnd
| CompilationErrorKind::MissingEndTag
| CompilationErrorKind::UnexpectedNullCharacter
| CompilationErrorKind::CDataInHtmlContent
)
}