From e0db833082d68ad0de061ef4248828462990589b Mon Sep 17 00:00:00 2001 From: Ali Bektas Date: Mon, 22 Jul 2024 02:42:39 +0200 Subject: [PATCH] Read rust-analyzer.toml files on startup --- crates/load-cargo/src/lib.rs | 35 ++++++++++++++++++------ crates/project-model/src/project_json.rs | 5 ++++ crates/project-model/src/workspace.rs | 8 ++++++ 3 files changed, 40 insertions(+), 8 deletions(-) diff --git a/crates/load-cargo/src/lib.rs b/crates/load-cargo/src/lib.rs index 0f1ca0369e..3310614c21 100644 --- a/crates/load-cargo/src/lib.rs +++ b/crates/load-cargo/src/lib.rs @@ -15,7 +15,9 @@ use ide_db::{ }; use itertools::Itertools; use proc_macro_api::{MacroDylib, ProcMacroServer}; -use project_model::{CargoConfig, ManifestPath, PackageRoot, ProjectManifest, ProjectWorkspace}; +use project_model::{ + CargoConfig, ManifestPath, PackageRoot, ProjectManifest, ProjectWorkspace, ProjectWorkspaceKind, +}; use span::Span; use vfs::{file_set::FileSetConfig, loader::Handle, AbsPath, AbsPathBuf, VfsPath}; @@ -238,15 +240,32 @@ impl ProjectFolders { // register the workspace manifest as well, note that this currently causes duplicates for // non-virtual cargo workspaces! We ought to fix that - for manifest in workspaces.iter().filter_map(|ws| ws.manifest().map(ManifestPath::as_ref)) { - let file_set_roots: Vec = vec![VfsPath::from(manifest.to_owned())]; + for ws in workspaces.iter() { + let mut file_set_roots: Vec = vec![]; + let mut entries = vec![]; + let mut register = false; - let entry = vfs::loader::Entry::Files(vec![manifest.to_owned()]); + if let Some(manifest) = ws.manifest().map(ManifestPath::as_ref) { + file_set_roots.push(VfsPath::from(manifest.to_owned())); + entries.push(manifest.to_owned()); + register = true; + } - res.watch.push(res.load.len()); - res.load.push(entry); - local_filesets.push(fsc.len() as u64); - fsc.add_file_set(file_set_roots) + // In case of detached files we do **not** look for a rust-analyzer.toml. + if !matches!(ws.kind, ProjectWorkspaceKind::DetachedFile { .. }) { + let ws_root = ws.workspace_root(); + file_set_roots.push(VfsPath::from(ws_root.to_owned())); + entries.push(ws_root.to_owned()); + register = true; + } + + if register { + let entry = vfs::loader::Entry::Files(entries); + res.watch.push(res.load.len()); + res.load.push(entry); + local_filesets.push(fsc.len() as u64); + fsc.add_file_set(file_set_roots) + } } let fsc = fsc.build(); diff --git a/crates/project-model/src/project_json.rs b/crates/project-model/src/project_json.rs index 421ef25a45..cf0a6ad402 100644 --- a/crates/project-model/src/project_json.rs +++ b/crates/project-model/src/project_json.rs @@ -291,6 +291,11 @@ impl ProjectJson { self.manifest.as_ref().map_or(&self.project_root, |manifest| manifest.as_ref()) } + /// Returns the path to the project's root folder. + pub fn project_root(&self) -> &AbsPath { + &self.project_root + } + pub fn runnables(&self) -> &[Runnable] { &self.runnables } diff --git a/crates/project-model/src/workspace.rs b/crates/project-model/src/workspace.rs index 8c77da8f38..bfbdf03835 100644 --- a/crates/project-model/src/workspace.rs +++ b/crates/project-model/src/workspace.rs @@ -523,6 +523,14 @@ impl ProjectWorkspace { } } + pub fn workspace_root(&self) -> &AbsPath { + match &self.kind { + ProjectWorkspaceKind::Cargo { cargo, .. } => cargo.workspace_root(), + ProjectWorkspaceKind::Json(project) => project.project_root(), + ProjectWorkspaceKind::DetachedFile { file, .. } => file.parent(), + } + } + pub fn manifest(&self) -> Option<&ManifestPath> { match &self.kind { ProjectWorkspaceKind::Cargo { cargo, .. } => Some(cargo.manifest_path()),