use crate::ast::*;
use hax_rust_engine_macros::*;
pub use hax_types::diagnostics::Kind as DiagnosticInfoKind;
#[derive_group_for_ast]
pub struct Diagnostic {
node: Box<Fragment>,
info: DiagnosticInfo,
}
#[derive_group_for_ast]
#[must_use]
pub struct DiagnosticInfo {
pub context: Context,
pub span: Span,
pub kind: DiagnosticInfoKind,
}
impl DiagnosticInfo {
pub fn emit(&self) {
crate::hax_io::write(&hax_types::engine_api::protocol::FromEngine::Diagnostic(
hax_types::diagnostics::Diagnostics {
kind: self.kind.clone(),
span: self.span.as_frontend_spans().to_vec(),
context: format!("{}", self.context),
owner_id: None,
},
))
}
}
impl Diagnostic {
pub fn info(&self) -> &DiagnosticInfo {
&self.info
}
pub fn node(&self) -> &Fragment {
&self.node
}
pub fn new(node: impl Into<Fragment>, info: DiagnosticInfo) -> Self {
let node = node.into();
info.emit();
Self {
node: Box::new(node),
info,
}
}
}
#[derive_group_for_ast]
pub enum Context {
Import,
NameView,
Printer(String),
Phase(String),
Debugger,
Unknown,
}
impl std::fmt::Display for Context {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Context::Import => write!(f, "Importer"),
Context::NameView => write!(f, "Name rendering"),
Context::Printer(p) => write!(f, "{p} Printer"),
Context::Phase(p) => write!(f, "Engine phase ({p})"),
Context::Debugger => write!(f, "Debugger"),
Context::Unknown => write!(f, "Unknown"),
}
}
}