mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2025-10-01 11:31:15 +00:00
Merge #9208
9208: minor: Populate import maps eagerly to speed up flyimports r=SomeoneToIgnore a=SomeoneToIgnore Part of #7542 Follow up of https://github.com/rust-analyzer/rust-analyzer/pull/9206#issuecomment-859097783 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>
This commit is contained in:
commit
c62ec3d998
@ -33,14 +33,15 @@ pub(crate) fn prime_caches(db: &RootDatabase, cb: &(dyn Fn(PrimeCachesProgress)
|
|||||||
// FIXME: This would be easy to parallelize, since it's in the ideal ordering for that.
|
// FIXME: This would be easy to parallelize, since it's in the ideal ordering for that.
|
||||||
// Unfortunately rayon prevents panics from propagation out of a `scope`, which breaks
|
// Unfortunately rayon prevents panics from propagation out of a `scope`, which breaks
|
||||||
// cancellation, so we cannot use rayon.
|
// cancellation, so we cannot use rayon.
|
||||||
for (i, krate) in topo.iter().enumerate() {
|
for (i, &crate_id) in topo.iter().enumerate() {
|
||||||
let crate_name = graph[*krate].display_name.as_deref().unwrap_or_default().to_string();
|
let crate_name = graph[crate_id].display_name.as_deref().unwrap_or_default().to_string();
|
||||||
|
|
||||||
cb(PrimeCachesProgress::StartedOnCrate {
|
cb(PrimeCachesProgress::StartedOnCrate {
|
||||||
on_crate: crate_name,
|
on_crate: crate_name,
|
||||||
n_done: i,
|
n_done: i,
|
||||||
n_total: topo.len(),
|
n_total: topo.len(),
|
||||||
});
|
});
|
||||||
db.crate_def_map(*krate);
|
db.crate_def_map(crate_id);
|
||||||
|
db.import_map(crate_id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -16,7 +16,6 @@ use vfs::Vfs;
|
|||||||
pub use self::{
|
pub use self::{
|
||||||
analysis_stats::AnalysisStatsCmd,
|
analysis_stats::AnalysisStatsCmd,
|
||||||
diagnostics::diagnostics,
|
diagnostics::diagnostics,
|
||||||
load_cargo::{load_workspace, load_workspace_at, LoadCargoConfig},
|
|
||||||
ssr::{apply_ssr_rules, search_for_patterns},
|
ssr::{apply_ssr_rules, search_for_patterns},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -70,6 +70,7 @@ impl AnalysisStatsCmd {
|
|||||||
load_out_dirs_from_check: self.enable_build_scripts,
|
load_out_dirs_from_check: self.enable_build_scripts,
|
||||||
wrap_rustc: false,
|
wrap_rustc: false,
|
||||||
with_proc_macro: self.enable_proc_macros,
|
with_proc_macro: self.enable_proc_macros,
|
||||||
|
prefill_caches: false,
|
||||||
};
|
};
|
||||||
let (host, vfs, _proc_macro) =
|
let (host, vfs, _proc_macro) =
|
||||||
load_workspace_at(&self.path, &cargo_config, &load_cargo_config, &|_| {})?;
|
load_workspace_at(&self.path, &cargo_config, &load_cargo_config, &|_| {})?;
|
||||||
|
@ -34,8 +34,12 @@ pub fn diagnostics(
|
|||||||
with_proc_macro: bool,
|
with_proc_macro: bool,
|
||||||
) -> Result<()> {
|
) -> Result<()> {
|
||||||
let cargo_config = Default::default();
|
let cargo_config = Default::default();
|
||||||
let load_cargo_config =
|
let load_cargo_config = LoadCargoConfig {
|
||||||
LoadCargoConfig { load_out_dirs_from_check, with_proc_macro, wrap_rustc: false };
|
load_out_dirs_from_check,
|
||||||
|
with_proc_macro,
|
||||||
|
wrap_rustc: false,
|
||||||
|
prefill_caches: false,
|
||||||
|
};
|
||||||
let (host, _vfs, _proc_macro) =
|
let (host, _vfs, _proc_macro) =
|
||||||
load_workspace_at(path, &cargo_config, &load_cargo_config, &|_| {})?;
|
load_workspace_at(path, &cargo_config, &load_cargo_config, &|_| {})?;
|
||||||
let db = host.raw_database();
|
let db = host.raw_database();
|
||||||
|
@ -14,13 +14,14 @@ use vfs::{loader::Handle, AbsPath, AbsPathBuf};
|
|||||||
|
|
||||||
use crate::reload::{ProjectFolders, SourceRootConfig};
|
use crate::reload::{ProjectFolders, SourceRootConfig};
|
||||||
|
|
||||||
pub struct LoadCargoConfig {
|
pub(crate) struct LoadCargoConfig {
|
||||||
pub load_out_dirs_from_check: bool,
|
pub(crate) load_out_dirs_from_check: bool,
|
||||||
pub wrap_rustc: bool,
|
pub(crate) wrap_rustc: bool,
|
||||||
pub with_proc_macro: bool,
|
pub(crate) with_proc_macro: bool,
|
||||||
|
pub(crate) prefill_caches: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn load_workspace_at(
|
pub(crate) fn load_workspace_at(
|
||||||
root: &Path,
|
root: &Path,
|
||||||
cargo_config: &CargoConfig,
|
cargo_config: &CargoConfig,
|
||||||
load_config: &LoadCargoConfig,
|
load_config: &LoadCargoConfig,
|
||||||
@ -33,7 +34,7 @@ pub fn load_workspace_at(
|
|||||||
load_workspace(workspace, load_config, progress)
|
load_workspace(workspace, load_config, progress)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn load_workspace(
|
fn load_workspace(
|
||||||
ws: ProjectWorkspace,
|
ws: ProjectWorkspace,
|
||||||
config: &LoadCargoConfig,
|
config: &LoadCargoConfig,
|
||||||
progress: &dyn Fn(String),
|
progress: &dyn Fn(String),
|
||||||
@ -82,6 +83,10 @@ pub fn load_workspace(
|
|||||||
log::debug!("crate graph: {:?}", crate_graph);
|
log::debug!("crate graph: {:?}", crate_graph);
|
||||||
let host =
|
let host =
|
||||||
load_crate_graph(crate_graph, project_folders.source_root_config, &mut vfs, &receiver);
|
load_crate_graph(crate_graph, project_folders.source_root_config, &mut vfs, &receiver);
|
||||||
|
|
||||||
|
if config.prefill_caches {
|
||||||
|
host.analysis().prime_caches(|_| {})?;
|
||||||
|
}
|
||||||
Ok((host, vfs, proc_macro_client))
|
Ok((host, vfs, proc_macro_client))
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -144,6 +149,7 @@ mod tests {
|
|||||||
load_out_dirs_from_check: false,
|
load_out_dirs_from_check: false,
|
||||||
wrap_rustc: false,
|
wrap_rustc: false,
|
||||||
with_proc_macro: false,
|
with_proc_macro: false,
|
||||||
|
prefill_caches: false,
|
||||||
};
|
};
|
||||||
let (host, _vfs, _proc_macro) =
|
let (host, _vfs, _proc_macro) =
|
||||||
load_workspace_at(path, &cargo_config, &load_cargo_config, &|_| {})?;
|
load_workspace_at(path, &cargo_config, &load_cargo_config, &|_| {})?;
|
||||||
|
@ -13,6 +13,7 @@ pub fn apply_ssr_rules(rules: Vec<SsrRule>) -> Result<()> {
|
|||||||
load_out_dirs_from_check: true,
|
load_out_dirs_from_check: true,
|
||||||
wrap_rustc: false,
|
wrap_rustc: false,
|
||||||
with_proc_macro: true,
|
with_proc_macro: true,
|
||||||
|
prefill_caches: false,
|
||||||
};
|
};
|
||||||
let (host, vfs, _proc_macro) =
|
let (host, vfs, _proc_macro) =
|
||||||
load_workspace_at(&std::env::current_dir()?, &cargo_config, &load_cargo_config, &|_| {})?;
|
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
|
|||||||
use ide_db::base_db::SourceDatabaseExt;
|
use ide_db::base_db::SourceDatabaseExt;
|
||||||
use ide_db::symbol_index::SymbolsDatabase;
|
use ide_db::symbol_index::SymbolsDatabase;
|
||||||
let cargo_config = Default::default();
|
let cargo_config = Default::default();
|
||||||
let load_cargo_config =
|
let load_cargo_config = LoadCargoConfig {
|
||||||
LoadCargoConfig { load_out_dirs_from_check: true, wrap_rustc: true, with_proc_macro: true };
|
load_out_dirs_from_check: true,
|
||||||
|
wrap_rustc: true,
|
||||||
|
with_proc_macro: true,
|
||||||
|
prefill_caches: false,
|
||||||
|
};
|
||||||
let (host, _vfs, _proc_macro) =
|
let (host, _vfs, _proc_macro) =
|
||||||
load_workspace_at(&std::env::current_dir()?, &cargo_config, &load_cargo_config, &|_| {})?;
|
load_workspace_at(&std::env::current_dir()?, &cargo_config, &load_cargo_config, &|_| {})?;
|
||||||
let db = host.raw_database();
|
let db = host.raw_database();
|
||||||
|
@ -37,6 +37,7 @@ fn integrated_highlighting_benchmark() {
|
|||||||
load_out_dirs_from_check: true,
|
load_out_dirs_from_check: true,
|
||||||
wrap_rustc: false,
|
wrap_rustc: false,
|
||||||
with_proc_macro: false,
|
with_proc_macro: false,
|
||||||
|
prefill_caches: false,
|
||||||
};
|
};
|
||||||
|
|
||||||
let (mut host, vfs, _proc_macro) = {
|
let (mut host, vfs, _proc_macro) = {
|
||||||
@ -91,6 +92,7 @@ fn integrated_completion_benchmark() {
|
|||||||
load_out_dirs_from_check: true,
|
load_out_dirs_from_check: true,
|
||||||
wrap_rustc: false,
|
wrap_rustc: false,
|
||||||
with_proc_macro: false,
|
with_proc_macro: false,
|
||||||
|
prefill_caches: true,
|
||||||
};
|
};
|
||||||
|
|
||||||
let (mut host, vfs, _proc_macro) = {
|
let (mut host, vfs, _proc_macro) = {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user