aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_hir_expand/src/diagnostics.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_hir_expand/src/diagnostics.rs')
-rw-r--r--crates/ra_hir_expand/src/diagnostics.rs25
1 files changed, 5 insertions, 20 deletions
diff --git a/crates/ra_hir_expand/src/diagnostics.rs b/crates/ra_hir_expand/src/diagnostics.rs
index 507132a13..a618934c9 100644
--- a/crates/ra_hir_expand/src/diagnostics.rs
+++ b/crates/ra_hir_expand/src/diagnostics.rs
@@ -16,36 +16,21 @@
16 16
17use std::{any::Any, fmt}; 17use std::{any::Any, fmt};
18 18
19use ra_syntax::{SyntaxNode, SyntaxNodePtr}; 19use ra_syntax::SyntaxNodePtr;
20 20
21use crate::{db::AstDatabase, InFile}; 21use crate::InFile;
22 22
23pub trait Diagnostic: Any + Send + Sync + fmt::Debug + 'static { 23pub trait Diagnostic: Any + Send + Sync + fmt::Debug + 'static {
24 fn name(&self) -> &'static str; 24 fn name(&self) -> &'static str;
25 fn message(&self) -> String; 25 fn message(&self) -> String;
26 fn source(&self) -> InFile<SyntaxNodePtr>; 26 /// Used in highlighting and related purposes
27 fn display_source(&self) -> InFile<SyntaxNodePtr>;
27 fn as_any(&self) -> &(dyn Any + Send + 'static); 28 fn as_any(&self) -> &(dyn Any + Send + 'static);
28 fn is_experimental(&self) -> bool { 29 fn is_experimental(&self) -> bool {
29 false 30 false
30 } 31 }
31} 32}
32 33
33pub trait AstDiagnostic {
34 type AST;
35 fn ast(&self, db: &dyn AstDatabase) -> Self::AST;
36}
37
38impl dyn Diagnostic {
39 pub fn syntax_node(&self, db: &impl AstDatabase) -> SyntaxNode {
40 let node = db.parse_or_expand(self.source().file_id).unwrap();
41 self.source().value.to_node(&node)
42 }
43
44 pub fn downcast_ref<D: Diagnostic>(&self) -> Option<&D> {
45 self.as_any().downcast_ref()
46 }
47}
48
49pub struct DiagnosticSink<'a> { 34pub struct DiagnosticSink<'a> {
50 callbacks: Vec<Box<dyn FnMut(&dyn Diagnostic) -> Result<(), ()> + 'a>>, 35 callbacks: Vec<Box<dyn FnMut(&dyn Diagnostic) -> Result<(), ()> + 'a>>,
51 filters: Vec<Box<dyn FnMut(&dyn Diagnostic) -> bool + 'a>>, 36 filters: Vec<Box<dyn FnMut(&dyn Diagnostic) -> bool + 'a>>,
@@ -90,7 +75,7 @@ impl<'a> DiagnosticSinkBuilder<'a> {
90 } 75 }
91 76
92 pub fn on<D: Diagnostic, F: FnMut(&D) + 'a>(mut self, mut cb: F) -> Self { 77 pub fn on<D: Diagnostic, F: FnMut(&D) + 'a>(mut self, mut cb: F) -> Self {
93 let cb = move |diag: &dyn Diagnostic| match diag.downcast_ref::<D>() { 78 let cb = move |diag: &dyn Diagnostic| match diag.as_any().downcast_ref::<D>() {
94 Some(d) => { 79 Some(d) => {
95 cb(d); 80 cb(d);
96 Ok(()) 81 Ok(())