diff --git a/crates/ra_project_model/src/cargo_workspace.rs b/crates/ra_project_model/src/cargo_workspace.rs index 291594e2a2cb..738fd6f610cb 100644 --- a/crates/ra_project_model/src/cargo_workspace.rs +++ b/crates/ra_project_model/src/cargo_workspace.rs @@ -75,6 +75,7 @@ pub type Target = Idx; #[derive(Debug, Clone)] pub struct PackageData { + pub id: String, pub name: String, pub manifest: PathBuf, pub targets: Vec, @@ -180,6 +181,7 @@ impl CargoWorkspace { .with_context(|| format!("Failed to parse edition {}", edition))?; let pkg = packages.alloc(PackageData { name, + id: id.to_string(), manifest: manifest_path, targets: Vec::new(), is_member, @@ -249,6 +251,18 @@ impl CargoWorkspace { pub fn workspace_root(&self) -> &Path { &self.workspace_root } + + pub fn package_flag(&self, package: &PackageData) -> String { + if self.is_unique(&*package.name) { + package.name.clone() + } else { + package.id.clone() + } + } + + fn is_unique(&self, name: &str) -> bool { + self.packages.iter().filter(|(_, v)| v.name == name).count() == 1 + } } #[derive(Debug, Clone, Default)] diff --git a/crates/rust-analyzer/src/cargo_target_spec.rs b/crates/rust-analyzer/src/cargo_target_spec.rs index f87bdcec5c4a..942c303287cf 100644 --- a/crates/rust-analyzer/src/cargo_target_spec.rs +++ b/crates/rust-analyzer/src/cargo_target_spec.rs @@ -77,7 +77,7 @@ impl CargoTargetSpec { ProjectWorkspace::Cargo { cargo, .. } => { let tgt = cargo.target_by_root(&path)?; Some(CargoTargetSpec { - package: cargo[cargo[tgt].package].name.clone(), + package: cargo.package_flag(&cargo[cargo[tgt].package]), target: cargo[tgt].name.clone(), target_kind: cargo[tgt].kind, })