From 684b6fa1b8cd41b03ba485084690f78991820645 Mon Sep 17 00:00:00 2001
From: Clemens Wasser <clemens.wasser@gmail.com>
Date: Tue, 9 Jun 2020 21:47:54 +0200
Subject: [PATCH] flycheck now uses the configured features

---
 crates/ra_flycheck/src/lib.rs      | 24 +++++++++++++++++++++---
 crates/rust-analyzer/src/config.rs |  4 +++-
 2 files changed, 24 insertions(+), 4 deletions(-)

diff --git a/crates/ra_flycheck/src/lib.rs b/crates/ra_flycheck/src/lib.rs
index 041e38a9ff4..6c41705298b 100644
--- a/crates/ra_flycheck/src/lib.rs
+++ b/crates/ra_flycheck/src/lib.rs
@@ -18,8 +18,17 @@ pub use cargo_metadata::diagnostic::{
 
 #[derive(Clone, Debug, PartialEq, Eq)]
 pub enum FlycheckConfig {
-    CargoCommand { command: String, all_targets: bool, all_features: bool, extra_args: Vec<String> },
-    CustomCommand { command: String, args: Vec<String> },
+    CargoCommand {
+        command: String,
+        all_targets: bool,
+        all_features: bool,
+        features: Vec<String>,
+        extra_args: Vec<String>,
+    },
+    CustomCommand {
+        command: String,
+        args: Vec<String>,
+    },
 }
 
 /// Flycheck wraps the shared state and communication machinery used for
@@ -188,7 +197,13 @@ impl FlycheckThread {
         self.check_process = None;
 
         let mut cmd = match &self.config {
-            FlycheckConfig::CargoCommand { command, all_targets, all_features, extra_args } => {
+            FlycheckConfig::CargoCommand {
+                command,
+                all_targets,
+                all_features,
+                extra_args,
+                features,
+            } => {
                 let mut cmd = Command::new(ra_toolchain::cargo());
                 cmd.arg(command);
                 cmd.args(&["--workspace", "--message-format=json", "--manifest-path"])
@@ -198,6 +213,9 @@ impl FlycheckThread {
                 }
                 if *all_features {
                     cmd.arg("--all-features");
+                } else if !features.is_empty() {
+                    cmd.arg("--features");
+                    cmd.arg(features.join(" "));
                 }
                 cmd.args(extra_args);
                 cmd
diff --git a/crates/rust-analyzer/src/config.rs b/crates/rust-analyzer/src/config.rs
index 17671f89ee4..5d5f7d66a79 100644
--- a/crates/rust-analyzer/src/config.rs
+++ b/crates/rust-analyzer/src/config.rs
@@ -147,6 +147,7 @@ impl Default for Config {
                 all_targets: true,
                 all_features: false,
                 extra_args: Vec::new(),
+                features: Vec::new(),
             }),
 
             inlay_hints: InlayHintsConfig {
@@ -234,13 +235,14 @@ impl Config {
                 }
                 // otherwise configure command customizations
                 _ => {
-                    if let Some(FlycheckConfig::CargoCommand { command, extra_args, all_targets, all_features })
+                    if let Some(FlycheckConfig::CargoCommand { command, extra_args, all_targets, all_features, features })
                         = &mut self.check
                     {
                         set(value, "/checkOnSave/extraArgs", extra_args);
                         set(value, "/checkOnSave/command", command);
                         set(value, "/checkOnSave/allTargets", all_targets);
                         set(value, "/checkOnSave/allFeatures", all_features);
+                        *features = self.cargo.features.clone();
                     }
                 }
             };