1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
mod hir;
use mun_hir::InFile;
use mun_syntax::TextRange;
///! This crate provides in-depth human-readable diagnostic information and fixes for compiler
///! errors that can be shared between the compiler and the language server.
///!
///! The processing of diagnostics into human-readable is separated from the machine-readable
///! diagnostics in for instance the HIR crate for performance reasons. This enables lazily querying
///! the system for more information only when required.
/// An annotation within the source code
#[derive(Debug, Clone, Eq, PartialEq)]
pub struct SourceAnnotation {
/// The location in the source
pub range: TextRange,
/// The message
pub message: String,
}
/// An annotation within the source code
#[derive(Debug, Clone, Eq, PartialEq)]
pub struct SecondaryAnnotation {
/// The location in the source
pub range: InFile<TextRange>,
/// The message
pub message: String,
}
/// The base trait for all diagnostics in this crate.
pub trait Diagnostic {
/// Returns the primary message of the diagnostic.
fn title(&self) -> String;
/// Returns the location of this diagnostic.
fn range(&self) -> TextRange;
/// Returns a source annotation that acts as the primary annotation for this Diagnostic.
fn primary_annotation(&self) -> Option<SourceAnnotation>;
/// Returns secondary source annotation that are shown as additional references.
fn secondary_annotations(&self) -> Vec<SecondaryAnnotation> {
Vec::new()
}
/// Optional footer text
fn footer(&self) -> Vec<String> {
Vec::new()
}
}
/// When implemented enables requesting `Diagnostic`s for the implementer.
pub trait DiagnosticFor {
/// Calls the specified function `f` with an instance of a [`Diagnostic`]. This can be used
/// to perform lazy diagnostic evaluation.
fn with_diagnostic<R, F: FnMut(&dyn Diagnostic) -> R>(&self, f: F) -> R;
}
/// Like [`DiagnosticFor`], enables requesting `Diagnostic`s for the implementer but only if passed
/// a required object.
pub trait DiagnosticForWith<With> {
/// Calls the specified function `f` with an instance of a [`Diagnostic`]. This can be used
/// to perform lazy diagnostic evaluation.
fn with_diagnostic<R, F: FnMut(&dyn Diagnostic) -> R>(&self, with: &With, f: F) -> R;
}
impl From<SecondaryAnnotation> for SourceAnnotation {
fn from(annotation: SecondaryAnnotation) -> Self {
SourceAnnotation {
range: annotation.range.value,
message: annotation.message,
}
}
}