Skip to content

Commit 76509b3

Browse files
author
Jonas Schievink
committed
Allow filtering diagnostics
1 parent 6f02bef commit 76509b3

File tree

1 file changed

+22
-3
lines changed

1 file changed

+22
-3
lines changed

crates/ra_hir_expand/src/diagnostics.rs

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,9 @@ pub trait Diagnostic: Any + Send + Sync + fmt::Debug + 'static {
2424
fn message(&self) -> String;
2525
fn source(&self) -> InFile<SyntaxNodePtr>;
2626
fn as_any(&self) -> &(dyn Any + Send + 'static);
27+
fn is_experimental(&self) -> bool {
28+
false
29+
}
2730
}
2831

2932
pub trait AstDiagnostic {
@@ -44,6 +47,7 @@ impl dyn Diagnostic {
4447

4548
pub struct DiagnosticSink<'a> {
4649
callbacks: Vec<Box<dyn FnMut(&dyn Diagnostic) -> Result<(), ()> + 'a>>,
50+
filters: Vec<Box<dyn FnMut(&dyn Diagnostic) -> bool + 'a>>,
4751
default_callback: Box<dyn FnMut(&dyn Diagnostic) + 'a>,
4852
}
4953

@@ -54,7 +58,12 @@ impl<'a> DiagnosticSink<'a> {
5458
}
5559

5660
fn _push(&mut self, d: &dyn Diagnostic) {
57-
for cb in self.callbacks.iter_mut() {
61+
for filter in &mut self.filters {
62+
if !filter(d) {
63+
return;
64+
}
65+
}
66+
for cb in &mut self.callbacks {
5867
match cb(d) {
5968
Ok(()) => return,
6069
Err(()) => (),
@@ -66,11 +75,17 @@ impl<'a> DiagnosticSink<'a> {
6675

6776
pub struct DiagnosticSinkBuilder<'a> {
6877
callbacks: Vec<Box<dyn FnMut(&dyn Diagnostic) -> Result<(), ()> + 'a>>,
78+
filters: Vec<Box<dyn FnMut(&dyn Diagnostic) -> bool + 'a>>,
6979
}
7080

7181
impl<'a> DiagnosticSinkBuilder<'a> {
7282
pub fn new() -> Self {
73-
Self { callbacks: Vec::new() }
83+
Self { callbacks: Vec::new(), filters: Vec::new() }
84+
}
85+
86+
pub fn filter<F: FnMut(&dyn Diagnostic) -> bool + 'a>(mut self, cb: F) -> Self {
87+
self.filters.push(Box::new(cb));
88+
self
7489
}
7590

7691
pub fn on<D: Diagnostic, F: FnMut(&D) + 'a>(mut self, mut cb: F) -> Self {
@@ -86,6 +101,10 @@ impl<'a> DiagnosticSinkBuilder<'a> {
86101
}
87102

88103
pub fn build<F: FnMut(&dyn Diagnostic) + 'a>(self, default_callback: F) -> DiagnosticSink<'a> {
89-
DiagnosticSink { callbacks: self.callbacks, default_callback: Box::new(default_callback) }
104+
DiagnosticSink {
105+
callbacks: self.callbacks,
106+
filters: self.filters,
107+
default_callback: Box::new(default_callback),
108+
}
90109
}
91110
}

0 commit comments

Comments
 (0)