Skip to content

Commit c62ec3d

Browse files
Merge #9208
9208: minor: Populate import maps eagerly to speed up flyimports r=SomeoneToIgnore a=SomeoneToIgnore Part of #7542 Follow up of #9206 (comment) Reduces `import_on_the_fly @ sel` case in the `integrated_completion_benchmark` by ~300ms. Also enables cache priming for manual workspace loading to reflect the results in the benchmarks. Before: <img width="1198" alt="image" src="https://user-images.githubusercontent.com/2690773/121606148-4a734a80-ca56-11eb-812a-7955e93817f1.png"> After: <img width="1200" alt="image" src="https://user-images.githubusercontent.com/2690773/121606156-4e06d180-ca56-11eb-891b-1ed878b53d7e.png"> Co-authored-by: Kirill Bulatov <mail4score@gmail.com>
2 parents c4c1fcb + 3394481 commit c62ec3d

File tree

7 files changed

+32
-14
lines changed

7 files changed

+32
-14
lines changed

crates/ide/src/prime_caches.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,14 +33,15 @@ pub(crate) fn prime_caches(db: &RootDatabase, cb: &(dyn Fn(PrimeCachesProgress)
3333
// FIXME: This would be easy to parallelize, since it's in the ideal ordering for that.
3434
// Unfortunately rayon prevents panics from propagation out of a `scope`, which breaks
3535
// cancellation, so we cannot use rayon.
36-
for (i, krate) in topo.iter().enumerate() {
37-
let crate_name = graph[*krate].display_name.as_deref().unwrap_or_default().to_string();
36+
for (i, &crate_id) in topo.iter().enumerate() {
37+
let crate_name = graph[crate_id].display_name.as_deref().unwrap_or_default().to_string();
3838

3939
cb(PrimeCachesProgress::StartedOnCrate {
4040
on_crate: crate_name,
4141
n_done: i,
4242
n_total: topo.len(),
4343
});
44-
db.crate_def_map(*krate);
44+
db.crate_def_map(crate_id);
45+
db.import_map(crate_id);
4546
}
4647
}

crates/rust-analyzer/src/cli.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ use vfs::Vfs;
1616
pub use self::{
1717
analysis_stats::AnalysisStatsCmd,
1818
diagnostics::diagnostics,
19-
load_cargo::{load_workspace, load_workspace_at, LoadCargoConfig},
2019
ssr::{apply_ssr_rules, search_for_patterns},
2120
};
2221

crates/rust-analyzer/src/cli/analysis_stats.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ impl AnalysisStatsCmd {
7070
load_out_dirs_from_check: self.enable_build_scripts,
7171
wrap_rustc: false,
7272
with_proc_macro: self.enable_proc_macros,
73+
prefill_caches: false,
7374
};
7475
let (host, vfs, _proc_macro) =
7576
load_workspace_at(&self.path, &cargo_config, &load_cargo_config, &|_| {})?;

crates/rust-analyzer/src/cli/diagnostics.rs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,12 @@ pub fn diagnostics(
3434
with_proc_macro: bool,
3535
) -> Result<()> {
3636
let cargo_config = Default::default();
37-
let load_cargo_config =
38-
LoadCargoConfig { load_out_dirs_from_check, with_proc_macro, wrap_rustc: false };
37+
let load_cargo_config = LoadCargoConfig {
38+
load_out_dirs_from_check,
39+
with_proc_macro,
40+
wrap_rustc: false,
41+
prefill_caches: false,
42+
};
3943
let (host, _vfs, _proc_macro) =
4044
load_workspace_at(path, &cargo_config, &load_cargo_config, &|_| {})?;
4145
let db = host.raw_database();

crates/rust-analyzer/src/cli/load_cargo.rs

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,14 @@ use vfs::{loader::Handle, AbsPath, AbsPathBuf};
1414

1515
use crate::reload::{ProjectFolders, SourceRootConfig};
1616

17-
pub struct LoadCargoConfig {
18-
pub load_out_dirs_from_check: bool,
19-
pub wrap_rustc: bool,
20-
pub with_proc_macro: bool,
17+
pub(crate) struct LoadCargoConfig {
18+
pub(crate) load_out_dirs_from_check: bool,
19+
pub(crate) wrap_rustc: bool,
20+
pub(crate) with_proc_macro: bool,
21+
pub(crate) prefill_caches: bool,
2122
}
2223

23-
pub fn load_workspace_at(
24+
pub(crate) fn load_workspace_at(
2425
root: &Path,
2526
cargo_config: &CargoConfig,
2627
load_config: &LoadCargoConfig,
@@ -33,7 +34,7 @@ pub fn load_workspace_at(
3334
load_workspace(workspace, load_config, progress)
3435
}
3536

36-
pub fn load_workspace(
37+
fn load_workspace(
3738
ws: ProjectWorkspace,
3839
config: &LoadCargoConfig,
3940
progress: &dyn Fn(String),
@@ -82,6 +83,10 @@ pub fn load_workspace(
8283
log::debug!("crate graph: {:?}", crate_graph);
8384
let host =
8485
load_crate_graph(crate_graph, project_folders.source_root_config, &mut vfs, &receiver);
86+
87+
if config.prefill_caches {
88+
host.analysis().prime_caches(|_| {})?;
89+
}
8590
Ok((host, vfs, proc_macro_client))
8691
}
8792

@@ -144,6 +149,7 @@ mod tests {
144149
load_out_dirs_from_check: false,
145150
wrap_rustc: false,
146151
with_proc_macro: false,
152+
prefill_caches: false,
147153
};
148154
let (host, _vfs, _proc_macro) =
149155
load_workspace_at(path, &cargo_config, &load_cargo_config, &|_| {})?;

crates/rust-analyzer/src/cli/ssr.rs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ pub fn apply_ssr_rules(rules: Vec<SsrRule>) -> Result<()> {
1313
load_out_dirs_from_check: true,
1414
wrap_rustc: false,
1515
with_proc_macro: true,
16+
prefill_caches: false,
1617
};
1718
let (host, vfs, _proc_macro) =
1819
load_workspace_at(&std::env::current_dir()?, &cargo_config, &load_cargo_config, &|_| {})?;
@@ -39,8 +40,12 @@ pub fn search_for_patterns(patterns: Vec<SsrPattern>, debug_snippet: Option<Stri
3940
use ide_db::base_db::SourceDatabaseExt;
4041
use ide_db::symbol_index::SymbolsDatabase;
4142
let cargo_config = Default::default();
42-
let load_cargo_config =
43-
LoadCargoConfig { load_out_dirs_from_check: true, wrap_rustc: true, with_proc_macro: true };
43+
let load_cargo_config = LoadCargoConfig {
44+
load_out_dirs_from_check: true,
45+
wrap_rustc: true,
46+
with_proc_macro: true,
47+
prefill_caches: false,
48+
};
4449
let (host, _vfs, _proc_macro) =
4550
load_workspace_at(&std::env::current_dir()?, &cargo_config, &load_cargo_config, &|_| {})?;
4651
let db = host.raw_database();

crates/rust-analyzer/src/integrated_benchmarks.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ fn integrated_highlighting_benchmark() {
3737
load_out_dirs_from_check: true,
3838
wrap_rustc: false,
3939
with_proc_macro: false,
40+
prefill_caches: false,
4041
};
4142

4243
let (mut host, vfs, _proc_macro) = {
@@ -91,6 +92,7 @@ fn integrated_completion_benchmark() {
9192
load_out_dirs_from_check: true,
9293
wrap_rustc: false,
9394
with_proc_macro: false,
95+
prefill_caches: true,
9496
};
9597

9698
let (mut host, vfs, _proc_macro) = {

0 commit comments

Comments
 (0)