Use workspace cargo to fetch rust source's metadata

Previously the detected cargo is the global one, as it uses the
directory of the rust source which doesn't pick up the local override

This fixes the case in clippy where the local rust toolchain is a recent
nightly that has a 2021 edition Cargo.toml. The global (stable) cargo
returns an error attempting to parse it

Fixes #10445
This commit is contained in:
Alex Macleod 2021-10-14 15:40:57 +01:00
parent a30941e2a5
commit a6eeb75120
2 changed files with 24 additions and 13 deletions

View File

@ -251,6 +251,7 @@ struct PackageMetadata {
impl CargoWorkspace {
pub fn fetch_metadata(
cargo_toml: &ManifestPath,
current_dir: &AbsPath,
config: &CargoConfig,
progress: &dyn Fn(String),
) -> Result<cargo_metadata::Metadata> {
@ -275,7 +276,7 @@ impl CargoWorkspace {
meta.features(CargoOpt::SomeFeatures(config.features.clone()));
}
}
meta.current_dir(cargo_toml.parent().as_os_str());
meta.current_dir(current_dir.as_os_str());
if let Some(target) = target {
meta.other_options(vec![String::from("--filter-platform"), target]);

View File

@ -160,14 +160,19 @@ impl ProjectWorkspace {
cmd
})?;
let meta = CargoWorkspace::fetch_metadata(&cargo_toml, config, progress)
.with_context(|| {
format!(
"Failed to read Cargo metadata from Cargo.toml file {}, {}",
cargo_toml.display(),
cargo_version
)
})?;
let meta = CargoWorkspace::fetch_metadata(
&cargo_toml,
cargo_toml.parent(),
config,
progress,
)
.with_context(|| {
format!(
"Failed to read Cargo metadata from Cargo.toml file {}, {}",
cargo_toml.display(),
cargo_version
)
})?;
let cargo = CargoWorkspace::new(meta);
let sysroot = if config.no_sysroot {
@ -189,10 +194,15 @@ impl ProjectWorkspace {
let rustc = match rustc_dir {
Some(rustc_dir) => Some({
let meta = CargoWorkspace::fetch_metadata(&rustc_dir, config, progress)
.with_context(|| {
"Failed to read Cargo metadata for Rust sources".to_string()
})?;
let meta = CargoWorkspace::fetch_metadata(
&rustc_dir,
cargo_toml.parent(),
config,
progress,
)
.with_context(|| {
"Failed to read Cargo metadata for Rust sources".to_string()
})?;
CargoWorkspace::new(meta)
}),
None => None,