1 //! Applies changes to the IDE state transactionally.
6 salsa::{Database, Durability},
9 use profile::{memory_usage, Bytes};
10 use rustc_hash::FxHashSet;
12 use crate::{symbol_index::SymbolsDatabase, RootDatabase};
15 pub fn request_cancellation(&mut self) {
16 let _p = profile::span("RootDatabase::request_cancellation");
17 self.salsa_runtime_mut().synthetic_write(Durability::LOW);
20 pub fn apply_change(&mut self, change: Change) {
21 let _p = profile::span("RootDatabase::apply_change");
22 self.request_cancellation();
23 tracing::info!("apply_change {:?}", change);
24 if let Some(roots) = &change.roots {
25 let mut local_roots = FxHashSet::default();
26 let mut library_roots = FxHashSet::default();
27 for (idx, root) in roots.iter().enumerate() {
28 let root_id = SourceRootId(idx as u32);
30 library_roots.insert(root_id);
32 local_roots.insert(root_id);
35 self.set_local_roots_with_durability(Arc::new(local_roots), Durability::HIGH);
36 self.set_library_roots_with_durability(Arc::new(library_roots), Durability::HIGH);
41 // Feature: Memory Usage
43 // Clears rust-analyzer's internal database and prints memory usage statistics.
46 // | Editor | Action Name
48 // | VS Code | **Rust Analyzer: Memory Usage (Clears Database)**
50 // image::https://user-images.githubusercontent.com/48062697/113065592-08559f00-91b1-11eb-8c96-64b88068ec02.gif[]
51 pub fn per_query_memory_usage(&mut self) -> Vec<(String, Bytes)> {
52 let mut acc: Vec<(String, Bytes)> = vec![];
53 macro_rules! purge_each_query {
55 let before = memory_usage().allocated;
56 $q.in_db(self).purge();
57 let after = memory_usage().allocated;
58 let q: $q = Default::default();
59 let name = format!("{:?}", q);
60 acc.push((name, before - after));
66 base_db::CrateGraphQuery
69 base_db::FileTextQuery
70 base_db::FileSourceRootQuery
71 base_db::SourceRootQuery
72 base_db::SourceRootCratesQuery
75 hir::db::AstIdMapQuery
76 hir::db::MacroArgTextQuery
77 hir::db::MacroDefQuery
78 hir::db::ParseMacroExpansionQuery
79 hir::db::MacroExpandQuery
80 hir::db::HygieneFrameQuery
81 hir::db::InternMacroCallQuery
84 hir::db::FileItemTreeQuery
85 hir::db::BlockDefMapQuery
86 hir::db::CrateDefMapQueryQuery
87 hir::db::FieldsAttrsQuery
88 hir::db::VariantsAttrsQuery
89 hir::db::FieldsAttrsSourceMapQuery
90 hir::db::VariantsAttrsSourceMapQuery
91 hir::db::StructDataQuery
92 hir::db::UnionDataQuery
93 hir::db::EnumDataQuery
94 hir::db::ImplDataQuery
95 hir::db::TraitDataQuery
96 hir::db::TypeAliasDataQuery
97 hir::db::FunctionDataQuery
98 hir::db::ConstDataQuery
99 hir::db::StaticDataQuery
100 hir::db::BodyWithSourceMapQuery
102 hir::db::ExprScopesQuery
103 hir::db::GenericParamsQuery
105 hir::db::CrateLangItemsQuery
106 hir::db::LangItemQuery
107 hir::db::ImportMapQuery
110 hir::db::InferQueryQuery
112 hir::db::ValueTyQuery
113 hir::db::ImplSelfTyQuery
114 hir::db::ImplTraitQuery
115 hir::db::FieldTypesQuery
116 hir::db::CallableItemSignatureQuery
117 hir::db::GenericPredicatesForParamQuery
118 hir::db::GenericPredicatesQuery
119 hir::db::GenericDefaultsQuery
120 hir::db::InherentImplsInCrateQuery
121 hir::db::TraitEnvironmentQuery
122 hir::db::TraitImplsInCrateQuery
123 hir::db::TraitImplsInDepsQuery
124 hir::db::AssociatedTyDataQuery
125 hir::db::AssociatedTyDataQuery
126 hir::db::TraitDatumQuery
127 hir::db::StructDatumQuery
128 hir::db::ImplDatumQuery
129 hir::db::FnDefDatumQuery
130 hir::db::ReturnTypeImplTraitsQuery
131 hir::db::InternCallableDefQuery
132 hir::db::InternTypeParamIdQuery
133 hir::db::InternImplTraitIdQuery
134 hir::db::InternClosureQuery
135 hir::db::AssociatedTyValueQuery
136 hir::db::TraitSolveQueryQuery
137 hir::db::InternTypeParamIdQuery
140 crate::symbol_index::ModuleSymbolsQuery
141 crate::symbol_index::LibrarySymbolsQuery
142 crate::symbol_index::LocalRootsQuery
143 crate::symbol_index::LibraryRootsQuery
146 crate::LineIndexQuery
149 hir::db::InternFunctionQuery
150 hir::db::InternStructQuery
151 hir::db::InternUnionQuery
152 hir::db::InternEnumQuery
153 hir::db::InternConstQuery
154 hir::db::InternStaticQuery
155 hir::db::InternTraitQuery
156 hir::db::InternTypeAliasQuery
157 hir::db::InternImplQuery
160 acc.sort_by_key(|it| std::cmp::Reverse(it.1));