ide_db/apply_change.rs
1//! Applies changes to the IDE state transactionally.
2
3use std::time::{Duration, Instant};
4
5use profile::Bytes;
6use salsa::Database as _;
7
8use crate::{ChangeWithProcMacros, RootDatabase};
9
10impl RootDatabase {
11 pub fn apply_change(&mut self, change: ChangeWithProcMacros) -> Duration {
12 let _p = tracing::info_span!("RootDatabase::apply_change").entered();
13 let now = Instant::now();
14 self.trigger_cancellation();
15 let elapsed = now.elapsed();
16 tracing::trace!("apply_change {:?}", change);
17 change.apply(self);
18 elapsed
19 }
20
21 // Feature: Memory Usage
22 //
23 // Clears rust-analyzer's internal database and prints memory usage statistics.
24 //
25 // | Editor | Action Name |
26 // |---------|-------------|
27 // | VS Code | **rust-analyzer: Memory Usage (Clears Database)**
28
29 // 
30 pub fn per_query_memory_usage(&mut self) -> Vec<(String, Bytes, usize)> {
31 let mut acc: Vec<(String, Bytes, usize)> = vec![];
32
33 // fn collect_query_count<'q, Q>(table: &QueryTable<'q, Q>) -> usize
34 // where
35 // QueryTable<'q, Q>: DebugQueryTable,
36 // Q: Query,
37 // <Q as Query>::Storage: 'q,
38 // {
39 // struct EntryCounter(usize);
40 // impl<K, V> FromIterator<TableEntry<K, V>> for EntryCounter {
41 // fn from_iter<T>(iter: T) -> EntryCounter
42 // where
43 // T: IntoIterator<Item = TableEntry<K, V>>,
44 // {
45 // EntryCounter(iter.into_iter().count())
46 // }
47 // }
48 // table.entries::<EntryCounter>().0
49 // }
50
51 macro_rules! purge_each_query {
52 ($($q:path)*) => {$(
53 let before = memory_usage().allocated;
54 let table = $q.in_db(self);
55 let count = collect_query_count(&table);
56 table.purge();
57 let after = memory_usage().allocated;
58 let q: $q = Default::default();
59 let name = format!("{:?}", q);
60 acc.push((name, before - after, count));
61 )*}
62 }
63 purge_each_query![
64 // // SymbolsDatabase
65 // crate::symbol_index::ModuleSymbolsQuery
66 // crate::symbol_index::LibrarySymbolsQuery
67 // crate::symbol_index::LocalRootsQuery
68 // crate::symbol_index::LibraryRootsQuery
69 // // HirDatabase
70 // hir::db::AdtDatumQuery
71 // hir::db::AdtVarianceQuery
72 // hir::db::AssociatedTyDataQuery
73 // hir::db::AssociatedTyValueQuery
74 // hir::db::BorrowckQuery
75 // hir::db::CallableItemSignatureQuery
76 // hir::db::ConstEvalDiscriminantQuery
77 // hir::db::ConstEvalQuery
78 // hir::db::ConstEvalStaticQuery
79 // hir::db::ConstParamTyQuery
80 // hir::db::DynCompatibilityOfTraitQuery
81 // hir::db::FieldTypesQuery
82 // hir::db::FnDefDatumQuery
83 // hir::db::FnDefVarianceQuery
84 // hir::db::GenericDefaultsQuery
85 // hir::db::GenericPredicatesForParamQuery
86 // hir::db::GenericPredicatesQuery
87 // hir::db::GenericPredicatesWithoutParentQuery
88 // hir::db::ImplDatumQuery
89 // hir::db::ImplSelfTyQuery
90 // hir::db::ImplTraitQuery
91 // hir::db::IncoherentInherentImplCratesQuery
92 // hir::db::InferQuery
93 // hir::db::InherentImplsInBlockQuery
94 // hir::db::InherentImplsInCrateQuery
95 // hir::db::InternCallableDefQuery
96 // hir::db::InternClosureQuery
97 // hir::db::InternCoroutineQuery
98 // hir::db::InternImplTraitIdQuery
99 // hir::db::InternLifetimeParamIdQuery
100 // hir::db::InternTypeOrConstParamIdQuery
101 // hir::db::LayoutOfAdtQuery
102 // hir::db::LayoutOfTyQuery
103 // hir::db::LookupImplMethodQuery
104 // hir::db::MirBodyForClosureQuery
105 // hir::db::MirBodyQuery
106 // hir::db::MonomorphizedMirBodyForClosureQuery
107 // hir::db::MonomorphizedMirBodyQuery
108 // hir::db::ProgramClausesForChalkEnvQuery
109 // hir::db::ReturnTypeImplTraitsQuery
110 // hir::db::TargetDataLayoutQuery
111 // hir::db::TraitDatumQuery
112 // hir::db::TraitEnvironmentQuery
113 // hir::db::TraitImplsInBlockQuery
114 // hir::db::TraitImplsInCrateQuery
115 // hir::db::TraitImplsInDepsQuery
116 // hir::db::TraitSolveQuery
117 // hir::db::TyQuery
118 // hir::db::TypeAliasImplTraitsQuery
119 // hir::db::ValueTyQuery
120
121 // // InternDatabase
122 // hir::db::InternFunctionQuery
123 // hir::db::InternStructQuery
124 // hir::db::InternUnionQuery
125 // hir::db::InternEnumQuery
126 // hir::db::InternConstQuery
127 // hir::db::InternStaticQuery
128 // hir::db::InternTraitQuery
129 // hir::db::InternTraitAliasQuery
130 // hir::db::InternTypeAliasQuery
131 // hir::db::InternImplQuery
132 // hir::db::InternExternBlockQuery
133 // hir::db::InternBlockQuery
134 // hir::db::InternMacro2Query
135 // hir::db::InternProcMacroQuery
136 // hir::db::InternMacroRulesQuery
137
138 // // LineIndexDatabase
139 // crate::LineIndexQuery
140
141 // // SourceDatabase
142 // base_db::ParseQuery
143 // base_db::ParseErrorsQuery
144 // base_db::AllCratesQuery
145 // base_db::InternUniqueCrateDataQuery
146 // base_db::InternUniqueCrateDataLookupQuery
147 // base_db::CrateDataQuery
148 // base_db::ExtraCrateDataQuery
149 // base_db::CrateCfgQuery
150 // base_db::CrateEnvQuery
151 // base_db::CrateWorkspaceDataQuery
152
153 // // SourceDatabaseExt
154 // base_db::FileTextQuery
155 // base_db::CompressedFileTextQuery
156 // base_db::FileSourceRootQuery
157 // base_db::SourceRootQuery
158 // base_db::SourceRootCratesQuery
159 ];
160
161 acc.sort_by_key(|it| std::cmp::Reverse(it.1));
162 acc
163 }
164}