From 8a4c35a068fa499650ecbaa34e04478129deb9c5 Mon Sep 17 00:00:00 2001 From: Jonas Schievink Date: Tue, 7 Sep 2021 17:26:21 +0200 Subject: [PATCH 1/2] Treat path dependencies like workspace members --- crates/project_model/src/cargo_workspace.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/crates/project_model/src/cargo_workspace.rs b/crates/project_model/src/cargo_workspace.rs index e942b13e474..b15c53a1303 100644 --- a/crates/project_model/src/cargo_workspace.rs +++ b/crates/project_model/src/cargo_workspace.rs @@ -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::(metadata.clone()).unwrap_or_default(); - let is_member = ws_members.contains(id); let edition = edition.parse::().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_member = meta_pkg.source.is_none(); let pkg = packages.alloc(PackageData { id: id.repr.clone(), From e241015a75ba0ae13f399ef86825ae6a6ea282a6 Mon Sep 17 00:00:00 2001 From: Jonas Schievink Date: Tue, 7 Sep 2021 17:29:58 +0200 Subject: [PATCH 2/2] Rename `is_member` to `is_local` --- crates/project_model/src/cargo_workspace.rs | 8 ++++---- crates/project_model/src/workspace.rs | 22 ++++++++++----------- crates/rust-analyzer/src/reload.rs | 6 +++--- 3 files changed, 18 insertions(+), 18 deletions(-) diff --git a/crates/project_model/src/cargo_workspace.rs b/crates/project_model/src/cargo_workspace.rs index b15c53a1303..851a264ca37 100644 --- a/crates/project_model/src/cargo_workspace.rs +++ b/crates/project_model/src/cargo_workspace.rs @@ -135,8 +135,8 @@ pub struct PackageData { pub manifest: ManifestPath, /// Targets provided by the crate (lib, bin, example, test, ...) pub targets: Vec, - /// 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, /// Rust edition for this package @@ -308,7 +308,7 @@ impl CargoWorkspace { }); // 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_member = meta_pkg.source.is_none(); + 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(), diff --git a/crates/project_model/src/workspace.rs b/crates/project_model/src/workspace.rs index a088bf3cad0..5dc2e35fdab 100644 --- a/crates/project_model/src/workspace.rs +++ b/crates/project_model/src/workspace.rs @@ -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, pub exclude: Vec, } @@ -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(), })) diff --git a/crates/rust-analyzer/src/reload.rs b/crates/rust-analyzer/src/reload.rs index 2cb5eb46b25..9e40076a590 100644 --- a/crates/rust-analyzer/src/reload.rs +++ b/crates/rust-analyzer/src/reload.rs @@ -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)