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