use crate::{
SourceKey,
protocol::lsp,
};
crate::define_dyn_partition!(
Diagnostics,
"laburnum::diagnostics",
DiagnosticSortKey,
DiagnosticRecord
);
#[derive(Debug, Clone)]
pub enum DiagnosticSortKey {
Diagnostic {
source_key: SourceKey,
severity: lsp::DiagnosticSeverity,
sequence: u16,
},
All,
FilePrefix(u16),
SourcePrefix(SourceKey),
SourceSeverityPrefix(SourceKey, lsp::DiagnosticSeverity),
}
impl std::fmt::Display for DiagnosticSortKey {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
| DiagnosticSortKey::Diagnostic {
source_key,
severity,
sequence,
} => write!(f, "{}|{}|{:04}", source_key, severity, sequence),
| DiagnosticSortKey::All => Ok(()),
| DiagnosticSortKey::FilePrefix(file_id) => {
write!(f, "{}v", file_id)
},
| DiagnosticSortKey::SourcePrefix(source_key) => {
write!(f, "{}|", source_key)
},
| DiagnosticSortKey::SourceSeverityPrefix(source_key, severity) => {
write!(f, "{}|{}|", source_key, severity)
},
}
}
}
pub trait DiagnosticRecord: Send + Sync + std::fmt::Debug {
fn to_lsp_diagnostic(
&self,
source_cache: &crate::source::cache::reporter::SourceCacheReader,
encoding: &crate::protocol::lsp::PositionEncodingKind,
) -> lsp::Diagnostic;
fn to_ariadne_report(
&self,
source_cache: &crate::source::cache::reporter::SourceCacheReader,
) -> ariadne::Report<'static, (SourceKey, std::ops::Range<usize>)>;
fn source_key(&self) -> Option<SourceKey>;
fn severity(&self) -> Option<lsp::DiagnosticSeverity>;
fn message(&self) -> Option<&str>;
}