diff --git a/crates/ide/src/runnables.rs b/crates/ide/src/runnables.rs index 83e5c5ab1dfe..707b1c8bdbf0 100644 --- a/crates/ide/src/runnables.rs +++ b/crates/ide/src/runnables.rs @@ -43,15 +43,21 @@ pub enum TestId { Path(String), } -impl fmt::Display for TestId { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { +impl TestId { + pub fn as_str(&self) -> &str { match self { - TestId::Name(name) => name.fmt(f), - TestId::Path(path) => path.fmt(f), + Self::Name(n) => n, + Self::Path(p) => p, } } } +impl fmt::Display for TestId { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.write_str(self.as_str()) + } +} + #[derive(Debug, Clone, Hash, PartialEq, Eq)] pub enum RunnableKind { TestMod { path: String }, diff --git a/crates/rust-analyzer/src/target_spec.rs b/crates/rust-analyzer/src/target_spec.rs index 7132e09146eb..cba06d41109a 100644 --- a/crates/rust-analyzer/src/target_spec.rs +++ b/crates/rust-analyzer/src/target_spec.rs @@ -70,34 +70,32 @@ pub(crate) struct ProjectJsonTargetSpec { impl ProjectJsonTargetSpec { pub(crate) fn runnable_args(&self, kind: &RunnableKind) -> Option { match kind { - RunnableKind::Bin => { - for runnable in &self.shell_runnables { - if matches!(runnable.kind, project_model::project_json::RunnableKind::Run) { - return Some(runnable.clone()); - } - } - - None - } - RunnableKind::Test { test_id, .. } => { - for runnable in &self.shell_runnables { - if matches!(runnable.kind, project_model::project_json::RunnableKind::TestOne) { - let mut runnable = runnable.clone(); - - let replaced_args: Vec<_> = runnable - .args - .iter() - .map(|arg| arg.replace("{test_id}", &test_id.to_string())) - .map(|arg| arg.replace("{label}", &self.label)) - .collect(); - runnable.args = replaced_args; - - return Some(runnable); - } - } - - None - } + RunnableKind::Bin => self + .shell_runnables + .iter() + .find(|r| matches!(r.kind, project_model::project_json::RunnableKind::Run)) + .cloned() + .map(|mut runnable| { + runnable.args.iter_mut().for_each(|arg| { + *arg = arg.replace("{label}", &self.label); + }); + + runnable + }), + RunnableKind::Test { test_id, .. } => self + .shell_runnables + .iter() + .find(|r| matches!(r.kind, project_model::project_json::RunnableKind::TestOne)) + .cloned() + .map(|mut runnable| { + runnable.args.iter_mut().for_each(|arg| { + *arg = arg + .replace("{label}", &self.label) + .replace("{test_id}", test_id.as_str()); + }); + + runnable + }), RunnableKind::TestMod { .. } => None, RunnableKind::Bench { .. } => None, RunnableKind::DocTest { .. } => None,