Skip to content
This repository was archived by the owner on May 28, 2025. It is now read-only.

Commit fc8c513

Browse files
committed
Auto merge of rust-lang#14410 - Veykril:query-lru-capacities, r=Veykril
internal: Add config to specifiy lru capacities for all queries Might help figuring out what queries should be limited by LRU by default, as currently we only limit `parse`, `parse_macro_expansion` and `macro_expand`.
2 parents b915eb3 + 5616d91 commit fc8c513

File tree

8 files changed

+202
-9
lines changed

8 files changed

+202
-9
lines changed

crates/hir-def/src/attr.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ impl Attrs {
8888
db: &dyn DefDatabase,
8989
e: EnumId,
9090
) -> Arc<ArenaMap<LocalEnumVariantId, Attrs>> {
91+
let _p = profile::span("variants_attrs_query");
9192
// FIXME: There should be some proper form of mapping between item tree enum variant ids and hir enum variant ids
9293
let mut res = ArenaMap::default();
9394

@@ -114,6 +115,7 @@ impl Attrs {
114115
db: &dyn DefDatabase,
115116
v: VariantId,
116117
) -> Arc<ArenaMap<LocalFieldId, Attrs>> {
118+
let _p = profile::span("fields_attrs_query");
117119
// FIXME: There should be some proper form of mapping between item tree field ids and hir field ids
118120
let mut res = ArenaMap::default();
119121

@@ -253,6 +255,7 @@ impl Attrs {
253255

254256
impl AttrsWithOwner {
255257
pub(crate) fn attrs_query(db: &dyn DefDatabase, def: AttrDefId) -> Self {
258+
let _p = profile::span("attrs_query");
256259
// FIXME: this should use `Trace` to avoid duplication in `source_map` below
257260
let raw_attrs = match def {
258261
AttrDefId::ModuleId(module) => {

crates/ide-db/src/lib.rs

Lines changed: 161 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -141,16 +141,175 @@ impl RootDatabase {
141141
db.set_local_roots_with_durability(Default::default(), Durability::HIGH);
142142
db.set_library_roots_with_durability(Default::default(), Durability::HIGH);
143143
db.set_enable_proc_attr_macros(false);
144-
db.update_lru_capacity(lru_capacity);
144+
db.update_parse_query_lru_capacity(lru_capacity);
145145
db
146146
}
147147

148-
pub fn update_lru_capacity(&mut self, lru_capacity: Option<usize>) {
148+
pub fn update_parse_query_lru_capacity(&mut self, lru_capacity: Option<usize>) {
149149
let lru_capacity = lru_capacity.unwrap_or(base_db::DEFAULT_LRU_CAP);
150150
base_db::ParseQuery.in_db_mut(self).set_lru_capacity(lru_capacity);
151151
hir::db::ParseMacroExpansionQuery.in_db_mut(self).set_lru_capacity(lru_capacity);
152152
hir::db::MacroExpandQuery.in_db_mut(self).set_lru_capacity(lru_capacity);
153153
}
154+
155+
pub fn update_lru_capacities(&mut self, lru_capacities: &FxHashMap<Box<str>, usize>) {
156+
use hir::db as hir_db;
157+
158+
base_db::ParseQuery.in_db_mut(self).set_lru_capacity(
159+
lru_capacities.get(stringify!(ParseQuery)).copied().unwrap_or(base_db::DEFAULT_LRU_CAP),
160+
);
161+
hir_db::ParseMacroExpansionQuery.in_db_mut(self).set_lru_capacity(
162+
lru_capacities
163+
.get(stringify!(ParseMacroExpansionQuery))
164+
.copied()
165+
.unwrap_or(base_db::DEFAULT_LRU_CAP),
166+
);
167+
hir_db::MacroExpandQuery.in_db_mut(self).set_lru_capacity(
168+
lru_capacities
169+
.get(stringify!(MacroExpandQuery))
170+
.copied()
171+
.unwrap_or(base_db::DEFAULT_LRU_CAP),
172+
);
173+
174+
macro_rules! update_lru_capacity_per_query {
175+
($( $module:ident :: $query:ident )*) => {$(
176+
if let Some(&cap) = lru_capacities.get(stringify!($query)) {
177+
$module::$query.in_db_mut(self).set_lru_capacity(cap);
178+
}
179+
)*}
180+
}
181+
update_lru_capacity_per_query![
182+
// SourceDatabase
183+
// base_db::ParseQuery
184+
// base_db::CrateGraphQuery
185+
// base_db::ProcMacrosQuery
186+
187+
// SourceDatabaseExt
188+
// base_db::FileTextQuery
189+
// base_db::FileSourceRootQuery
190+
// base_db::SourceRootQuery
191+
base_db::SourceRootCratesQuery
192+
193+
// ExpandDatabase
194+
hir_db::AstIdMapQuery
195+
// hir_db::ParseMacroExpansionQuery
196+
// hir_db::InternMacroCallQuery
197+
hir_db::MacroArgTextQuery
198+
hir_db::MacroDefQuery
199+
// hir_db::MacroExpandQuery
200+
hir_db::ExpandProcMacroQuery
201+
hir_db::MacroExpandErrorQuery
202+
hir_db::HygieneFrameQuery
203+
204+
// DefDatabase
205+
hir_db::FileItemTreeQuery
206+
hir_db::CrateDefMapQueryQuery
207+
hir_db::BlockDefMapQuery
208+
hir_db::StructDataQuery
209+
hir_db::StructDataWithDiagnosticsQuery
210+
hir_db::UnionDataQuery
211+
hir_db::UnionDataWithDiagnosticsQuery
212+
hir_db::EnumDataQuery
213+
hir_db::EnumDataWithDiagnosticsQuery
214+
hir_db::ImplDataQuery
215+
hir_db::ImplDataWithDiagnosticsQuery
216+
hir_db::TraitDataQuery
217+
hir_db::TraitDataWithDiagnosticsQuery
218+
hir_db::TraitAliasDataQuery
219+
hir_db::TypeAliasDataQuery
220+
hir_db::FunctionDataQuery
221+
hir_db::ConstDataQuery
222+
hir_db::StaticDataQuery
223+
hir_db::Macro2DataQuery
224+
hir_db::MacroRulesDataQuery
225+
hir_db::ProcMacroDataQuery
226+
hir_db::BodyWithSourceMapQuery
227+
hir_db::BodyQuery
228+
hir_db::ExprScopesQuery
229+
hir_db::GenericParamsQuery
230+
hir_db::VariantsAttrsQuery
231+
hir_db::FieldsAttrsQuery
232+
hir_db::VariantsAttrsSourceMapQuery
233+
hir_db::FieldsAttrsSourceMapQuery
234+
hir_db::AttrsQuery
235+
hir_db::CrateLangItemsQuery
236+
hir_db::LangItemQuery
237+
hir_db::ImportMapQuery
238+
hir_db::FieldVisibilitiesQuery
239+
hir_db::FunctionVisibilityQuery
240+
hir_db::ConstVisibilityQuery
241+
hir_db::CrateSupportsNoStdQuery
242+
243+
// HirDatabase
244+
hir_db::InferQueryQuery
245+
hir_db::MirBodyQuery
246+
hir_db::BorrowckQuery
247+
hir_db::TyQuery
248+
hir_db::ValueTyQuery
249+
hir_db::ImplSelfTyQuery
250+
hir_db::ConstParamTyQuery
251+
hir_db::ConstEvalQuery
252+
hir_db::ConstEvalDiscriminantQuery
253+
hir_db::ImplTraitQuery
254+
hir_db::FieldTypesQuery
255+
hir_db::LayoutOfAdtQuery
256+
hir_db::TargetDataLayoutQuery
257+
hir_db::CallableItemSignatureQuery
258+
hir_db::ReturnTypeImplTraitsQuery
259+
hir_db::GenericPredicatesForParamQuery
260+
hir_db::GenericPredicatesQuery
261+
hir_db::TraitEnvironmentQuery
262+
hir_db::GenericDefaultsQuery
263+
hir_db::InherentImplsInCrateQuery
264+
hir_db::InherentImplsInBlockQuery
265+
hir_db::IncoherentInherentImplCratesQuery
266+
hir_db::TraitImplsInCrateQuery
267+
hir_db::TraitImplsInBlockQuery
268+
hir_db::TraitImplsInDepsQuery
269+
// hir_db::InternCallableDefQuery
270+
// hir_db::InternLifetimeParamIdQuery
271+
// hir_db::InternImplTraitIdQuery
272+
// hir_db::InternTypeOrConstParamIdQuery
273+
// hir_db::InternClosureQuery
274+
// hir_db::InternGeneratorQuery
275+
hir_db::AssociatedTyDataQuery
276+
hir_db::TraitDatumQuery
277+
hir_db::StructDatumQuery
278+
hir_db::ImplDatumQuery
279+
hir_db::FnDefDatumQuery
280+
hir_db::FnDefVarianceQuery
281+
hir_db::AdtVarianceQuery
282+
hir_db::AssociatedTyValueQuery
283+
hir_db::TraitSolveQueryQuery
284+
hir_db::ProgramClausesForChalkEnvQuery
285+
286+
// SymbolsDatabase
287+
symbol_index::ModuleSymbolsQuery
288+
symbol_index::LibrarySymbolsQuery
289+
// symbol_index::LocalRootsQuery
290+
// symbol_index::LibraryRootsQuery
291+
292+
// LineIndexDatabase
293+
crate::LineIndexQuery
294+
295+
// InternDatabase
296+
// hir_db::InternFunctionQuery
297+
// hir_db::InternStructQuery
298+
// hir_db::InternUnionQuery
299+
// hir_db::InternEnumQuery
300+
// hir_db::InternConstQuery
301+
// hir_db::InternStaticQuery
302+
// hir_db::InternTraitQuery
303+
// hir_db::InternTraitAliasQuery
304+
// hir_db::InternTypeAliasQuery
305+
// hir_db::InternImplQuery
306+
// hir_db::InternExternBlockQuery
307+
// hir_db::InternBlockQuery
308+
// hir_db::InternMacro2Query
309+
// hir_db::InternProcMacroQuery
310+
// hir_db::InternMacroRulesQuery
311+
];
312+
}
154313
}
155314

156315
impl salsa::ParallelDatabase for RootDatabase {

crates/ide/src/lib.rs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ use ide_db::{
6767
salsa::{self, ParallelDatabase},
6868
CrateOrigin, Env, FileLoader, FileSet, SourceDatabase, VfsPath,
6969
},
70-
symbol_index, LineIndexDatabase,
70+
symbol_index, FxHashMap, LineIndexDatabase,
7171
};
7272
use syntax::SourceFile;
7373

@@ -154,7 +154,11 @@ impl AnalysisHost {
154154
}
155155

156156
pub fn update_lru_capacity(&mut self, lru_capacity: Option<usize>) {
157-
self.db.update_lru_capacity(lru_capacity);
157+
self.db.update_parse_query_lru_capacity(lru_capacity);
158+
}
159+
160+
pub fn update_lru_capacities(&mut self, lru_capacities: &FxHashMap<Box<str>, usize>) {
161+
self.db.update_lru_capacities(lru_capacities);
158162
}
159163

160164
/// Returns a snapshot of the current state, which you can query for

crates/rust-analyzer/src/config.rs

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
//! configure the server itself, feature flags are passed into analysis, and
88
//! tweak things like automatic insertion of `()` in completions.
99
10-
use std::{fmt, iter, path::PathBuf};
10+
use std::{fmt, iter, ops::Not, path::PathBuf};
1111

1212
use flycheck::FlycheckConfig;
1313
use ide::{
@@ -418,6 +418,8 @@ config_data! {
418418

419419
/// Number of syntax trees rust-analyzer keeps in memory. Defaults to 128.
420420
lru_capacity: Option<usize> = "null",
421+
/// Sets the LRU capacity of the specified queries.
422+
lru_query_capacities: FxHashMap<Box<str>, usize> = "{}",
421423

422424
/// Whether to show `can't find Cargo.toml` error message.
423425
notifications_cargoTomlNotFound: bool = "true",
@@ -1085,10 +1087,14 @@ impl Config {
10851087
extra_env
10861088
}
10871089

1088-
pub fn lru_capacity(&self) -> Option<usize> {
1090+
pub fn lru_parse_query_capacity(&self) -> Option<usize> {
10891091
self.data.lru_capacity
10901092
}
10911093

1094+
pub fn lru_query_capacities(&self) -> Option<&FxHashMap<Box<str>, usize>> {
1095+
self.data.lru_query_capacities.is_empty().not().then(|| &self.data.lru_query_capacities)
1096+
}
1097+
10921098
pub fn proc_macro_srv(&self) -> Option<(AbsPathBuf, /* is path explicitly set */ bool)> {
10931099
if !self.data.procMacro_enable {
10941100
return None;
@@ -2024,6 +2030,9 @@ fn field_props(field: &str, ty: &str, doc: &[&str], default: &str) -> serde_json
20242030
"FxHashMap<String, String>" => set! {
20252031
"type": "object",
20262032
},
2033+
"FxHashMap<Box<str>, usize>" => set! {
2034+
"type": "object",
2035+
},
20272036
"Option<usize>" => set! {
20282037
"type": ["null", "integer"],
20292038
"minimum": 0,

crates/rust-analyzer/src/global_state.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,10 @@ impl GlobalState {
141141
Handle { handle, receiver }
142142
};
143143

144-
let analysis_host = AnalysisHost::new(config.lru_capacity());
144+
let mut analysis_host = AnalysisHost::new(config.lru_parse_query_capacity());
145+
if let Some(capacities) = config.lru_query_capacities() {
146+
analysis_host.update_lru_capacities(capacities);
147+
}
145148
let (flycheck_sender, flycheck_receiver) = unbounded();
146149
let mut this = GlobalState {
147150
sender,

crates/rust-analyzer/src/reload.rs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,8 +74,13 @@ impl GlobalState {
7474
pub(crate) fn update_configuration(&mut self, config: Config) {
7575
let _p = profile::span("GlobalState::update_configuration");
7676
let old_config = mem::replace(&mut self.config, Arc::new(config));
77-
if self.config.lru_capacity() != old_config.lru_capacity() {
78-
self.analysis_host.update_lru_capacity(self.config.lru_capacity());
77+
if self.config.lru_parse_query_capacity() != old_config.lru_parse_query_capacity() {
78+
self.analysis_host.update_lru_capacity(self.config.lru_parse_query_capacity());
79+
}
80+
if self.config.lru_query_capacities() != old_config.lru_query_capacities() {
81+
self.analysis_host.update_lru_capacities(
82+
&self.config.lru_query_capacities().cloned().unwrap_or_default(),
83+
);
7984
}
8085
if self.config.linked_projects() != old_config.linked_projects() {
8186
self.fetch_workspaces_queue.request_op("linked projects changed".to_string(), ())

docs/user/generated_config.adoc

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -639,6 +639,11 @@ Elements must be paths pointing to `Cargo.toml`,
639639
--
640640
Number of syntax trees rust-analyzer keeps in memory. Defaults to 128.
641641
--
642+
[[rust-analyzer.lru.query.capacities]]rust-analyzer.lru.query.capacities (default: `{}`)::
643+
+
644+
--
645+
Sets the LRU capacity of the specified queries.
646+
--
642647
[[rust-analyzer.notifications.cargoTomlNotFound]]rust-analyzer.notifications.cargoTomlNotFound (default: `true`)::
643648
+
644649
--

editors/code/package.json

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1252,6 +1252,11 @@
12521252
],
12531253
"minimum": 0
12541254
},
1255+
"rust-analyzer.lru.query.capacities": {
1256+
"markdownDescription": "Sets the LRU capacity of the specified queries.",
1257+
"default": {},
1258+
"type": "object"
1259+
},
12551260
"rust-analyzer.notifications.cargoTomlNotFound": {
12561261
"markdownDescription": "Whether to show `can't find Cargo.toml` error message.",
12571262
"default": true,

0 commit comments

Comments
 (0)