Unnamed repository; edit this file 'description' to name the repository.
Filter package-scoped features
Matt Keeter 13 days ago
parent 56dc60d · commit e702c54
-rw-r--r--crates/rust-analyzer/src/flycheck.rs38
-rw-r--r--crates/rust-analyzer/src/test_runner.rs2
2 files changed, 34 insertions, 6 deletions
diff --git a/crates/rust-analyzer/src/flycheck.rs b/crates/rust-analyzer/src/flycheck.rs
index aad8bece95..3c9a8c147d 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::<Vec<_>>();
+ 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 0d9c8310d8..31f35df5c7 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);