Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Apply cargo flags in test explorer #17016

Merged
merged 1 commit into from
Apr 5, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
84 changes: 42 additions & 42 deletions crates/flycheck/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -41,19 +41,50 @@ pub enum InvocationLocation {
Workspace,
}

#[derive(Clone, Debug, PartialEq, Eq)]
pub struct CargoOptions {
pub target_triples: Vec<String>,
pub all_targets: bool,
pub no_default_features: bool,
pub all_features: bool,
pub features: Vec<String>,
pub extra_args: Vec<String>,
pub extra_env: FxHashMap<String, String>,
pub target_dir: Option<Utf8PathBuf>,
}

impl CargoOptions {
fn apply_on_command(&self, cmd: &mut Command) {
for target in &self.target_triples {
cmd.args(["--target", target.as_str()]);
}
if self.all_targets {
cmd.arg("--all-targets");
}
if self.all_features {
cmd.arg("--all-features");
} else {
if self.no_default_features {
cmd.arg("--no-default-features");
}
if !self.features.is_empty() {
cmd.arg("--features");
cmd.arg(self.features.join(" "));
}
}
if let Some(target_dir) = &self.target_dir {
cmd.arg("--target-dir").arg(target_dir);
}
cmd.envs(&self.extra_env);
}
}

#[derive(Clone, Debug, PartialEq, Eq)]
pub enum FlycheckConfig {
CargoCommand {
command: String,
target_triples: Vec<String>,
all_targets: bool,
no_default_features: bool,
all_features: bool,
features: Vec<String>,
extra_args: Vec<String>,
extra_env: FxHashMap<String, String>,
options: CargoOptions,
ansi_color_output: bool,
target_dir: Option<Utf8PathBuf>,
},
CustomCommand {
command: String,
Expand Down Expand Up @@ -332,18 +363,7 @@ impl FlycheckActor {
saved_file: Option<&AbsPath>,
) -> Option<Command> {
let (mut cmd, args) = match &self.config {
FlycheckConfig::CargoCommand {
command,
target_triples,
no_default_features,
all_targets,
all_features,
extra_args,
features,
extra_env,
ansi_color_output,
target_dir,
} => {
FlycheckConfig::CargoCommand { command, options, ansi_color_output } => {
let mut cmd = Command::new(Tool::Cargo.path());
if let Some(sysroot_root) = &self.sysroot_root {
cmd.env("RUSTUP_TOOLCHAIN", AsRef::<std::path::Path>::as_ref(sysroot_root));
Expand All @@ -365,28 +385,8 @@ impl FlycheckActor {
cmd.arg("--manifest-path");
cmd.arg(self.root.join("Cargo.toml"));

for target in target_triples {
cmd.args(["--target", target.as_str()]);
}
if *all_targets {
cmd.arg("--all-targets");
}
if *all_features {
cmd.arg("--all-features");
} else {
if *no_default_features {
cmd.arg("--no-default-features");
}
if !features.is_empty() {
cmd.arg("--features");
cmd.arg(features.join(" "));
}
}
if let Some(target_dir) = target_dir {
cmd.arg("--target-dir").arg(target_dir);
}
cmd.envs(extra_env);
(cmd, extra_args.clone())
options.apply_on_command(&mut cmd);
(cmd, options.extra_args.clone())
}
FlycheckConfig::CustomCommand {
command,
Expand Down
8 changes: 6 additions & 2 deletions crates/flycheck/src/test_runner.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,10 @@ use crossbeam_channel::Receiver;
use serde::Deserialize;
use toolchain::Tool;

use crate::command::{CommandHandle, ParseFromLine};
use crate::{
command::{CommandHandle, ParseFromLine},
CargoOptions,
};

#[derive(Debug, Deserialize)]
#[serde(tag = "event", rename_all = "camelCase")]
Expand Down Expand Up @@ -58,13 +61,14 @@ pub struct CargoTestHandle {
// cargo test --workspace --no-fail-fast -- module::func -Z unstable-options --format=json

impl CargoTestHandle {
pub fn new(path: Option<&str>) -> std::io::Result<Self> {
pub fn new(path: Option<&str>, options: CargoOptions) -> std::io::Result<Self> {
let mut cmd = Command::new(Tool::Cargo.path());
cmd.env("RUSTC_BOOTSTRAP", "1");
cmd.arg("test");
cmd.arg("--workspace");
// --no-fail-fast is needed to ensure that all requested tests will run
cmd.arg("--no-fail-fast");
options.apply_on_command(&mut cmd);
cmd.arg("--");
if let Some(path) = path {
cmd.arg(path);
Expand Down
84 changes: 51 additions & 33 deletions crates/rust-analyzer/src/config.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
use std::{fmt, iter, ops::Not};

use cfg::{CfgAtom, CfgDiff};
use flycheck::FlycheckConfig;
use flycheck::{CargoOptions, FlycheckConfig};
use ide::{
AssistConfig, CallableSnippets, CompletionConfig, DiagnosticsConfig, ExprFillDefaultMode,
HighlightConfig, HighlightRelatedConfig, HoverConfig, HoverDocFormat, InlayFieldsToResolve,
Expand Down Expand Up @@ -1364,6 +1364,22 @@ impl Config {
self.data.check_workspace
}

pub fn cargo_test_options(&self) -> CargoOptions {
CargoOptions {
target_triples: self.data.cargo_target.clone().into_iter().collect(),
all_targets: false,
no_default_features: self.data.cargo_noDefaultFeatures,
all_features: matches!(self.data.cargo_features, CargoFeaturesDef::All),
features: match self.data.cargo_features.clone() {
CargoFeaturesDef::All => vec![],
CargoFeaturesDef::Selected(it) => it,
},
extra_args: self.extra_args().clone(),
extra_env: self.extra_env().clone(),
target_dir: self.target_dir_from_config(),
}
}

pub fn flycheck(&self) -> FlycheckConfig {
match &self.data.check_overrideCommand {
Some(args) if !args.is_empty() => {
Expand All @@ -1389,37 +1405,39 @@ impl Config {
}
Some(_) | None => FlycheckConfig::CargoCommand {
command: self.data.check_command.clone(),
target_triples: self
.data
.check_targets
.clone()
.and_then(|targets| match &targets.0[..] {
[] => None,
targets => Some(targets.into()),
})
.unwrap_or_else(|| self.data.cargo_target.clone().into_iter().collect()),
all_targets: self.data.check_allTargets.unwrap_or(self.data.cargo_allTargets),
no_default_features: self
.data
.check_noDefaultFeatures
.unwrap_or(self.data.cargo_noDefaultFeatures),
all_features: matches!(
self.data.check_features.as_ref().unwrap_or(&self.data.cargo_features),
CargoFeaturesDef::All
),
features: match self
.data
.check_features
.clone()
.unwrap_or_else(|| self.data.cargo_features.clone())
{
CargoFeaturesDef::All => vec![],
CargoFeaturesDef::Selected(it) => it,
options: CargoOptions {
target_triples: self
.data
.check_targets
.clone()
.and_then(|targets| match &targets.0[..] {
[] => None,
targets => Some(targets.into()),
})
.unwrap_or_else(|| self.data.cargo_target.clone().into_iter().collect()),
all_targets: self.data.check_allTargets.unwrap_or(self.data.cargo_allTargets),
no_default_features: self
.data
.check_noDefaultFeatures
.unwrap_or(self.data.cargo_noDefaultFeatures),
all_features: matches!(
self.data.check_features.as_ref().unwrap_or(&self.data.cargo_features),
CargoFeaturesDef::All
),
features: match self
.data
.check_features
.clone()
.unwrap_or_else(|| self.data.cargo_features.clone())
{
CargoFeaturesDef::All => vec![],
CargoFeaturesDef::Selected(it) => it,
},
extra_args: self.check_extra_args(),
extra_env: self.check_extra_env(),
target_dir: self.target_dir_from_config(),
},
extra_args: self.check_extra_args(),
extra_env: self.check_extra_env(),
ansi_color_output: self.color_diagnostic_output(),
target_dir: self.target_dir_from_config(),
},
}
}
Expand Down Expand Up @@ -2772,7 +2790,7 @@ mod tests {
.unwrap();
assert_eq!(config.data.cargo_targetDir, None);
assert!(
matches!(config.flycheck(), FlycheckConfig::CargoCommand { target_dir, .. } if target_dir.is_none())
matches!(config.flycheck(), FlycheckConfig::CargoCommand { options, .. } if options.target_dir.is_none())
);
}

Expand All @@ -2791,7 +2809,7 @@ mod tests {
.unwrap();
assert_eq!(config.data.cargo_targetDir, Some(TargetDirectory::UseSubdirectory(true)));
assert!(
matches!(config.flycheck(), FlycheckConfig::CargoCommand { target_dir, .. } if target_dir == Some(Utf8PathBuf::from("target/rust-analyzer")))
matches!(config.flycheck(), FlycheckConfig::CargoCommand { options, .. } if options.target_dir == Some(Utf8PathBuf::from("target/rust-analyzer")))
);
}

Expand All @@ -2813,7 +2831,7 @@ mod tests {
Some(TargetDirectory::Directory(Utf8PathBuf::from("other_folder")))
);
assert!(
matches!(config.flycheck(), FlycheckConfig::CargoCommand { target_dir, .. } if target_dir == Some(Utf8PathBuf::from("other_folder")))
matches!(config.flycheck(), FlycheckConfig::CargoCommand { options, .. } if options.target_dir == Some(Utf8PathBuf::from("other_folder")))
);
}
}
6 changes: 3 additions & 3 deletions crates/rust-analyzer/src/handlers/request.rs
Original file line number Diff line number Diff line change
Expand Up @@ -220,11 +220,11 @@ pub(crate) fn handle_run_test(
None => "".to_owned(),
};
let handle = if lca.is_empty() {
flycheck::CargoTestHandle::new(None)
flycheck::CargoTestHandle::new(None, state.config.cargo_test_options())
} else if let Some((_, path)) = lca.split_once("::") {
flycheck::CargoTestHandle::new(Some(path))
flycheck::CargoTestHandle::new(Some(path), state.config.cargo_test_options())
} else {
flycheck::CargoTestHandle::new(None)
flycheck::CargoTestHandle::new(None, state.config.cargo_test_options())
};
state.test_run_session = Some(handle?);
Ok(())
Expand Down