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