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