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 // // DefDatabase
122 // hir::db::AttrsQuery
123 // hir::db::BlockDefMapQuery
124 // hir::db::BlockItemTreeQuery
125 // hir::db::BlockItemTreeWithSourceMapQuery
126 // hir::db::BodyQuery
127 // hir::db::BodyWithSourceMapQuery
128 // hir::db::ConstDataQuery
129 // hir::db::ConstVisibilityQuery
130 // hir::db::CrateDefMapQuery
131 // hir::db::CrateLangItemsQuery
132 // hir::db::CrateNotableTraitsQuery
133 // hir::db::CrateSupportsNoStdQuery
134 // hir::db::EnumDataQuery
135 // hir::db::ExpandProcAttrMacrosQuery
136 // hir::db::ExprScopesQuery
137 // hir::db::ExternCrateDeclDataQuery
138 // hir::db::FieldVisibilitiesQuery
139 // hir::db::FieldsAttrsQuery
140 // hir::db::FieldsAttrsSourceMapQuery
141 // hir::db::FileItemTreeQuery
142 // hir::db::FileItemTreeWithSourceMapQuery
143 // hir::db::FunctionDataQuery
144 // hir::db::FunctionVisibilityQuery
145 // hir::db::GenericParamsQuery
146 // hir::db::GenericParamsWithSourceMapQuery
147 // hir::db::ImplItemsWithDiagnosticsQuery
148 // hir::db::ImportMapQuery
149 // hir::db::IncludeMacroInvocQuery
150 // hir::db::InternAnonymousConstQuery
151 // hir::db::InternBlockQuery
152 // hir::db::InternConstQuery
153 // hir::db::InternEnumQuery
154 // hir::db::InternExternBlockQuery
155 // hir::db::InternExternCrateQuery
156 // hir::db::InternFunctionQuery
157 // hir::db::InternImplQuery
158 // hir::db::InternInTypeConstQuery
159 // hir::db::InternMacro2Query
160 // hir::db::InternMacroRulesQuery
161 // hir::db::InternProcMacroQuery
162 // hir::db::InternStaticQuery
163 // hir::db::InternStructQuery
164 // hir::db::InternTraitAliasQuery
165 // hir::db::InternTraitQuery
166 // hir::db::InternTypeAliasQuery
167 // hir::db::InternUnionQuery
168 // hir::db::InternUseQuery
169 // hir::db::LangItemQuery
170 // hir::db::Macro2DataQuery
171 // hir::db::MacroDefQuery
172 // hir::db::MacroRulesDataQuery
173 // hir::db::NotableTraitsInDepsQuery
174 // hir::db::ProcMacroDataQuery
175 // hir::db::StaticDataQuery
176 // hir::db::TraitAliasDataQuery
177 // hir::db::TraitItemsWithDiagnosticsQuery
178 // hir::db::TypeAliasDataQuery
179 // hir::db::VariantDataWithDiagnosticsQuery
180
181 // // InternDatabase
182 // hir::db::InternFunctionQuery
183 // hir::db::InternStructQuery
184 // hir::db::InternUnionQuery
185 // hir::db::InternEnumQuery
186 // hir::db::InternConstQuery
187 // hir::db::InternStaticQuery
188 // hir::db::InternTraitQuery
189 // hir::db::InternTraitAliasQuery
190 // hir::db::InternTypeAliasQuery
191 // hir::db::InternImplQuery
192 // hir::db::InternExternBlockQuery
193 // hir::db::InternBlockQuery
194 // hir::db::InternMacro2Query
195 // hir::db::InternProcMacroQuery
196 // hir::db::InternMacroRulesQuery
197
198 // // ExpandDatabase
199 // hir::db::AstIdMapQuery
200 // hir::db::DeclMacroExpanderQuery
201 // hir::db::ExpandProcMacroQuery
202 // hir::db::InternMacroCallQuery
203 // hir::db::InternSyntaxContextQuery
204 // hir::db::MacroArgQuery
205 // hir::db::ParseMacroExpansionErrorQuery
206 // hir::db::ParseMacroExpansionQuery
207 // hir::db::ProcMacroSpanQuery
208 // hir::db::ProcMacrosQuery
209 // hir::db::RealSpanMapQuery
210
211 // // LineIndexDatabase
212 // crate::LineIndexQuery
213
214 // // SourceDatabase
215 // base_db::ParseQuery
216 // base_db::ParseErrorsQuery
217 // base_db::AllCratesQuery
218 // base_db::InternUniqueCrateDataQuery
219 // base_db::InternUniqueCrateDataLookupQuery
220 // base_db::CrateDataQuery
221 // base_db::ExtraCrateDataQuery
222 // base_db::CrateCfgQuery
223 // base_db::CrateEnvQuery
224 // base_db::CrateWorkspaceDataQuery
225
226 // // SourceDatabaseExt
227 // base_db::FileTextQuery
228 // base_db::CompressedFileTextQuery
229 // base_db::FileSourceRootQuery
230 // base_db::SourceRootQuery
231 // base_db::SourceRootCratesQuery
232 ];
233
234 acc.sort_by_key(|it| std::cmp::Reverse(it.1));
235 acc
236 }
237}