Read rust-analyzer.toml files on startup

This commit is contained in:
Ali Bektas 2024-07-22 02:42:39 +02:00
parent 4afe0d5393
commit e0db833082
3 changed files with 40 additions and 8 deletions

View file

@ -15,7 +15,9 @@ use ide_db::{
}; };
use itertools::Itertools; use itertools::Itertools;
use proc_macro_api::{MacroDylib, ProcMacroServer}; 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 span::Span;
use vfs::{file_set::FileSetConfig, loader::Handle, AbsPath, AbsPathBuf, VfsPath}; 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 // register the workspace manifest as well, note that this currently causes duplicates for
// non-virtual cargo workspaces! We ought to fix that // non-virtual cargo workspaces! We ought to fix that
for manifest in workspaces.iter().filter_map(|ws| ws.manifest().map(ManifestPath::as_ref)) { for ws in workspaces.iter() {
let file_set_roots: Vec<VfsPath> = vec![VfsPath::from(manifest.to_owned())]; let mut file_set_roots: Vec<VfsPath> = 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()); // In case of detached files we do **not** look for a rust-analyzer.toml.
res.load.push(entry); if !matches!(ws.kind, ProjectWorkspaceKind::DetachedFile { .. }) {
local_filesets.push(fsc.len() as u64); let ws_root = ws.workspace_root();
fsc.add_file_set(file_set_roots) 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(); let fsc = fsc.build();

View file

@ -291,6 +291,11 @@ impl ProjectJson {
self.manifest.as_ref().map_or(&self.project_root, |manifest| manifest.as_ref()) 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] { pub fn runnables(&self) -> &[Runnable] {
&self.runnables &self.runnables
} }

View file

@ -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> { pub fn manifest(&self) -> Option<&ManifestPath> {
match &self.kind { match &self.kind {
ProjectWorkspaceKind::Cargo { cargo, .. } => Some(cargo.manifest_path()), ProjectWorkspaceKind::Cargo { cargo, .. } => Some(cargo.manifest_path()),