diff --git a/crates/base-db/src/input.rs b/crates/base-db/src/input.rs index c43941d6ac1..3a8c0c385a4 100644 --- a/crates/base-db/src/input.rs +++ b/crates/base-db/src/input.rs @@ -17,7 +17,7 @@ use vfs::{file_set::FileSet, AbsPathBuf, AnchoredPath, FileId, VfsPath}; // Map from crate id to the name of the crate and path of the proc-macro. If the value is `None`, // then the crate for the proc-macro hasn't been build yet as the build data is missing. -pub type ProcMacroPaths = FxHashMap, AbsPathBuf)>>; +pub type ProcMacroPaths = FxHashMap, AbsPathBuf), String>>; pub type ProcMacros = FxHashMap; /// Files are grouped into source roots. A source root is a directory on the diff --git a/crates/project-model/src/workspace.rs b/crates/project-model/src/workspace.rs index 199fa1e5c2c..a6f1453582b 100644 --- a/crates/project-model/src/workspace.rs +++ b/crates/project-model/src/workspace.rs @@ -667,6 +667,14 @@ impl ProjectWorkspace { _ => false, } } + + /// Returns `true` if the project workspace is [`Json`]. + /// + /// [`Json`]: ProjectWorkspace::Json + #[must_use] + pub fn is_json(&self) -> bool { + matches!(self, Self::Json { .. }) + } } fn project_json_to_crate_graph( @@ -678,7 +686,7 @@ fn project_json_to_crate_graph( target_layout: TargetLayoutLoadResult, ) -> (CrateGraph, ProcMacroPaths) { let mut crate_graph = CrateGraph::default(); - let mut proc_macros = FxHashMap::default(); + let mut proc_macros: ProcMacroPaths = FxHashMap::default(); let sysroot_deps = sysroot.as_ref().map(|sysroot| { sysroot_to_crate_graph( &mut crate_graph, @@ -730,13 +738,11 @@ fn project_json_to_crate_graph( ); if krate.is_proc_macro { if let Some(path) = krate.proc_macro_dylib_path.clone() { - proc_macros.insert( - crate_graph_crate_id, - Some(( - krate.display_name.as_ref().map(|it| it.canonical_name().to_owned()), - path, - )), - ); + let node = Ok(( + krate.display_name.as_ref().map(|it| it.canonical_name().to_owned()), + path, + )); + proc_macros.insert(crate_graph_crate_id, node); } } (crate_id, crate_graph_crate_id) @@ -1180,8 +1186,8 @@ fn add_target_crate_root( ); if is_proc_macro { let proc_macro = match build_data.as_ref().map(|it| it.proc_macro_dylib_path.as_ref()) { - Some(it) => it.cloned().map(|path| Some((Some(cargo_name.to_owned()), path))), - None => Some(None), + Some(it) => it.cloned().map(|path| Ok((Some(cargo_name.to_owned()), path))), + None => Some(Err("crate has not yet been build".to_owned())), }; if let Some(proc_macro) = proc_macro { proc_macros.insert(crate_id, proc_macro); diff --git a/crates/rust-analyzer/src/cli/load_cargo.rs b/crates/rust-analyzer/src/cli/load_cargo.rs index 268f59e7e4b..f644bdc7b18 100644 --- a/crates/rust-analyzer/src/cli/load_cargo.rs +++ b/crates/rust-analyzer/src/cli/load_cargo.rs @@ -102,7 +102,7 @@ pub fn load_workspace( ( crate_id, path.map_or_else( - || Err("proc macro crate is missing dylib".to_owned()), + |_| Err("proc macro crate is missing dylib".to_owned()), |(_, path)| load_proc_macro(proc_macro_server, &path, &[]), ), ) diff --git a/crates/rust-analyzer/src/reload.rs b/crates/rust-analyzer/src/reload.rs index 7b27a067062..c6bd3f0d9cc 100644 --- a/crates/rust-analyzer/src/reload.rs +++ b/crates/rust-analyzer/src/reload.rs @@ -251,7 +251,7 @@ impl GlobalState { ( crate_id, res.map_or_else( - || Err("proc macro crate is missing dylib".to_owned()), + |_| Err("proc macro crate is missing dylib".to_owned()), |(crate_name, path)| { progress(path.display().to_string()); load_proc_macro( @@ -370,7 +370,7 @@ impl GlobalState { let files_config = self.config.files(); let project_folders = ProjectFolders::new(&self.workspaces, &files_config.exclude); - if self.proc_macro_clients.is_empty() { + if self.proc_macro_clients.is_empty() || !same_workspaces { if let Some((path, path_manually_set)) = self.config.proc_macro_srv() { tracing::info!("Spawning proc-macro servers"); self.proc_macro_clients = self @@ -448,19 +448,8 @@ impl GlobalState { }; let mut change = Change::new(); - if same_workspaces { - if self.config.expand_proc_macros() { - self.fetch_proc_macros_queue.request_op(cause, proc_macro_paths); - } - } else { - // Set up errors for proc-macros upfront that we haven't run build scripts yet - let mut proc_macros = FxHashMap::default(); - for paths in proc_macro_paths { - proc_macros.extend(paths.into_iter().map(move |(crate_id, _)| { - (crate_id, Err("crate has not yet been build".to_owned())) - })); - } - change.set_proc_macros(proc_macros); + if self.config.expand_proc_macros() { + self.fetch_proc_macros_queue.request_op(cause, proc_macro_paths); } change.set_crate_graph(crate_graph); self.analysis_host.apply_change(change);