ra_ap_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 proc_macro_processes: config.proc_macro_num_processes(),
42 };
43
44 let root = AbsPathBuf::assert_utf8(std::env::current_dir()?.join(root));
45 let root = ProjectManifest::discover_single(&root)?;
46 let workspace = ProjectWorkspace::load(root, &cargo_config, &|_| {})?;
47
48 let (db, _, _) = load_workspace(workspace, &cargo_config.extra_env, &load_cargo_config)?;
49 let elapsed = stop_watch.elapsed();
50 eprintln!(
51 "Load time: {:?}ms, memory allocated: {}MB",
52 elapsed.time.as_millis(),
53 elapsed.memory.allocated.megabytes() as u64
54 );
55
56 let threads = self.num_threads.unwrap_or_else(num_cpus::get_physical);
57 ide_db::prime_caches::parallel_prime_caches(&db, threads, &|_| ());
58
59 let elapsed = stop_watch.elapsed();
60 eprintln!(
61 "Cache priming time: {:?}ms, total memory allocated: {}MB",
62 elapsed.time.as_millis(),
63 elapsed.memory.allocated.megabytes() as u64
64 );
65
66 Ok(())
67 }
68}