Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/salsa/src/debug.rs')
-rw-r--r--crates/salsa/src/debug.rs66
1 files changed, 66 insertions, 0 deletions
diff --git a/crates/salsa/src/debug.rs b/crates/salsa/src/debug.rs
new file mode 100644
index 0000000000..0925ddb3d8
--- /dev/null
+++ b/crates/salsa/src/debug.rs
@@ -0,0 +1,66 @@
+//! Debugging APIs: these are meant for use when unit-testing or
+//! debugging your application but aren't ordinarily needed.
+
+use crate::durability::Durability;
+use crate::plumbing::QueryStorageOps;
+use crate::Query;
+use crate::QueryTable;
+use std::iter::FromIterator;
+
+/// Additional methods on queries that can be used to "peek into"
+/// their current state. These methods are meant for debugging and
+/// observing the effects of garbage collection etc.
+pub trait DebugQueryTable {
+ /// Key of this query.
+ type Key;
+
+ /// Value of this query.
+ type Value;
+
+ /// Returns a lower bound on the durability for the given key.
+ /// This is typically the minimum durability of all values that
+ /// the query accessed, but we may return a lower durability in
+ /// some cases.
+ fn durability(&self, key: Self::Key) -> Durability;
+
+ /// Get the (current) set of the entries in the query table.
+ fn entries<C>(&self) -> C
+ where
+ C: FromIterator<TableEntry<Self::Key, Self::Value>>;
+}
+
+/// An entry from a query table, for debugging and inspecting the table state.
+#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord)]
+#[non_exhaustive]
+pub struct TableEntry<K, V> {
+ /// key of the query
+ pub key: K,
+ /// value of the query, if it is stored
+ pub value: Option<V>,
+}
+
+impl<K, V> TableEntry<K, V> {
+ pub(crate) fn new(key: K, value: Option<V>) -> TableEntry<K, V> {
+ TableEntry { key, value }
+ }
+}
+
+impl<Q> DebugQueryTable for QueryTable<'_, Q>
+where
+ Q: Query,
+ Q::Storage: QueryStorageOps<Q>,
+{
+ type Key = Q::Key;
+ type Value = Q::Value;
+
+ fn durability(&self, key: Q::Key) -> Durability {
+ self.storage.durability(self.db, &key)
+ }
+
+ fn entries<C>(&self) -> C
+ where
+ C: FromIterator<TableEntry<Self::Key, Self::Value>>,
+ {
+ self.storage.entries(self.db)
+ }
+}