From a6eeb75120876e968f7d5adabbc7fcd6cc000c98 Mon Sep 17 00:00:00 2001 From: Alex Macleod Date: Thu, 14 Oct 2021 15:40:57 +0100 Subject: [PATCH] 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 --- crates/project_model/src/cargo_workspace.rs | 3 +- crates/project_model/src/workspace.rs | 34 +++++++++++++-------- 2 files changed, 24 insertions(+), 13 deletions(-) diff --git a/crates/project_model/src/cargo_workspace.rs b/crates/project_model/src/cargo_workspace.rs index 739f29b014df..13ff20c8c678 100644 --- a/crates/project_model/src/cargo_workspace.rs +++ b/crates/project_model/src/cargo_workspace.rs @@ -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 { @@ -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]); diff --git a/crates/project_model/src/workspace.rs b/crates/project_model/src/workspace.rs index cb79ce08bad6..339fdfcc9be4 100644 --- a/crates/project_model/src/workspace.rs +++ b/crates/project_model/src/workspace.rs @@ -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,