diff options
Diffstat (limited to 'crates/ra_hir_ty/src/test_db.rs')
-rw-r--r-- | crates/ra_hir_ty/src/test_db.rs | 36 |
1 files changed, 27 insertions, 9 deletions
diff --git a/crates/ra_hir_ty/src/test_db.rs b/crates/ra_hir_ty/src/test_db.rs index 3a4d58bf9..8498d3d96 100644 --- a/crates/ra_hir_ty/src/test_db.rs +++ b/crates/ra_hir_ty/src/test_db.rs | |||
@@ -12,7 +12,7 @@ use ra_db::{ | |||
12 | }; | 12 | }; |
13 | use stdx::format_to; | 13 | use stdx::format_to; |
14 | 14 | ||
15 | use crate::{db::HirDatabase, expr::ExprValidator}; | 15 | use crate::{db::HirDatabase, diagnostics::Diagnostic, expr::ExprValidator}; |
16 | 16 | ||
17 | #[salsa::database( | 17 | #[salsa::database( |
18 | ra_db::SourceDatabaseExtStorage, | 18 | ra_db::SourceDatabaseExtStorage, |
@@ -104,10 +104,7 @@ impl TestDB { | |||
104 | panic!("Can't find module for file") | 104 | panic!("Can't find module for file") |
105 | } | 105 | } |
106 | 106 | ||
107 | // FIXME: don't duplicate this | 107 | fn diag<F: FnMut(&dyn Diagnostic)>(&self, mut cb: F) { |
108 | pub fn diagnostics(&self) -> (String, u32) { | ||
109 | let mut buf = String::new(); | ||
110 | let mut count = 0; | ||
111 | let crate_graph = self.crate_graph(); | 108 | let crate_graph = self.crate_graph(); |
112 | for krate in crate_graph.iter() { | 109 | for krate in crate_graph.iter() { |
113 | let crate_def_map = self.crate_def_map(krate); | 110 | let crate_def_map = self.crate_def_map(krate); |
@@ -132,15 +129,36 @@ impl TestDB { | |||
132 | 129 | ||
133 | for f in fns { | 130 | for f in fns { |
134 | let infer = self.infer(f.into()); | 131 | let infer = self.infer(f.into()); |
135 | let mut sink = DiagnosticSink::new(|d| { | 132 | let mut sink = DiagnosticSink::new(&mut cb); |
136 | format_to!(buf, "{:?}: {}\n", d.syntax_node(self).text(), d.message()); | ||
137 | count += 1; | ||
138 | }); | ||
139 | infer.add_diagnostics(self, f, &mut sink); | 133 | infer.add_diagnostics(self, f, &mut sink); |
140 | let mut validator = ExprValidator::new(f, infer, &mut sink); | 134 | let mut validator = ExprValidator::new(f, infer, &mut sink); |
141 | validator.validate_body(self); | 135 | validator.validate_body(self); |
142 | } | 136 | } |
143 | } | 137 | } |
138 | } | ||
139 | |||
140 | pub fn diagnostics(&self) -> (String, u32) { | ||
141 | let mut buf = String::new(); | ||
142 | let mut count = 0; | ||
143 | self.diag(|d| { | ||
144 | format_to!(buf, "{:?}: {}\n", d.syntax_node(self).text(), d.message()); | ||
145 | count += 1; | ||
146 | }); | ||
147 | (buf, count) | ||
148 | } | ||
149 | |||
150 | /// Like `diagnostics`, but filtered for a single diagnostic. | ||
151 | pub fn diagnostic<D: Diagnostic>(&self) -> (String, u32) { | ||
152 | let mut buf = String::new(); | ||
153 | let mut count = 0; | ||
154 | self.diag(|d| { | ||
155 | // We want to filter diagnostics by the particular one we are testing for, to | ||
156 | // avoid surprising results in tests. | ||
157 | if d.downcast_ref::<D>().is_some() { | ||
158 | format_to!(buf, "{:?}: {}\n", d.syntax_node(self).text(), d.message()); | ||
159 | count += 1; | ||
160 | }; | ||
161 | }); | ||
144 | (buf, count) | 162 | (buf, count) |
145 | } | 163 | } |
146 | } | 164 | } |