aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_hir/src/debug.rs
diff options
context:
space:
mode:
authorAleksey Kladov <[email protected]>2019-09-08 07:48:45 +0100
committerAleksey Kladov <[email protected]>2019-09-09 10:32:16 +0100
commitef2b84ddf119c950272c5f1eb321f3f9e90bedd4 (patch)
treed746c95cef14b27f67f1e5fd32d289e6d20b4d57 /crates/ra_hir/src/debug.rs
parent734a43e95afc97773c234956a95b78caed88f2a3 (diff)
introduce hir debugging infra
This is to make debugging rust-analyzer easier. The idea is that `dbg!(krate.debug(db))` will print the actual, fuzzy crate name, instead of precise ID. Debug printing infra is a separate thing, to make sure that the actual hir doesn't have access to global information. Do not use `.debug` for `log::` logging: debugging executes queries, and might introduce unneded dependencies to the crate graph
Diffstat (limited to 'crates/ra_hir/src/debug.rs')
-rw-r--r--crates/ra_hir/src/debug.rs64
1 files changed, 64 insertions, 0 deletions
diff --git a/crates/ra_hir/src/debug.rs b/crates/ra_hir/src/debug.rs
new file mode 100644
index 000000000..5a835741d
--- /dev/null
+++ b/crates/ra_hir/src/debug.rs
@@ -0,0 +1,64 @@
1use std::{cell::Cell, fmt};
2
3use ra_db::{CrateId, FileId};
4
5use crate::{db::HirDatabase, Crate, Module, Name};
6
7impl Crate {
8 pub fn debug(self, db: &impl HirDebugDatabase) -> impl fmt::Debug + '_ {
9 debug_fn(move |fmt| db.debug_crate(self, fmt))
10 }
11}
12
13impl Module {
14 pub fn debug(self, db: &impl HirDebugDatabase) -> impl fmt::Debug + '_ {
15 debug_fn(move |fmt| db.debug_module(self, fmt))
16 }
17}
18
19pub trait HirDebugHelper: HirDatabase {
20 fn crate_name(&self, _krate: CrateId) -> Option<String> {
21 None
22 }
23 fn file_path(&self, _file_id: FileId) -> Option<String> {
24 None
25 }
26}
27
28pub trait HirDebugDatabase {
29 fn debug_crate(&self, krate: Crate, fmt: &mut fmt::Formatter<'_>) -> fmt::Result;
30 fn debug_module(&self, module: Module, fmt: &mut fmt::Formatter<'_>) -> fmt::Result;
31}
32
33impl<DB: HirDebugHelper> HirDebugDatabase for DB {
34 fn debug_crate(&self, krate: Crate, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
35 let mut builder = fmt.debug_tuple("Crate");
36 match self.crate_name(krate.crate_id) {
37 Some(name) => builder.field(&name),
38 None => builder.field(&krate.crate_id),
39 }
40 .finish()
41 }
42
43 fn debug_module(&self, module: Module, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
44 let file_id = module.definition_source(self).file_id.original_file(self);
45 let path = self.file_path(file_id);
46 fmt.debug_struct("Module")
47 .field("name", &module.name(self).unwrap_or_else(Name::missing))
48 .field("path", &path.unwrap_or_else(|| "N/A".to_string()))
49 .finish()
50 }
51}
52
53fn debug_fn(f: impl FnOnce(&mut fmt::Formatter<'_>) -> fmt::Result) -> impl fmt::Debug {
54 struct DebugFn<F>(Cell<Option<F>>);
55
56 impl<F: FnOnce(&mut fmt::Formatter<'_>) -> fmt::Result> fmt::Debug for DebugFn<F> {
57 fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
58 let f = self.0.take().unwrap();
59 f(fmt)
60 }
61 }
62
63 DebugFn(Cell::new(Some(f)))
64}