}
impl Diagnostic for UnresolvedModule {
+ fn name(&self) -> String {
+ "unresolved-module".to_string()
+ }
fn message(&self) -> String {
"unresolved module".to_string()
}
//! subsystem provides a separate, non-query-based API which can walk all stored
//! values and transform them into instances of `Diagnostic`.
-use std::{any::Any, fmt};
+use std::{any::Any, collections::HashSet, fmt};
use ra_syntax::{SyntaxNode, SyntaxNodePtr};
use crate::{db::AstDatabase, InFile};
pub trait Diagnostic: Any + Send + Sync + fmt::Debug + 'static {
+ fn name(&self) -> String;
fn message(&self) -> String;
fn source(&self) -> InFile<SyntaxNodePtr>;
fn as_any(&self) -> &(dyn Any + Send + 'static);
callbacks: Vec<Box<dyn FnMut(&dyn Diagnostic) -> Result<(), ()> + 'a>>,
filters: Vec<Box<dyn FnMut(&dyn Diagnostic) -> bool + 'a>>,
default_callback: Box<dyn FnMut(&dyn Diagnostic) + 'a>,
+ disabled_diagnostics: HashSet<String>,
}
impl<'a> DiagnosticSink<'a> {
pub fn push(&mut self, d: impl Diagnostic) {
+ if self.disabled_diagnostics.contains(&d.name()) {
+ // This diagnostic is disabled, ignore it completely.
+ return;
+ }
+
let d: &dyn Diagnostic = &d;
self._push(d);
}
pub struct DiagnosticSinkBuilder<'a> {
callbacks: Vec<Box<dyn FnMut(&dyn Diagnostic) -> Result<(), ()> + 'a>>,
filters: Vec<Box<dyn FnMut(&dyn Diagnostic) -> bool + 'a>>,
+ disabled_diagnostics: HashSet<String>,
}
impl<'a> DiagnosticSinkBuilder<'a> {
pub fn new() -> Self {
- Self { callbacks: Vec::new(), filters: Vec::new() }
+ Self { callbacks: Vec::new(), filters: Vec::new(), disabled_diagnostics: HashSet::new() }
}
pub fn filter<F: FnMut(&dyn Diagnostic) -> bool + 'a>(mut self, cb: F) -> Self {
self
}
+ pub fn disable_diagnostic(mut self, diagnostic: impl Into<String>) -> Self {
+ self.disabled_diagnostics.insert(diagnostic.into());
+ self
+ }
+
pub fn build<F: FnMut(&dyn Diagnostic) + 'a>(self, default_callback: F) -> DiagnosticSink<'a> {
DiagnosticSink {
callbacks: self.callbacks,
filters: self.filters,
default_callback: Box::new(default_callback),
+ disabled_diagnostics: self.disabled_diagnostics,
}
}
}
}
impl Diagnostic for NoSuchField {
+ fn name(&self) -> String {
+ "no-such-field".to_string()
+ }
+
fn message(&self) -> String {
"no such field".to_string()
}
}
impl Diagnostic for MissingFields {
+ fn name(&self) -> String {
+ "missing-structure-fields".to_string()
+ }
fn message(&self) -> String {
let mut buf = String::from("Missing structure fields:\n");
for field in &self.missed_fields {
}
impl Diagnostic for MissingPatFields {
+ fn name(&self) -> String {
+ "missing-pat-fields".to_string()
+ }
fn message(&self) -> String {
let mut buf = String::from("Missing structure fields:\n");
for field in &self.missed_fields {
}
impl Diagnostic for MissingMatchArms {
+ fn name(&self) -> String {
+ "missing-match-arm".to_string()
+ }
fn message(&self) -> String {
String::from("Missing match arm")
}
}
impl Diagnostic for MissingOkInTailExpr {
+ fn name(&self) -> String {
+ "missing-ok-in-tail-expr".to_string()
+ }
fn message(&self) -> String {
"wrap return expression in Ok".to_string()
}
}
impl Diagnostic for BreakOutsideOfLoop {
+ fn name(&self) -> String {
+ "break-outside-of-loop".to_string()
+ }
fn message(&self) -> String {
"break outside of loop".to_string()
}
}
impl Diagnostic for MissingUnsafe {
+ fn name(&self) -> String {
+ "missing-unsafe".to_string()
+ }
fn message(&self) -> String {
format!("This operation is unsafe and requires an unsafe function or block")
}
}
impl Diagnostic for MismatchedArgCount {
+ fn name(&self) -> String {
+ "mismatched-arg-count".to_string()
+ }
fn message(&self) -> String {
let s = if self.expected == 1 { "" } else { "s" };
format!("Expected {} argument{}, found {}", self.expected, s, self.found)