]> git.lizzy.rs Git - rust.git/blob - src/tools/rust-analyzer/crates/ide-db/src/apply_change.rs
Rollup merge of #102567 - compiler-errors:issue-102561, r=davidtwco
[rust.git] / src / tools / rust-analyzer / crates / ide-db / src / apply_change.rs
1 //! Applies changes to the IDE state transactionally.
2
3 use std::sync::Arc;
4
5 use base_db::{
6     salsa::{Database, Durability},
7     Change, SourceRootId,
8 };
9 use profile::{memory_usage, Bytes};
10 use rustc_hash::FxHashSet;
11
12 use crate::{symbol_index::SymbolsDatabase, RootDatabase};
13
14 impl 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);
18     }
19
20     pub fn apply_change(&mut self, change: Change) {
21         let _p = profile::span("RootDatabase::apply_change");
22         self.request_cancellation();
23         tracing::trace!("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);
29                 if root.is_library {
30                     library_roots.insert(root_id);
31                 } else {
32                     local_roots.insert(root_id);
33                 }
34             }
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);
37         }
38         change.apply(self);
39     }
40
41     // Feature: Memory Usage
42     //
43     // Clears rust-analyzer's internal database and prints memory usage statistics.
44     //
45     // |===
46     // | Editor  | Action Name
47     //
48     // | VS Code | **rust-analyzer: Memory Usage (Clears Database)**
49     // |===
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 {
54             ($($q:path)*) => {$(
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));
61             )*}
62         }
63         purge_each_query![
64             // SourceDatabase
65             base_db::ParseQuery
66             base_db::CrateGraphQuery
67
68             // SourceDatabaseExt
69             base_db::FileTextQuery
70             base_db::FileSourceRootQuery
71             base_db::SourceRootQuery
72             base_db::SourceRootCratesQuery
73
74             // AstDatabase
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
82
83             // DefDatabase
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
101             hir::db::BodyQuery
102             hir::db::ExprScopesQuery
103             hir::db::GenericParamsQuery
104             hir::db::AttrsQuery
105             hir::db::CrateLangItemsQuery
106             hir::db::LangItemQuery
107             hir::db::ImportMapQuery
108
109             // HirDatabase
110             hir::db::InferQueryQuery
111             hir::db::TyQuery
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::InternTypeOrConstParamIdQuery
133             hir::db::InternImplTraitIdQuery
134             hir::db::InternClosureQuery
135             hir::db::AssociatedTyValueQuery
136             hir::db::TraitSolveQueryQuery
137             hir::db::InternTypeOrConstParamIdQuery
138
139             // SymbolsDatabase
140             crate::symbol_index::ModuleSymbolsQuery
141             crate::symbol_index::LibrarySymbolsQuery
142             crate::symbol_index::LocalRootsQuery
143             crate::symbol_index::LibraryRootsQuery
144
145             // LineIndexDatabase
146             crate::LineIndexQuery
147
148             // InternDatabase
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
158         ];
159
160         acc.sort_by_key(|it| std::cmp::Reverse(it.1));
161         acc
162     }
163 }