about summary refs log tree commit diff
path: root/src/tools/rust-analyzer/crates/salsa/tests/incremental/implementation.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/tools/rust-analyzer/crates/salsa/tests/incremental/implementation.rs')
-rw-r--r--src/tools/rust-analyzer/crates/salsa/tests/incremental/implementation.rs59
1 files changed, 59 insertions, 0 deletions
diff --git a/src/tools/rust-analyzer/crates/salsa/tests/incremental/implementation.rs b/src/tools/rust-analyzer/crates/salsa/tests/incremental/implementation.rs
new file mode 100644
index 00000000000..19752bba005
--- /dev/null
+++ b/src/tools/rust-analyzer/crates/salsa/tests/incremental/implementation.rs
@@ -0,0 +1,59 @@
+use crate::constants;
+use crate::counter::Counter;
+use crate::log::Log;
+use crate::memoized_dep_inputs;
+use crate::memoized_inputs;
+use crate::memoized_volatile;
+
+pub(crate) trait TestContext: salsa::Database {
+    fn clock(&self) -> &Counter;
+    fn log(&self) -> &Log;
+}
+
+#[salsa::database(
+    constants::Constants,
+    memoized_dep_inputs::MemoizedDepInputs,
+    memoized_inputs::MemoizedInputs,
+    memoized_volatile::MemoizedVolatile
+)]
+#[derive(Default)]
+pub(crate) struct TestContextImpl {
+    storage: salsa::Storage<TestContextImpl>,
+    clock: Counter,
+    log: Log,
+}
+
+impl TestContextImpl {
+    #[track_caller]
+    pub(crate) fn assert_log(&self, expected_log: &[&str]) {
+        let expected_text = &format!("{:#?}", expected_log);
+        let actual_text = &format!("{:#?}", self.log().take());
+
+        if expected_text == actual_text {
+            return;
+        }
+
+        #[allow(clippy::print_stdout)]
+        for diff in dissimilar::diff(expected_text, actual_text) {
+            match diff {
+                dissimilar::Chunk::Delete(l) => println!("-{}", l),
+                dissimilar::Chunk::Equal(l) => println!(" {}", l),
+                dissimilar::Chunk::Insert(r) => println!("+{}", r),
+            }
+        }
+
+        panic!("incorrect log results");
+    }
+}
+
+impl TestContext for TestContextImpl {
+    fn clock(&self) -> &Counter {
+        &self.clock
+    }
+
+    fn log(&self) -> &Log {
+        &self.log
+    }
+}
+
+impl salsa::Database for TestContextImpl {}