aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--crates/ra_flycheck/src/lib.rs24
-rw-r--r--crates/rust-analyzer/src/config.rs6
-rw-r--r--editors/code/package.json20
3 files changed, 42 insertions, 8 deletions
diff --git a/crates/ra_flycheck/src/lib.rs b/crates/ra_flycheck/src/lib.rs
index 041e38a9f..6c4170529 100644
--- a/crates/ra_flycheck/src/lib.rs
+++ b/crates/ra_flycheck/src/lib.rs
@@ -18,8 +18,17 @@ pub use cargo_metadata::diagnostic::{
18 18
19#[derive(Clone, Debug, PartialEq, Eq)] 19#[derive(Clone, Debug, PartialEq, Eq)]
20pub enum FlycheckConfig { 20pub enum FlycheckConfig {
21 CargoCommand { command: String, all_targets: bool, all_features: bool, extra_args: Vec<String> }, 21 CargoCommand {
22 CustomCommand { command: String, args: Vec<String> }, 22 command: String,
23 all_targets: bool,
24 all_features: bool,
25 features: Vec<String>,
26 extra_args: Vec<String>,
27 },
28 CustomCommand {
29 command: String,
30 args: Vec<String>,
31 },
23} 32}
24 33
25/// Flycheck wraps the shared state and communication machinery used for 34/// Flycheck wraps the shared state and communication machinery used for
@@ -188,7 +197,13 @@ impl FlycheckThread {
188 self.check_process = None; 197 self.check_process = None;
189 198
190 let mut cmd = match &self.config { 199 let mut cmd = match &self.config {
191 FlycheckConfig::CargoCommand { command, all_targets, all_features, extra_args } => { 200 FlycheckConfig::CargoCommand {
201 command,
202 all_targets,
203 all_features,
204 extra_args,
205 features,
206 } => {
192 let mut cmd = Command::new(ra_toolchain::cargo()); 207 let mut cmd = Command::new(ra_toolchain::cargo());
193 cmd.arg(command); 208 cmd.arg(command);
194 cmd.args(&["--workspace", "--message-format=json", "--manifest-path"]) 209 cmd.args(&["--workspace", "--message-format=json", "--manifest-path"])
@@ -198,6 +213,9 @@ impl FlycheckThread {
198 } 213 }
199 if *all_features { 214 if *all_features {
200 cmd.arg("--all-features"); 215 cmd.arg("--all-features");
216 } else if !features.is_empty() {
217 cmd.arg("--features");
218 cmd.arg(features.join(" "));
201 } 219 }
202 cmd.args(extra_args); 220 cmd.args(extra_args);
203 cmd 221 cmd
diff --git a/crates/rust-analyzer/src/config.rs b/crates/rust-analyzer/src/config.rs
index 17671f89e..1253db836 100644
--- a/crates/rust-analyzer/src/config.rs
+++ b/crates/rust-analyzer/src/config.rs
@@ -147,6 +147,7 @@ impl Default for Config {
147 all_targets: true, 147 all_targets: true,
148 all_features: false, 148 all_features: false,
149 extra_args: Vec::new(), 149 extra_args: Vec::new(),
150 features: Vec::new(),
150 }), 151 }),
151 152
152 inlay_hints: InlayHintsConfig { 153 inlay_hints: InlayHintsConfig {
@@ -234,13 +235,14 @@ impl Config {
234 } 235 }
235 // otherwise configure command customizations 236 // otherwise configure command customizations
236 _ => { 237 _ => {
237 if let Some(FlycheckConfig::CargoCommand { command, extra_args, all_targets, all_features }) 238 if let Some(FlycheckConfig::CargoCommand { command, extra_args, all_targets, all_features, features })
238 = &mut self.check 239 = &mut self.check
239 { 240 {
240 set(value, "/checkOnSave/extraArgs", extra_args); 241 set(value, "/checkOnSave/extraArgs", extra_args);
241 set(value, "/checkOnSave/command", command); 242 set(value, "/checkOnSave/command", command);
242 set(value, "/checkOnSave/allTargets", all_targets); 243 set(value, "/checkOnSave/allTargets", all_targets);
243 set(value, "/checkOnSave/allFeatures", all_features); 244 *all_features = get(value, "/checkOnSave/allFeatures").unwrap_or(self.cargo.all_features);
245 *features = get(value, "/checkOnSave/features").unwrap_or(self.cargo.features.clone());
244 } 246 }
245 } 247 }
246 }; 248 };
diff --git a/editors/code/package.json b/editors/code/package.json
index 779d7e1b8..e2027970d 100644
--- a/editors/code/package.json
+++ b/editors/code/package.json
@@ -318,9 +318,23 @@
318 "markdownDescription": "Check all targets and tests (will be passed as `--all-targets`)" 318 "markdownDescription": "Check all targets and tests (will be passed as `--all-targets`)"
319 }, 319 },
320 "rust-analyzer.checkOnSave.allFeatures": { 320 "rust-analyzer.checkOnSave.allFeatures": {
321 "type": "boolean", 321 "type": [
322 "default": false, 322 "null",
323 "markdownDescription": "Check with all features (will be passed as `--all-features`)" 323 "boolean"
324 ],
325 "default": null,
326 "markdownDescription": "Check with all features (will be passed as `--all-features`). Defaults to `rust-analyzer.cargo.allFeatures`."
327 },
328 "rust-analyzer.checkOnSave.features": {
329 "type": [
330 "null",
331 "array"
332 ],
333 "items": {
334 "type": "string"
335 },
336 "default": null,
337 "description": "List of features to activate. Defaults to `rust-analyzer.cargo.features`."
324 }, 338 },
325 "rust-analyzer.inlayHints.enable": { 339 "rust-analyzer.inlayHints.enable": {
326 "type": "boolean", 340 "type": "boolean",