diff --git a/crates/rust-analyzer/src/flycheck.rs b/crates/rust-analyzer/src/flycheck.rs index aad8bece9554..3c9a8c147d92 100644 --- a/crates/rust-analyzer/src/flycheck.rs +++ b/crates/rust-analyzer/src/flycheck.rs @@ -63,7 +63,12 @@ pub(crate) enum Target { } impl CargoOptions { - pub(crate) fn apply_on_command(&self, cmd: &mut Command, ws_target_dir: Option<&Utf8Path>) { + pub(crate) fn apply_on_command( + &self, + cmd: &mut Command, + ws_target_dir: Option<&Utf8Path>, + package_repr: Option<&str>, + ) { for target in &self.target_tuples { cmd.args(["--target", target.as_str()]); } @@ -83,8 +88,24 @@ impl CargoOptions { cmd.arg("--no-default-features"); } if !self.features.is_empty() { + // If we are scoped to a particular package, filter any features of the form + // `crate/feature` which target other packages. + let features = if let Some(name) = package_repr { + let filtered = self + .features + .iter() + .filter(|f| match f.split_once('/') { + Some((c, _)) => c == name, + None => true, + }) + .map(|s| s.as_str()) + .collect::>(); + filtered.join(" ") + } else { + self.features.join(" ") + }; cmd.arg("--features"); - cmd.arg(self.features.join(" ")); + cmd.arg(features); } } if let Some(target_dir) = self.target_dir_config.target_dir(ws_target_dir) { @@ -890,12 +911,18 @@ impl FlycheckActor { cmd.env("CARGO_LOG", "cargo::core::compiler::fingerprint=info"); cmd.arg(&cargo_options.subcommand); - match scope { - FlycheckScope::Workspace => cmd.arg("--workspace"), + let package_repr = match scope { + FlycheckScope::Workspace => { + cmd.arg("--workspace"); + None + } FlycheckScope::Package { package: PackageSpecifier::Cargo { package_id }, .. - } => cmd.arg("-p").arg(&package_id.repr), + } => { + cmd.arg("-p").arg(&package_id.repr); + Some(package_id.repr.as_str()) + } FlycheckScope::Package { package: PackageSpecifier::BuildInfo { .. }, .. } => { @@ -935,6 +962,7 @@ impl FlycheckActor { cargo_options.apply_on_command( &mut cmd, self.ws_target_dir.as_ref().map(Utf8PathBuf::as_path), + package_repr, ); cmd.args(&cargo_options.extra_args); Some((cmd, FlycheckCommandOrigin::Cargo)) diff --git a/crates/rust-analyzer/src/test_runner.rs b/crates/rust-analyzer/src/test_runner.rs index 0d9c8310d858..31f35df5c796 100644 --- a/crates/rust-analyzer/src/test_runner.rs +++ b/crates/rust-analyzer/src/test_runner.rs @@ -124,7 +124,7 @@ impl CargoTestHandle { cmd.arg("--no-fail-fast"); cmd.arg("--manifest-path"); cmd.arg(root.join("Cargo.toml")); - options.apply_on_command(&mut cmd, ws_target_dir); + options.apply_on_command(&mut cmd, ws_target_dir, Some(&test_target.package)); cmd.arg("--"); if let Some(path) = path { cmd.arg(path);