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