7 use ra_syntax::{AstNode, TreeArc, SourceFile};
9 ParseQuery, FileTextQuery, SourceRootId,
10 salsa::{Database, debug::{DebugQueryTable, TableEntry}},
14 FileId, db::RootDatabase,
15 symbol_index::{SymbolIndex, LibrarySymbolsQuery},
18 pub(crate) fn status(db: &RootDatabase) -> String {
19 let files_stats = db.query(FileTextQuery).entries::<FilesStats>();
20 let syntax_tree_stats = db.query(ParseQuery).entries::<SyntaxTreeStats>();
21 let symbols_stats = db
22 .query(LibrarySymbolsQuery)
23 .entries::<LibrarySymbolsStats>();
25 let interner: &hir::HirInterner = db.as_ref();
29 "{}\n{}\n{}\nn_defs {}\n",
30 files_stats, symbols_stats, syntax_tree_stats, n_defs
40 impl fmt::Display for FilesStats {
41 fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
42 write!(fmt, "{} ({}) files", self.total, self.size)
46 impl FromIterator<TableEntry<FileId, Arc<String>>> for FilesStats {
47 fn from_iter<T>(iter: T) -> FilesStats
49 T: IntoIterator<Item = TableEntry<FileId, Arc<String>>>,
51 let mut res = FilesStats::default();
54 res.size += entry.value.unwrap().len();
61 struct SyntaxTreeStats {
67 impl fmt::Display for SyntaxTreeStats {
68 fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
71 "{} trees, {} ({}) retained",
72 self.total, self.retained, self.retained_size,
77 impl FromIterator<TableEntry<FileId, TreeArc<SourceFile>>> for SyntaxTreeStats {
78 fn from_iter<T>(iter: T) -> SyntaxTreeStats
80 T: IntoIterator<Item = TableEntry<FileId, TreeArc<SourceFile>>>,
82 let mut res = SyntaxTreeStats::default();
85 if let Some(value) = entry.value {
87 res.retained_size += value.syntax().memory_size_of_subtree();
95 struct LibrarySymbolsStats {
100 impl fmt::Display for LibrarySymbolsStats {
101 fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
102 write!(fmt, "{} ({}) symbols", self.total, self.size,)
106 impl FromIterator<TableEntry<SourceRootId, Arc<SymbolIndex>>> for LibrarySymbolsStats {
107 fn from_iter<T>(iter: T) -> LibrarySymbolsStats
109 T: IntoIterator<Item = TableEntry<SourceRootId, Arc<SymbolIndex>>>,
111 let mut res = LibrarySymbolsStats::default();
113 let value = entry.value.unwrap();
114 res.total += value.len();
115 res.size += value.memory_size();
124 impl fmt::Display for Bytes {
125 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
128 return write!(f, "{} bytes", bytes);
130 let kb = bytes / 1024;
132 return write!(f, "{}kb", kb);
135 write!(f, "{}mb", mb)
139 impl std::ops::AddAssign<usize> for Bytes {
140 fn add_assign(&mut self, x: usize) {