|
| 1 | +use load_cargo::{LoadCargoConfig, ProcMacroServerChoice, load_workspace}; |
| 2 | +use profile::StopWatch; |
| 3 | +use project_model::{ProjectManifest, ProjectWorkspace}; |
| 4 | +use vfs::AbsPathBuf; |
| 5 | + |
| 6 | +use crate::cli::flags; |
| 7 | + |
| 8 | +impl flags::PrimeCaches { |
| 9 | + pub fn run(self) -> anyhow::Result<()> { |
| 10 | + let root = |
| 11 | + vfs::AbsPathBuf::assert_utf8(std::env::current_dir()?.join(&self.path)).normalize(); |
| 12 | + let config = crate::config::Config::new( |
| 13 | + root.clone(), |
| 14 | + lsp_types::ClientCapabilities::default(), |
| 15 | + vec![], |
| 16 | + None, |
| 17 | + ); |
| 18 | + let mut stop_watch = StopWatch::start(); |
| 19 | + |
| 20 | + let cargo_config = config.cargo(None); |
| 21 | + let with_proc_macro_server = if let Some(p) = &self.proc_macro_srv { |
| 22 | + let path = vfs::AbsPathBuf::assert_utf8(std::env::current_dir()?.join(p)); |
| 23 | + ProcMacroServerChoice::Explicit(path) |
| 24 | + } else { |
| 25 | + ProcMacroServerChoice::Sysroot |
| 26 | + }; |
| 27 | + let load_cargo_config = LoadCargoConfig { |
| 28 | + load_out_dirs_from_check: !self.disable_build_scripts, |
| 29 | + with_proc_macro_server, |
| 30 | + // while this command is nominally focused on cache priming, |
| 31 | + // we want to ensure that this command, not `load_workspace_at`, |
| 32 | + // is responsible for that work. |
| 33 | + prefill_caches: false, |
| 34 | + }; |
| 35 | + |
| 36 | + let root = AbsPathBuf::assert_utf8(std::env::current_dir()?.join(root)); |
| 37 | + let root = ProjectManifest::discover_single(&root)?; |
| 38 | + let workspace = ProjectWorkspace::load(root, &cargo_config, &|_| {})?; |
| 39 | + |
| 40 | + let (db, _, _) = load_workspace(workspace, &cargo_config.extra_env, &load_cargo_config)?; |
| 41 | + let elapsed = stop_watch.elapsed(); |
| 42 | + eprintln!( |
| 43 | + "Load time: {:?}ms, memory allocated: {}MB", |
| 44 | + elapsed.time.as_millis(), |
| 45 | + elapsed.memory.allocated.megabytes() as u64 |
| 46 | + ); |
| 47 | + |
| 48 | + let threads = if self.parallel { num_cpus::get() } else { 1 }; |
| 49 | + ide_db::prime_caches::parallel_prime_caches(&db, threads, &|_| ()); |
| 50 | + |
| 51 | + let elapsed = stop_watch.elapsed(); |
| 52 | + eprintln!( |
| 53 | + "Cache priming time: {:?}ms, total memory allocated: {}MB", |
| 54 | + elapsed.time.as_millis(), |
| 55 | + elapsed.memory.allocated.megabytes() as u64 |
| 56 | + ); |
| 57 | + |
| 58 | + Ok(()) |
| 59 | + } |
| 60 | +} |
0 commit comments