ide_db/apply_change.rs
1//! Applies changes to the IDE state transactionally.
2
3use base_db::SourceRootId;
4use profile::Bytes;
5use rustc_hash::FxHashSet;
6use salsa::{Database as _, Durability};
7use triomphe::Arc;
8
9use crate::{ChangeWithProcMacros, RootDatabase, symbol_index::SymbolsDatabase};
10
11impl RootDatabase {
12 pub fn request_cancellation(&mut self) {
13 let _p = tracing::info_span!("RootDatabase::request_cancellation").entered();
14 self.synthetic_write(Durability::LOW);
15 }
16
17 pub fn apply_change(&mut self, change: ChangeWithProcMacros) {
18 let _p = tracing::info_span!("RootDatabase::apply_change").entered();
19 self.request_cancellation();
20 tracing::trace!("apply_change {:?}", change);
21 if let Some(roots) = &change.source_change.roots {
22 let mut local_roots = FxHashSet::default();
23 let mut library_roots = FxHashSet::default();
24 for (idx, root) in roots.iter().enumerate() {
25 let root_id = SourceRootId(idx as u32);
26 if root.is_library {
27 library_roots.insert(root_id);
28 } else {
29 local_roots.insert(root_id);
30 }
31 }
32 self.set_local_roots_with_durability(Arc::new(local_roots), Durability::MEDIUM);
33 self.set_library_roots_with_durability(Arc::new(library_roots), Durability::MEDIUM);
34 }
35 change.apply(self);
36 }
37
38 // Feature: Memory Usage
39 //
40 // Clears rust-analyzer's internal database and prints memory usage statistics.
41 //
42 // | Editor | Action Name |
43 // |---------|-------------|
44 // | VS Code | **rust-analyzer: Memory Usage (Clears Database)**
45
46 // 
47 pub fn per_query_memory_usage(&mut self) -> Vec<(String, Bytes, usize)> {
48 let mut acc: Vec<(String, Bytes, usize)> = vec![];
49
50 // fn collect_query_count<'q, Q>(table: &QueryTable<'q, Q>) -> usize
51 // where
52 // QueryTable<'q, Q>: DebugQueryTable,
53 // Q: Query,
54 // <Q as Query>::Storage: 'q,
55 // {
56 // struct EntryCounter(usize);
57 // impl<K, V> FromIterator<TableEntry<K, V>> for EntryCounter {
58 // fn from_iter<T>(iter: T) -> EntryCounter
59 // where
60 // T: IntoIterator<Item = TableEntry<K, V>>,
61 // {
62 // EntryCounter(iter.into_iter().count())
63 // }
64 // }
65 // table.entries::<EntryCounter>().0
66 // }
67
68 macro_rules! purge_each_query {
69 ($($q:path)*) => {$(
70 let before = memory_usage().allocated;
71 let table = $q.in_db(self);
72 let count = collect_query_count(&table);
73 table.purge();
74 let after = memory_usage().allocated;
75 let q: $q = Default::default();
76 let name = format!("{:?}", q);
77 acc.push((name, before - after, count));
78 )*}
79 }
80 purge_each_query![
81 // // SymbolsDatabase
82 // crate::symbol_index::ModuleSymbolsQuery
83 // crate::symbol_index::LibrarySymbolsQuery
84 // crate::symbol_index::LocalRootsQuery
85 // crate::symbol_index::LibraryRootsQuery
86 // // HirDatabase
87 // hir::db::AdtDatumQuery
88 // hir::db::AdtVarianceQuery
89 // hir::db::AssociatedTyDataQuery
90 // hir::db::AssociatedTyValueQuery
91 // hir::db::BorrowckQuery
92 // hir::db::CallableItemSignatureQuery
93 // hir::db::ConstEvalDiscriminantQuery
94 // hir::db::ConstEvalQuery
95 // hir::db::ConstEvalStaticQuery
96 // hir::db::ConstParamTyQuery
97 // hir::db::DynCompatibilityOfTraitQuery
98 // hir::db::FieldTypesQuery
99 // hir::db::FnDefDatumQuery
100 // hir::db::FnDefVarianceQuery
101 // hir::db::GenericDefaultsQuery
102 // hir::db::GenericPredicatesForParamQuery
103 // hir::db::GenericPredicatesQuery
104 // hir::db::GenericPredicatesWithoutParentQuery
105 // hir::db::ImplDatumQuery
106 // hir::db::ImplSelfTyQuery
107 // hir::db::ImplTraitQuery
108 // hir::db::IncoherentInherentImplCratesQuery
109 // hir::db::InferQuery
110 // hir::db::InherentImplsInBlockQuery
111 // hir::db::InherentImplsInCrateQuery
112 // hir::db::InternCallableDefQuery
113 // hir::db::InternClosureQuery
114 // hir::db::InternCoroutineQuery
115 // hir::db::InternImplTraitIdQuery
116 // hir::db::InternLifetimeParamIdQuery
117 // hir::db::InternTypeOrConstParamIdQuery
118 // hir::db::LayoutOfAdtQuery
119 // hir::db::LayoutOfTyQuery
120 // hir::db::LookupImplMethodQuery
121 // hir::db::MirBodyForClosureQuery
122 // hir::db::MirBodyQuery
123 // hir::db::MonomorphizedMirBodyForClosureQuery
124 // hir::db::MonomorphizedMirBodyQuery
125 // hir::db::ProgramClausesForChalkEnvQuery
126 // hir::db::ReturnTypeImplTraitsQuery
127 // hir::db::TargetDataLayoutQuery
128 // hir::db::TraitDatumQuery
129 // hir::db::TraitEnvironmentQuery
130 // hir::db::TraitImplsInBlockQuery
131 // hir::db::TraitImplsInCrateQuery
132 // hir::db::TraitImplsInDepsQuery
133 // hir::db::TraitSolveQuery
134 // hir::db::TyQuery
135 // hir::db::TypeAliasImplTraitsQuery
136 // hir::db::ValueTyQuery
137
138 // // DefDatabase
139 // hir::db::AttrsQuery
140 // hir::db::BlockDefMapQuery
141 // hir::db::BlockItemTreeQuery
142 // hir::db::BlockItemTreeWithSourceMapQuery
143 // hir::db::BodyQuery
144 // hir::db::BodyWithSourceMapQuery
145 // hir::db::ConstDataQuery
146 // hir::db::ConstVisibilityQuery
147 // hir::db::CrateDefMapQuery
148 // hir::db::CrateLangItemsQuery
149 // hir::db::CrateNotableTraitsQuery
150 // hir::db::CrateSupportsNoStdQuery
151 // hir::db::EnumDataQuery
152 // hir::db::ExpandProcAttrMacrosQuery
153 // hir::db::ExprScopesQuery
154 // hir::db::ExternCrateDeclDataQuery
155 // hir::db::FieldVisibilitiesQuery
156 // hir::db::FieldsAttrsQuery
157 // hir::db::FieldsAttrsSourceMapQuery
158 // hir::db::FileItemTreeQuery
159 // hir::db::FileItemTreeWithSourceMapQuery
160 // hir::db::FunctionDataQuery
161 // hir::db::FunctionVisibilityQuery
162 // hir::db::GenericParamsQuery
163 // hir::db::GenericParamsWithSourceMapQuery
164 // hir::db::ImplItemsWithDiagnosticsQuery
165 // hir::db::ImportMapQuery
166 // hir::db::IncludeMacroInvocQuery
167 // hir::db::InternAnonymousConstQuery
168 // hir::db::InternBlockQuery
169 // hir::db::InternConstQuery
170 // hir::db::InternEnumQuery
171 // hir::db::InternExternBlockQuery
172 // hir::db::InternExternCrateQuery
173 // hir::db::InternFunctionQuery
174 // hir::db::InternImplQuery
175 // hir::db::InternInTypeConstQuery
176 // hir::db::InternMacro2Query
177 // hir::db::InternMacroRulesQuery
178 // hir::db::InternProcMacroQuery
179 // hir::db::InternStaticQuery
180 // hir::db::InternStructQuery
181 // hir::db::InternTraitAliasQuery
182 // hir::db::InternTraitQuery
183 // hir::db::InternTypeAliasQuery
184 // hir::db::InternUnionQuery
185 // hir::db::InternUseQuery
186 // hir::db::LangItemQuery
187 // hir::db::Macro2DataQuery
188 // hir::db::MacroDefQuery
189 // hir::db::MacroRulesDataQuery
190 // hir::db::NotableTraitsInDepsQuery
191 // hir::db::ProcMacroDataQuery
192 // hir::db::StaticDataQuery
193 // hir::db::TraitAliasDataQuery
194 // hir::db::TraitItemsWithDiagnosticsQuery
195 // hir::db::TypeAliasDataQuery
196 // hir::db::VariantDataWithDiagnosticsQuery
197
198 // // InternDatabase
199 // hir::db::InternFunctionQuery
200 // hir::db::InternStructQuery
201 // hir::db::InternUnionQuery
202 // hir::db::InternEnumQuery
203 // hir::db::InternConstQuery
204 // hir::db::InternStaticQuery
205 // hir::db::InternTraitQuery
206 // hir::db::InternTraitAliasQuery
207 // hir::db::InternTypeAliasQuery
208 // hir::db::InternImplQuery
209 // hir::db::InternExternBlockQuery
210 // hir::db::InternBlockQuery
211 // hir::db::InternMacro2Query
212 // hir::db::InternProcMacroQuery
213 // hir::db::InternMacroRulesQuery
214
215 // // ExpandDatabase
216 // hir::db::AstIdMapQuery
217 // hir::db::DeclMacroExpanderQuery
218 // hir::db::ExpandProcMacroQuery
219 // hir::db::InternMacroCallQuery
220 // hir::db::InternSyntaxContextQuery
221 // hir::db::MacroArgQuery
222 // hir::db::ParseMacroExpansionErrorQuery
223 // hir::db::ParseMacroExpansionQuery
224 // hir::db::ProcMacroSpanQuery
225 // hir::db::ProcMacrosQuery
226 // hir::db::RealSpanMapQuery
227
228 // // LineIndexDatabase
229 // crate::LineIndexQuery
230
231 // // SourceDatabase
232 // base_db::ParseQuery
233 // base_db::ParseErrorsQuery
234 // base_db::AllCratesQuery
235 // base_db::InternUniqueCrateDataQuery
236 // base_db::InternUniqueCrateDataLookupQuery
237 // base_db::CrateDataQuery
238 // base_db::ExtraCrateDataQuery
239 // base_db::CrateCfgQuery
240 // base_db::CrateEnvQuery
241 // base_db::CrateWorkspaceDataQuery
242
243 // // SourceDatabaseExt
244 // base_db::FileTextQuery
245 // base_db::CompressedFileTextQuery
246 // base_db::FileSourceRootQuery
247 // base_db::SourceRootQuery
248 // base_db::SourceRootCratesQuery
249 ];
250
251 acc.sort_by_key(|it| std::cmp::Reverse(it.1));
252 acc
253 }
254}