rust_analyzer/cli/
prime_caches.rs1use load_cargo::{LoadCargoConfig, ProcMacroServerChoice, load_workspace};
9use profile::StopWatch;
10use project_model::{ProjectManifest, ProjectWorkspace};
11use vfs::AbsPathBuf;
12
13use crate::cli::flags;
14
15impl flags::PrimeCaches {
16 pub fn run(self) -> anyhow::Result<()> {
17 let root =
18 vfs::AbsPathBuf::assert_utf8(std::env::current_dir()?.join(&self.path)).normalize();
19 let config = crate::config::Config::new(
20 root.clone(),
21 lsp_types::ClientCapabilities::default(),
22 vec![],
23 None,
24 );
25 let mut stop_watch = StopWatch::start();
26
27 let cargo_config = config.cargo(None);
28 let with_proc_macro_server = if let Some(p) = &self.proc_macro_srv {
29 let path = vfs::AbsPathBuf::assert_utf8(std::env::current_dir()?.join(p));
30 ProcMacroServerChoice::Explicit(path)
31 } else {
32 ProcMacroServerChoice::Sysroot
33 };
34 let load_cargo_config = LoadCargoConfig {
35 load_out_dirs_from_check: !self.disable_build_scripts,
36 with_proc_macro_server,
37 prefill_caches: false,
41 num_worker_threads: 1,
42 proc_macro_processes: config.proc_macro_num_processes(),
43 };
44
45 let root = AbsPathBuf::assert_utf8(std::env::current_dir()?.join(root));
46 let root = ProjectManifest::discover_single(&root)?;
47 let workspace = ProjectWorkspace::load(root, &cargo_config, &|_| {})?;
48
49 let (db, _, _) = load_workspace(workspace, &cargo_config.extra_env, &load_cargo_config)?;
50 let elapsed = stop_watch.elapsed();
51 eprintln!(
52 "Load time: {:?}ms, memory allocated: {}MB",
53 elapsed.time.as_millis(),
54 elapsed.memory.allocated.megabytes() as u64
55 );
56
57 let threads = self.num_threads.unwrap_or_else(num_cpus::get_physical);
58 ide_db::prime_caches::parallel_prime_caches(&db, threads, &|_| ());
59
60 let elapsed = stop_watch.elapsed();
61 eprintln!(
62 "Cache priming time: {:?}ms, total memory allocated: {}MB",
63 elapsed.time.as_millis(),
64 elapsed.memory.allocated.megabytes() as u64
65 );
66
67 Ok(())
68 }
69}