@@ -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
2932pub trait AstDiagnostic {
@@ -44,6 +47,7 @@ impl dyn Diagnostic {
4447
4548pub 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
6776pub 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
7181impl < ' 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