10177: fix: Treat path dependencies like workspace members r=jonas-schievink a=jonas-schievink

Closes https://github.com/rust-analyzer/rust-analyzer/issues/9070

Fixes diagnostics not showing up in path dependencies.

Co-authored-by: Jonas Schievink <jonasschievink@gmail.com>
This commit is contained in:
bors[bot] 2021-09-10 14:14:02 +00:00 committed by GitHub
commit 07fb5db3dc
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 20 additions and 20 deletions
crates
project_model/src
rust-analyzer/src

@ -135,8 +135,8 @@ pub struct PackageData {
pub manifest: ManifestPath,
/// Targets provided by the crate (lib, bin, example, test, ...)
pub targets: Vec<Target>,
/// Is this package a member of the current workspace
pub is_member: bool,
/// Does this package come from the local filesystem (and is editable)?
pub is_local: bool,
/// List of packages this package depends on
pub dependencies: Vec<PackageDependency>,
/// Rust edition for this package
@ -296,19 +296,19 @@ impl CargoWorkspace {
let mut packages = Arena::default();
let mut targets = Arena::default();
let ws_members = &meta.workspace_members;
meta.packages.sort_by(|a, b| a.id.cmp(&b.id));
for meta_pkg in &meta.packages {
let cargo_metadata::Package {
id, edition, name, manifest_path, version, metadata, ..
} = meta_pkg;
let meta = from_value::<PackageMetadata>(metadata.clone()).unwrap_or_default();
let is_member = ws_members.contains(id);
let edition = edition.parse::<Edition>().unwrap_or_else(|err| {
tracing::error!("Failed to parse edition {}", err);
Edition::CURRENT
});
// We treat packages without source as "local" packages. That includes all members of
// the current workspace, as well as any path dependency outside the workspace.
let is_local = meta_pkg.source.is_none();
let pkg = packages.alloc(PackageData {
id: id.repr.clone(),
@ -316,7 +316,7 @@ impl CargoWorkspace {
version: version.clone(),
manifest: AbsPathBuf::assert(PathBuf::from(&manifest_path)).try_into().unwrap(),
targets: Vec::new(),
is_member,
is_local,
edition,
dependencies: Vec::new(),
features: meta_pkg.features.clone().into_iter().collect(),

@ -53,8 +53,8 @@ impl CfgOverrides {
/// the current workspace.
#[derive(Debug, Clone, Eq, PartialEq, Hash)]
pub struct PackageRoot {
/// Is a member of the current workspace
pub is_member: bool,
/// Is from the local filesystem and may be edited
pub is_local: bool,
pub include: Vec<AbsPathBuf>,
pub exclude: Vec<AbsPathBuf>,
}
@ -268,7 +268,7 @@ impl ProjectWorkspace {
ProjectWorkspace::Json { project, sysroot, rustc_cfg: _ } => project
.crates()
.map(|(_, krate)| PackageRoot {
is_member: krate.is_workspace_member,
is_local: krate.is_workspace_member,
include: krate.include.clone(),
exclude: krate.exclude.clone(),
})
@ -276,7 +276,7 @@ impl ProjectWorkspace {
.into_iter()
.chain(sysroot.as_ref().into_iter().flat_map(|sysroot| {
sysroot.crates().map(move |krate| PackageRoot {
is_member: false,
is_local: false,
include: vec![sysroot[krate].root.parent().to_path_buf()],
exclude: Vec::new(),
})
@ -293,7 +293,7 @@ impl ProjectWorkspace {
cargo
.packages()
.map(|pkg| {
let is_member = cargo[pkg].is_member;
let is_local = cargo[pkg].is_local;
let pkg_root = cargo[pkg].manifest.parent().to_path_buf();
let mut include = vec![pkg_root.clone()];
@ -319,23 +319,23 @@ impl ProjectWorkspace {
include.extend(extra_targets);
let mut exclude = vec![pkg_root.join(".git")];
if is_member {
if is_local {
exclude.push(pkg_root.join("target"));
} else {
exclude.push(pkg_root.join("tests"));
exclude.push(pkg_root.join("examples"));
exclude.push(pkg_root.join("benches"));
}
PackageRoot { is_member, include, exclude }
PackageRoot { is_local, include, exclude }
})
.chain(sysroot.into_iter().map(|sysroot| PackageRoot {
is_member: false,
is_local: false,
include: vec![sysroot.root().to_path_buf()],
exclude: Vec::new(),
}))
.chain(rustc.into_iter().flat_map(|rustc| {
rustc.packages().map(move |krate| PackageRoot {
is_member: false,
is_local: false,
include: vec![rustc[krate].manifest.parent().to_path_buf()],
exclude: Vec::new(),
})
@ -345,12 +345,12 @@ impl ProjectWorkspace {
ProjectWorkspace::DetachedFiles { files, sysroot, .. } => files
.into_iter()
.map(|detached_file| PackageRoot {
is_member: true,
is_local: true,
include: vec![detached_file.clone()],
exclude: Vec::new(),
})
.chain(sysroot.crates().map(|krate| PackageRoot {
is_member: false,
is_local: false,
include: vec![sysroot[krate].root.parent().to_path_buf()],
exclude: Vec::new(),
}))

@ -294,7 +294,7 @@ impl GlobalState {
.workspaces
.iter()
.flat_map(|ws| ws.to_roots())
.filter(|it| it.is_member)
.filter(|it| it.is_local)
.flat_map(|root| {
root.include.into_iter().flat_map(|it| {
[
@ -514,12 +514,12 @@ impl ProjectFolders {
vfs::loader::Entry::Directories(dirs)
};
if root.is_member {
if root.is_local {
res.watch.push(res.load.len());
}
res.load.push(entry);
if root.is_member {
if root.is_local {
local_filesets.push(fsc.len());
}
fsc.add_file_set(file_set_roots)