Unnamed repository; edit this file 'description' to name the repository.
Auto merge of #17661 - alibektas:read_ratoml_on_startup, r=Veykril
minor: Read workspace root ratomls on startup
bors 2024-07-24
parent eb5da56 · parent af88940 · commit fbfda1b
-rw-r--r--crates/load-cargo/src/lib.rs37
-rw-r--r--crates/project-model/src/project_json.rs5
-rw-r--r--crates/project-model/src/workspace.rs8
3 files changed, 42 insertions, 8 deletions
diff --git a/crates/load-cargo/src/lib.rs b/crates/load-cargo/src/lib.rs
index 0f1ca0369e..9ad5c68a55 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,34 @@ 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<VfsPath> = vec![VfsPath::from(manifest.to_owned())];
+ for ws in workspaces.iter() {
+ let mut file_set_roots: Vec<VfsPath> = vec![];
+ let mut entries = vec![];
- 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());
+ }
- 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();
+ let ratoml_path = {
+ let mut p = ws_root.to_path_buf();
+ p.push("rust-analyzer.toml");
+ p
+ };
+ file_set_roots.push(VfsPath::from(ratoml_path.to_owned()));
+ entries.push(ratoml_path.to_owned());
+ }
+
+ if !file_set_roots.is_empty() {
+ 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()),