From 74d827bb8001952f90c85fca3d064fe3096009bd Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Mon, 4 Nov 2019 22:21:15 +0300 Subject: Rename MockDatabase -> TestDB Actually working rename is sooo useful! --- crates/ra_hir/src/test_db.rs | 131 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 131 insertions(+) create mode 100644 crates/ra_hir/src/test_db.rs (limited to 'crates/ra_hir/src/test_db.rs') diff --git a/crates/ra_hir/src/test_db.rs b/crates/ra_hir/src/test_db.rs new file mode 100644 index 000000000..047a27aaf --- /dev/null +++ b/crates/ra_hir/src/test_db.rs @@ -0,0 +1,131 @@ +//! FIXME: write short doc here + +use std::{panic, sync::Arc}; + +use hir_def::{db::DefDatabase2, ModuleId}; +use hir_expand::diagnostics::DiagnosticSink; +use parking_lot::Mutex; +use ra_db::{ + salsa, CrateId, FileId, FileLoader, FileLoaderDelegate, RelativePath, SourceDatabase, + SourceRootId, +}; + +use crate::{db, debug::HirDebugHelper}; + +#[salsa::database( + ra_db::SourceDatabaseExtStorage, + ra_db::SourceDatabaseStorage, + db::InternDatabaseStorage, + db::AstDatabaseStorage, + db::DefDatabaseStorage, + db::DefDatabase2Storage, + db::HirDatabaseStorage +)] +#[derive(Debug)] +pub struct TestDB { + events: Mutex>>>, + runtime: salsa::Runtime, +} + +impl panic::RefUnwindSafe for TestDB {} + +impl FileLoader for TestDB { + fn file_text(&self, file_id: FileId) -> Arc { + FileLoaderDelegate(self).file_text(file_id) + } + fn resolve_relative_path( + &self, + anchor: FileId, + relative_path: &RelativePath, + ) -> Option { + FileLoaderDelegate(self).resolve_relative_path(anchor, relative_path) + } + fn relevant_crates(&self, file_id: FileId) -> Arc> { + FileLoaderDelegate(self).relevant_crates(file_id) + } +} + +// FIXME: improve `WithFixture` to bring useful hir debugging back +impl HirDebugHelper for TestDB { + fn crate_name(&self, _krate: CrateId) -> Option { + None + } + + fn file_path(&self, _file_id: FileId) -> Option { + None + } +} + +impl TestDB { + pub fn diagnostics(&self) -> String { + let mut buf = String::new(); + let crate_graph = self.crate_graph(); + for krate in crate_graph.iter().next() { + let crate_def_map = self.crate_def_map(krate); + for (module_id, _) in crate_def_map.modules.iter() { + let module_id = ModuleId { krate, module_id }; + let module = crate::Module::from(module_id); + module.diagnostics( + self, + &mut DiagnosticSink::new(|d| { + buf += &format!("{:?}: {}\n", d.syntax_node(self).text(), d.message()); + }), + ) + } + } + buf + } +} + +impl salsa::Database for TestDB { + fn salsa_runtime(&self) -> &salsa::Runtime { + &self.runtime + } + + fn salsa_event(&self, event: impl Fn() -> salsa::Event) { + let mut events = self.events.lock(); + if let Some(events) = &mut *events { + events.push(event()); + } + } +} + +impl Default for TestDB { + fn default() -> TestDB { + let mut db = TestDB { events: Default::default(), runtime: salsa::Runtime::default() }; + db.set_crate_graph(Default::default()); + db + } +} + +impl salsa::ParallelDatabase for TestDB { + fn snapshot(&self) -> salsa::Snapshot { + salsa::Snapshot::new(TestDB { + events: Default::default(), + runtime: self.runtime.snapshot(self), + }) + } +} + +impl TestDB { + pub fn log(&self, f: impl FnOnce()) -> Vec> { + *self.events.lock() = Some(Vec::new()); + f(); + self.events.lock().take().unwrap() + } + + pub fn log_executed(&self, f: impl FnOnce()) -> Vec { + let events = self.log(f); + events + .into_iter() + .filter_map(|e| match e.kind { + // This pretty horrible, but `Debug` is the only way to inspect + // QueryDescriptor at the moment. + salsa::EventKind::WillExecute { database_key } => { + Some(format!("{:?}", database_key)) + } + _ => None, + }) + .collect() + } +} -- cgit v1.2.3 From fd7819c3c09161986c3e1398d546e7503886760b Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Mon, 4 Nov 2019 22:29:51 +0300 Subject: Simplify --- crates/ra_hir/src/test_db.rs | 59 ++++++++++++++++++-------------------------- 1 file changed, 24 insertions(+), 35 deletions(-) (limited to 'crates/ra_hir/src/test_db.rs') diff --git a/crates/ra_hir/src/test_db.rs b/crates/ra_hir/src/test_db.rs index 047a27aaf..84a2bf02b 100644 --- a/crates/ra_hir/src/test_db.rs +++ b/crates/ra_hir/src/test_db.rs @@ -5,10 +5,7 @@ use std::{panic, sync::Arc}; use hir_def::{db::DefDatabase2, ModuleId}; use hir_expand::diagnostics::DiagnosticSink; use parking_lot::Mutex; -use ra_db::{ - salsa, CrateId, FileId, FileLoader, FileLoaderDelegate, RelativePath, SourceDatabase, - SourceRootId, -}; +use ra_db::{salsa, CrateId, FileId, FileLoader, FileLoaderDelegate, RelativePath, SourceDatabase}; use crate::{db, debug::HirDebugHelper}; @@ -21,12 +18,34 @@ use crate::{db, debug::HirDebugHelper}; db::DefDatabase2Storage, db::HirDatabaseStorage )] -#[derive(Debug)] +#[derive(Debug, Default)] pub struct TestDB { events: Mutex>>>, runtime: salsa::Runtime, } +impl salsa::Database for TestDB { + fn salsa_runtime(&self) -> &salsa::Runtime { + &self.runtime + } + + fn salsa_event(&self, event: impl Fn() -> salsa::Event) { + let mut events = self.events.lock(); + if let Some(events) = &mut *events { + events.push(event()); + } + } +} + +impl salsa::ParallelDatabase for TestDB { + fn snapshot(&self) -> salsa::Snapshot { + salsa::Snapshot::new(TestDB { + events: Default::default(), + runtime: self.runtime.snapshot(self), + }) + } +} + impl panic::RefUnwindSafe for TestDB {} impl FileLoader for TestDB { @@ -77,36 +96,6 @@ impl TestDB { } } -impl salsa::Database for TestDB { - fn salsa_runtime(&self) -> &salsa::Runtime { - &self.runtime - } - - fn salsa_event(&self, event: impl Fn() -> salsa::Event) { - let mut events = self.events.lock(); - if let Some(events) = &mut *events { - events.push(event()); - } - } -} - -impl Default for TestDB { - fn default() -> TestDB { - let mut db = TestDB { events: Default::default(), runtime: salsa::Runtime::default() }; - db.set_crate_graph(Default::default()); - db - } -} - -impl salsa::ParallelDatabase for TestDB { - fn snapshot(&self) -> salsa::Snapshot { - salsa::Snapshot::new(TestDB { - events: Default::default(), - runtime: self.runtime.snapshot(self), - }) - } -} - impl TestDB { pub fn log(&self, f: impl FnOnce()) -> Vec> { *self.events.lock() = Some(Vec::new()); -- cgit v1.2.3 From 50364bd47815f4f9174d46ae33f44f7f56545b2d Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Mon, 4 Nov 2019 22:33:21 +0300 Subject: Appease the linter by dummy doc comments --- crates/ra_hir/src/test_db.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'crates/ra_hir/src/test_db.rs') diff --git a/crates/ra_hir/src/test_db.rs b/crates/ra_hir/src/test_db.rs index 84a2bf02b..5237b303a 100644 --- a/crates/ra_hir/src/test_db.rs +++ b/crates/ra_hir/src/test_db.rs @@ -1,4 +1,4 @@ -//! FIXME: write short doc here +//! Database used for testing `hir`. use std::{panic, sync::Arc}; -- cgit v1.2.3