mirror of
https://github.com/rust-lang/rust-analyzer
synced 2024-12-26 21:13:37 +00:00
Read rust-analyzer.toml files on startup
This commit is contained in:
parent
4afe0d5393
commit
e0db833082
3 changed files with 40 additions and 8 deletions
|
@ -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();
|
||||||
|
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
|
@ -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()),
|
||||||
|
|
Loading…
Reference in a new issue