]> git.lizzy.rs Git - rust.git/blobdiff - crates/rust-analyzer/src/cli/load_cargo.rs
clippy::redudant_borrow
[rust.git] / crates / rust-analyzer / src / cli / load_cargo.rs
index 310c36904e0a0aa4a860daf32063df65f381a381..b5f5519b43ef2b856fec20c3f5548cec07c04b64 100644 (file)
@@ -4,6 +4,7 @@
 
 use anyhow::Result;
 use crossbeam_channel::{unbounded, Receiver};
+use hir::db::DefDatabase;
 use ide::{AnalysisHost, Change};
 use ide_db::base_db::CrateGraph;
 use project_model::{
 
 use crate::reload::{ProjectFolders, SourceRootConfig};
 
-pub struct LoadCargoConfig {
-    pub load_out_dirs_from_check: bool,
-    pub with_proc_macro: bool,
+pub(crate) struct LoadCargoConfig {
+    pub(crate) load_out_dirs_from_check: bool,
+    pub(crate) wrap_rustc: 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,
     cargo_config: &CargoConfig,
     load_config: &LoadCargoConfig,
@@ -31,7 +34,7 @@ pub fn load_workspace_at(
     load_workspace(workspace, load_config, progress)
 }
 
-pub fn load_workspace(
+fn load_workspace(
     ws: ProjectWorkspace,
     config: &LoadCargoConfig,
     progress: &dyn Fn(String),
@@ -52,7 +55,7 @@ pub fn load_workspace(
     };
 
     let build_data = if config.load_out_dirs_from_check {
-        let mut collector = BuildDataCollector::default();
+        let mut collector = BuildDataCollector::new(config.wrap_rustc);
         ws.collect_build_data_configs(&mut collector);
         Some(collector.collect(progress)?)
     } else {
@@ -80,6 +83,10 @@ pub fn load_workspace(
     log::debug!("crate graph: {:?}", crate_graph);
     let host =
         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))
 }
 
@@ -93,6 +100,8 @@ fn load_crate_graph(
     let mut host = AnalysisHost::new(lru_cap);
     let mut analysis_change = Change::new();
 
+    host.raw_database_mut().set_enable_proc_attr_macros(true);
+
     // wait until Vfs has loaded all roots
     for task in receiver {
         match task {
@@ -117,7 +126,7 @@ fn load_crate_graph(
             }
         }
     }
-    let source_roots = source_root_config.partition(&vfs);
+    let source_roots = source_root_config.partition(vfs);
     analysis_change.set_roots(source_roots);
 
     analysis_change.set_crate_graph(crate_graph);
@@ -136,8 +145,12 @@ mod tests {
     fn test_loading_rust_analyzer() -> Result<()> {
         let path = Path::new(env!("CARGO_MANIFEST_DIR")).parent().unwrap().parent().unwrap();
         let cargo_config = Default::default();
-        let load_cargo_config =
-            LoadCargoConfig { load_out_dirs_from_check: false, with_proc_macro: false };
+        let load_cargo_config = LoadCargoConfig {
+            load_out_dirs_from_check: false,
+            wrap_rustc: false,
+            with_proc_macro: false,
+            prefill_caches: false,
+        };
         let (host, _vfs, _proc_macro) =
             load_workspace_at(path, &cargo_config, &load_cargo_config, &|_| {})?;