Merge #10177
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:
commit
07fb5db3dc
crates
@ -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)
|
||||
|
Loading…
x
Reference in New Issue
Block a user