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    // ![Memory Usage](https://user-images.githubusercontent.com/48062697/113065592-08559f00-91b1-11eb-8c96-64b88068ec02.gif)
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}