diff --git a/crates/flycheck/src/lib.rs b/crates/flycheck/src/lib.rs index ad376ad185..7c38f5ef9d 100644 --- a/crates/flycheck/src/lib.rs +++ b/crates/flycheck/src/lib.rs @@ -24,6 +24,7 @@ pub enum FlycheckConfig { command: String, target_triple: Option, all_targets: bool, + no_default_features: bool, all_features: bool, features: Vec, extra_args: Vec, @@ -180,6 +181,7 @@ impl FlycheckActor { FlycheckConfig::CargoCommand { command, target_triple, + no_default_features, all_targets, all_features, extra_args, @@ -198,9 +200,14 @@ impl FlycheckActor { } if *all_features { cmd.arg("--all-features"); - } else if !features.is_empty() { - cmd.arg("--features"); - cmd.arg(features.join(" ")); + } else { + if *no_default_features { + cmd.arg("--no-default-features"); + } + if !features.is_empty() { + cmd.arg("--features"); + cmd.arg(features.join(" ")); + } } cmd.args(extra_args); cmd diff --git a/crates/ra_project_model/src/cargo_workspace.rs b/crates/ra_project_model/src/cargo_workspace.rs index fb88e0f066..10513542e2 100644 --- a/crates/ra_project_model/src/cargo_workspace.rs +++ b/crates/ra_project_model/src/cargo_workspace.rs @@ -144,12 +144,15 @@ impl CargoWorkspace { meta.manifest_path(cargo_toml.to_path_buf()); if cargo_features.all_features { meta.features(CargoOpt::AllFeatures); - } else if cargo_features.no_default_features { - // FIXME: `NoDefaultFeatures` is mutual exclusive with `SomeFeatures` - // https://github.com/oli-obk/cargo_metadata/issues/79 - meta.features(CargoOpt::NoDefaultFeatures); - } else if !cargo_features.features.is_empty() { - meta.features(CargoOpt::SomeFeatures(cargo_features.features.clone())); + } else { + if cargo_features.no_default_features { + // FIXME: `NoDefaultFeatures` is mutual exclusive with `SomeFeatures` + // https://github.com/oli-obk/cargo_metadata/issues/79 + meta.features(CargoOpt::NoDefaultFeatures); + } + if !cargo_features.features.is_empty() { + meta.features(CargoOpt::SomeFeatures(cargo_features.features.clone())); + } } if let Some(parent) = cargo_toml.parent() { meta.current_dir(parent.to_path_buf()); @@ -289,12 +292,16 @@ pub fn load_extern_resources( cmd.args(&["check", "--message-format=json", "--manifest-path"]).arg(cargo_toml); if cargo_features.all_features { cmd.arg("--all-features"); - } else if cargo_features.no_default_features { - // FIXME: `NoDefaultFeatures` is mutual exclusive with `SomeFeatures` - // https://github.com/oli-obk/cargo_metadata/issues/79 - cmd.arg("--no-default-features"); } else { - cmd.args(&cargo_features.features); + if cargo_features.no_default_features { + // FIXME: `NoDefaultFeatures` is mutual exclusive with `SomeFeatures` + // https://github.com/oli-obk/cargo_metadata/issues/79 + cmd.arg("--no-default-features"); + } + if !cargo_features.features.is_empty() { + cmd.arg("--features"); + cmd.arg(cargo_features.features.join(" ")); + } } let output = cmd.output()?; diff --git a/crates/rust-analyzer/src/config.rs b/crates/rust-analyzer/src/config.rs index e11c8b909a..70b4512d0b 100644 --- a/crates/rust-analyzer/src/config.rs +++ b/crates/rust-analyzer/src/config.rs @@ -151,6 +151,7 @@ impl Config { flycheck: Some(FlycheckConfig::CargoCommand { command: "check".to_string(), target_triple: None, + no_default_features: false, all_targets: true, all_features: false, extra_args: Vec::new(), @@ -234,6 +235,9 @@ impl Config { command: data.checkOnSave_command, target_triple: data.checkOnSave_target.or(data.cargo_target), all_targets: data.checkOnSave_allTargets, + no_default_features: data + .checkOnSave_noDefaultFeatures + .unwrap_or(data.cargo_noDefaultFeatures), all_features: data.checkOnSave_allFeatures.unwrap_or(data.cargo_allFeatures), features: data.checkOnSave_features.unwrap_or(data.cargo_features), extra_args: data.checkOnSave_extraArgs, @@ -398,6 +402,7 @@ config_data! { checkOnSave_allFeatures: Option = None, checkOnSave_allTargets: bool = true, checkOnSave_command: String = "check".into(), + checkOnSave_noDefaultFeatures: Option = None, checkOnSave_target: Option = None, checkOnSave_extraArgs: Vec = Vec::new(), checkOnSave_features: Option> = None, diff --git a/editors/code/package.json b/editors/code/package.json index 658c913fdb..1adf055d0c 100644 --- a/editors/code/package.json +++ b/editors/code/package.json @@ -323,6 +323,14 @@ "default": true, "markdownDescription": "Check all targets and tests (will be passed as `--all-targets`)" }, + "rust-analyzer.checkOnSave.noDefaultFeatures": { + "type": [ + "null", + "boolean" + ], + "default": null, + "markdownDescription": "Do not activate the `default` feature" + }, "rust-analyzer.checkOnSave.allFeatures": { "type": [ "null",