mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2025-10-29 02:52:11 +00:00
fix: Fix sourceroot construction for virtual manifests
This commit is contained in:
parent
b707b5a117
commit
ab46e97188
7 changed files with 75 additions and 75 deletions
|
|
@ -33,6 +33,7 @@ pub struct CargoWorkspace {
|
|||
workspace_root: AbsPathBuf,
|
||||
target_directory: AbsPathBuf,
|
||||
manifest_path: ManifestPath,
|
||||
is_virtual_workspace: bool,
|
||||
}
|
||||
|
||||
impl ops::Index<Package> for CargoWorkspace {
|
||||
|
|
@ -384,13 +385,20 @@ impl CargoWorkspace {
|
|||
.with_context(|| format!("Failed to run `{:?}`", meta.cargo_command()))
|
||||
}
|
||||
|
||||
pub fn new(mut meta: cargo_metadata::Metadata, manifest_path: ManifestPath) -> CargoWorkspace {
|
||||
pub fn new(
|
||||
mut meta: cargo_metadata::Metadata,
|
||||
ws_manifest_path: ManifestPath,
|
||||
) -> CargoWorkspace {
|
||||
let mut pkg_by_id = FxHashMap::default();
|
||||
let mut packages = Arena::default();
|
||||
let mut targets = Arena::default();
|
||||
|
||||
let ws_members = &meta.workspace_members;
|
||||
|
||||
let workspace_root = AbsPathBuf::assert(meta.workspace_root);
|
||||
let target_directory = AbsPathBuf::assert(meta.target_directory);
|
||||
let mut is_virtual_workspace = true;
|
||||
|
||||
meta.packages.sort_by(|a, b| a.id.cmp(&b.id));
|
||||
for meta_pkg in meta.packages {
|
||||
let cargo_metadata::Package {
|
||||
|
|
@ -429,12 +437,13 @@ impl CargoWorkspace {
|
|||
let is_local = source.is_none();
|
||||
let is_member = ws_members.contains(&id);
|
||||
|
||||
let manifest = AbsPathBuf::assert(manifest_path);
|
||||
let manifest = ManifestPath::try_from(AbsPathBuf::assert(manifest_path)).unwrap();
|
||||
is_virtual_workspace &= manifest != ws_manifest_path;
|
||||
let pkg = packages.alloc(PackageData {
|
||||
id: id.repr.clone(),
|
||||
name,
|
||||
version,
|
||||
manifest: manifest.clone().try_into().unwrap(),
|
||||
manifest: manifest.clone(),
|
||||
targets: Vec::new(),
|
||||
is_local,
|
||||
is_member,
|
||||
|
|
@ -468,7 +477,7 @@ impl CargoWorkspace {
|
|||
// modified manifest file into a special target dir which is then used as
|
||||
// the source path. We don't want that, we want the original here so map it
|
||||
// back
|
||||
manifest.clone()
|
||||
manifest.clone().into()
|
||||
} else {
|
||||
AbsPathBuf::assert(src_path)
|
||||
},
|
||||
|
|
@ -493,11 +502,14 @@ impl CargoWorkspace {
|
|||
packages[source].active_features.extend(node.features);
|
||||
}
|
||||
|
||||
let workspace_root = AbsPathBuf::assert(meta.workspace_root);
|
||||
|
||||
let target_directory = AbsPathBuf::assert(meta.target_directory);
|
||||
|
||||
CargoWorkspace { packages, targets, workspace_root, target_directory, manifest_path }
|
||||
CargoWorkspace {
|
||||
packages,
|
||||
targets,
|
||||
workspace_root,
|
||||
target_directory,
|
||||
manifest_path: ws_manifest_path,
|
||||
is_virtual_workspace,
|
||||
}
|
||||
}
|
||||
|
||||
pub fn packages(&self) -> impl ExactSizeIterator<Item = Package> + '_ {
|
||||
|
|
@ -579,6 +591,10 @@ impl CargoWorkspace {
|
|||
fn is_unique(&self, name: &str) -> bool {
|
||||
self.packages.iter().filter(|(_, v)| v.name == name).count() == 1
|
||||
}
|
||||
|
||||
pub fn is_virtual_workspace(&self) -> bool {
|
||||
self.is_virtual_workspace
|
||||
}
|
||||
}
|
||||
|
||||
fn find_list_of_build_targets(
|
||||
|
|
|
|||
|
|
@ -29,6 +29,12 @@ impl TryFrom<AbsPathBuf> for ManifestPath {
|
|||
}
|
||||
}
|
||||
|
||||
impl From<ManifestPath> for AbsPathBuf {
|
||||
fn from(it: ManifestPath) -> Self {
|
||||
it.file
|
||||
}
|
||||
}
|
||||
|
||||
impl ManifestPath {
|
||||
// Shadow `parent` from `Deref`.
|
||||
pub fn parent(&self) -> &AbsPath {
|
||||
|
|
|
|||
|
|
@ -11,8 +11,9 @@ use base_db::{
|
|||
};
|
||||
use cfg::{CfgAtom, CfgDiff, CfgOptions};
|
||||
use intern::{sym, Symbol};
|
||||
use itertools::Itertools;
|
||||
use paths::{AbsPath, AbsPathBuf};
|
||||
use rustc_hash::{FxHashMap, FxHashSet};
|
||||
use rustc_hash::FxHashMap;
|
||||
use semver::Version;
|
||||
use span::{Edition, FileId};
|
||||
use toolchain::Tool;
|
||||
|
|
@ -41,7 +42,9 @@ pub type FileLoader<'a> = &'a mut dyn for<'b> FnMut(&'b AbsPath) -> Option<FileI
|
|||
pub struct PackageRoot {
|
||||
/// Is from the local filesystem and may be edited
|
||||
pub is_local: bool,
|
||||
/// Directories to include
|
||||
pub include: Vec<AbsPathBuf>,
|
||||
/// Directories to exclude
|
||||
pub exclude: Vec<AbsPathBuf>,
|
||||
}
|
||||
|
||||
|
|
@ -553,17 +556,6 @@ impl ProjectWorkspace {
|
|||
}
|
||||
}
|
||||
|
||||
pub fn buildfiles(&self) -> Vec<AbsPathBuf> {
|
||||
match &self.kind {
|
||||
ProjectWorkspaceKind::Json(project) => project
|
||||
.crates()
|
||||
.filter_map(|(_, krate)| krate.build.as_ref().map(|build| build.build_file.clone()))
|
||||
.map(|build_file| self.workspace_root().join(build_file))
|
||||
.collect(),
|
||||
_ => vec![],
|
||||
}
|
||||
}
|
||||
|
||||
pub fn find_sysroot_proc_macro_srv(&self) -> anyhow::Result<AbsPathBuf> {
|
||||
self.sysroot.discover_proc_macro_srv()
|
||||
}
|
||||
|
|
@ -608,15 +600,25 @@ impl ProjectWorkspace {
|
|||
match &self.kind {
|
||||
ProjectWorkspaceKind::Json(project) => project
|
||||
.crates()
|
||||
.map(|(_, krate)| PackageRoot {
|
||||
is_local: krate.is_workspace_member,
|
||||
include: krate.include.clone(),
|
||||
exclude: krate.exclude.clone(),
|
||||
.map(|(_, krate)| {
|
||||
let build_files = project
|
||||
.crates()
|
||||
.filter_map(|(_, krate)| {
|
||||
krate.build.as_ref().map(|build| build.build_file.clone())
|
||||
})
|
||||
// FIXME: PackageRoots dont allow specifying files, only directories
|
||||
.filter_map(|build_file| {
|
||||
self.workspace_root().join(build_file).parent().map(ToOwned::to_owned)
|
||||
});
|
||||
PackageRoot {
|
||||
is_local: krate.is_workspace_member,
|
||||
include: krate.include.iter().cloned().chain(build_files).collect(),
|
||||
exclude: krate.exclude.clone(),
|
||||
}
|
||||
})
|
||||
.collect::<FxHashSet<_>>()
|
||||
.into_iter()
|
||||
.chain(mk_sysroot())
|
||||
.collect::<Vec<_>>(),
|
||||
.unique()
|
||||
.collect(),
|
||||
ProjectWorkspaceKind::Cargo {
|
||||
cargo,
|
||||
rustc,
|
||||
|
|
@ -671,6 +673,11 @@ impl ProjectWorkspace {
|
|||
exclude: Vec::new(),
|
||||
})
|
||||
}))
|
||||
.chain(cargo.is_virtual_workspace().then(|| PackageRoot {
|
||||
is_local: true,
|
||||
include: vec![cargo.workspace_root().to_path_buf()],
|
||||
exclude: Vec::new(),
|
||||
}))
|
||||
.collect()
|
||||
}
|
||||
ProjectWorkspaceKind::DetachedFile { file, cargo: cargo_script, .. } => {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue