Skip to content

Commit

Permalink
feat: support UpdateTest in codelens
Browse files Browse the repository at this point in the history
  • Loading branch information
roife committed Dec 26, 2024
1 parent 08677cb commit 60b4ed5
Show file tree
Hide file tree
Showing 12 changed files with 204 additions and 57 deletions.
68 changes: 54 additions & 14 deletions src/tools/rust-analyzer/crates/ide/src/annotations.rs
Original file line number Diff line number Diff line change
Expand Up @@ -316,6 +316,11 @@ fn main() {
},
kind: Bin,
cfg: None,
update_test: UpdateTest {
expect_test: false,
insta: false,
snapbox: false,
},
},
),
},
Expand Down Expand Up @@ -401,6 +406,11 @@ fn main() {
},
kind: Bin,
cfg: None,
update_test: UpdateTest {
expect_test: false,
insta: false,
snapbox: false,
},
},
),
},
Expand Down Expand Up @@ -537,6 +547,11 @@ fn main() {
},
kind: Bin,
cfg: None,
update_test: UpdateTest {
expect_test: false,
insta: false,
snapbox: false,
},
},
),
},
Expand Down Expand Up @@ -597,6 +612,11 @@ fn main() {}
},
kind: Bin,
cfg: None,
update_test: UpdateTest {
expect_test: false,
insta: false,
snapbox: false,
},
},
),
},
Expand Down Expand Up @@ -709,6 +729,11 @@ fn main() {
},
kind: Bin,
cfg: None,
update_test: UpdateTest {
expect_test: false,
insta: false,
snapbox: false,
},
},
),
},
Expand Down Expand Up @@ -744,6 +769,20 @@ mod tests {
"#,
expect![[r#"
[
Annotation {
range: 3..7,
kind: HasReferences {
pos: FilePositionWrapper {
file_id: FileId(
0,
),
offset: 3,
},
data: Some(
[],
),
},
},
Annotation {
range: 3..7,
kind: Runnable(
Expand All @@ -760,23 +799,14 @@ mod tests {
},
kind: Bin,
cfg: None,
update_test: UpdateTest {
expect_test: false,
insta: false,
snapbox: false,
},
},
),
},
Annotation {
range: 3..7,
kind: HasReferences {
pos: FilePositionWrapper {
file_id: FileId(
0,
),
offset: 3,
},
data: Some(
[],
),
},
},
Annotation {
range: 18..23,
kind: Runnable(
Expand All @@ -796,6 +826,11 @@ mod tests {
path: "tests",
},
cfg: None,
update_test: UpdateTest {
expect_test: false,
insta: false,
snapbox: false,
},
},
),
},
Expand All @@ -822,6 +857,11 @@ mod tests {
},
},
cfg: None,
update_test: UpdateTest {
expect_test: false,
insta: false,
snapbox: false,
},
},
),
},
Expand Down
52 changes: 31 additions & 21 deletions src/tools/rust-analyzer/crates/ide/src/hover/tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3213,6 +3213,11 @@ fn foo_$0test() {}
},
},
cfg: None,
update_test: UpdateTest {
expect_test: false,
insta: false,
snapbox: false,
},
},
),
]
Expand All @@ -3230,28 +3235,33 @@ mod tests$0 {
}
"#,
expect![[r#"
[
Runnable(
Runnable {
use_name_in_title: false,
nav: NavigationTarget {
file_id: FileId(
0,
),
full_range: 0..46,
focus_range: 4..9,
name: "tests",
kind: Module,
description: "mod tests",
},
kind: TestMod {
path: "tests",
},
cfg: None,
[
Runnable(
Runnable {
use_name_in_title: false,
nav: NavigationTarget {
file_id: FileId(
0,
),
full_range: 0..46,
focus_range: 4..9,
name: "tests",
kind: Module,
description: "mod tests",
},
),
]
"#]],
kind: TestMod {
path: "tests",
},
cfg: None,
update_test: UpdateTest {
expect_test: false,
insta: false,
snapbox: false,
},
},
),
]
"#]],
);
}

Expand Down
10 changes: 9 additions & 1 deletion src/tools/rust-analyzer/crates/rust-analyzer/src/config.rs
Original file line number Diff line number Diff line change
Expand Up @@ -243,6 +243,9 @@ config_data! {
/// Whether to show `Run` lens. Only applies when
/// `#rust-analyzer.lens.enable#` is set.
lens_run_enable: bool = true,
/// Whether to show `Update Test` lens. Only applies when
/// `#rust-analyzer.lens.enable#` and `#rust-analyzer.lens.run.enable#` are set.
lens_update_test_enable: bool = true,

/// Disable project auto-discovery in favor of explicitly specified set
/// of projects.
Expand Down Expand Up @@ -1161,6 +1164,7 @@ pub struct LensConfig {
// runnables
pub run: bool,
pub debug: bool,
pub update_test: bool,
pub interpret: bool,

// implementations
Expand Down Expand Up @@ -1196,6 +1200,7 @@ impl LensConfig {
pub fn any(&self) -> bool {
self.run
|| self.debug
|| self.update_test
|| self.implementations
|| self.method_refs
|| self.refs_adt
Expand All @@ -1208,7 +1213,7 @@ impl LensConfig {
}

pub fn runnable(&self) -> bool {
self.run || self.debug
self.run || self.debug || self.update_test
}

pub fn references(&self) -> bool {
Expand Down Expand Up @@ -2120,6 +2125,9 @@ impl Config {
LensConfig {
run: *self.lens_enable() && *self.lens_run_enable(),
debug: *self.lens_enable() && *self.lens_debug_enable(),
update_test: *self.lens_enable()
&& *self.lens_update_test_enable()
&& *self.lens_run_enable(),
interpret: *self.lens_enable() && *self.lens_run_enable() && *self.interpret_tests(),
implementations: *self.lens_enable() && *self.lens_implementations_enable(),
method_refs: *self.lens_enable() && *self.lens_references_method_enable(),
Expand Down
12 changes: 6 additions & 6 deletions src/tools/rust-analyzer/crates/rust-analyzer/src/lsp/ext.rs
Original file line number Diff line number Diff line change
Expand Up @@ -427,14 +427,14 @@ impl Request for Runnables {
const METHOD: &'static str = "experimental/runnables";
}

#[derive(Serialize, Deserialize, Debug)]
#[derive(Serialize, Deserialize, Debug, Clone)]
#[serde(rename_all = "camelCase")]
pub struct RunnablesParams {
pub text_document: TextDocumentIdentifier,
pub position: Option<Position>,
}

#[derive(Deserialize, Serialize, Debug)]
#[derive(Deserialize, Serialize, Debug, Clone)]
#[serde(rename_all = "camelCase")]
pub struct Runnable {
pub label: String,
Expand All @@ -444,22 +444,22 @@ pub struct Runnable {
pub args: RunnableArgs,
}

#[derive(Deserialize, Serialize, Debug)]
#[derive(Deserialize, Serialize, Debug, Clone)]
#[serde(rename_all = "camelCase")]
#[serde(untagged)]
pub enum RunnableArgs {
Cargo(CargoRunnableArgs),
Shell(ShellRunnableArgs),
}

#[derive(Serialize, Deserialize, Debug)]
#[derive(Serialize, Deserialize, Debug, Clone)]
#[serde(rename_all = "lowercase")]
pub enum RunnableKind {
Cargo,
Shell,
}

#[derive(Deserialize, Serialize, Debug)]
#[derive(Deserialize, Serialize, Debug, Clone)]
#[serde(rename_all = "camelCase")]
pub struct CargoRunnableArgs {
#[serde(skip_serializing_if = "FxHashMap::is_empty")]
Expand All @@ -475,7 +475,7 @@ pub struct CargoRunnableArgs {
pub executable_args: Vec<String>,
}

#[derive(Deserialize, Serialize, Debug)]
#[derive(Deserialize, Serialize, Debug, Clone)]
#[serde(rename_all = "camelCase")]
pub struct ShellRunnableArgs {
#[serde(skip_serializing_if = "FxHashMap::is_empty")]
Expand Down
38 changes: 37 additions & 1 deletion src/tools/rust-analyzer/crates/rust-analyzer/src/lsp/to_proto.rs
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ use itertools::Itertools;
use paths::{Utf8Component, Utf8Prefix};
use semver::VersionReq;
use serde_json::to_value;
use syntax::SmolStr;
use vfs::AbsPath;

use crate::{
Expand Down Expand Up @@ -1567,6 +1568,7 @@ pub(crate) fn code_lens(
let line_index = snap.file_line_index(run.nav.file_id)?;
let annotation_range = range(&line_index, annotation.range);

let update_test = run.update_test;
let title = run.title();
let can_debug = match run.kind {
ide::RunnableKind::DocTest { .. } => false,
Expand Down Expand Up @@ -1602,6 +1604,17 @@ pub(crate) fn code_lens(
data: None,
})
}
if lens_config.update_test && client_commands_config.run_single {
let label = update_test.label();
if let Some(r) = make_update_runnable(&r, &label) {
let command = command::run_single(&r, label.unwrap().as_str());
acc.push(lsp_types::CodeLens {
range: annotation_range,
command: Some(command),
data: None,
})
}
}
}

if lens_config.interpret {
Expand Down Expand Up @@ -1786,7 +1799,7 @@ pub(crate) mod command {

pub(crate) fn debug_single(runnable: &lsp_ext::Runnable) -> lsp_types::Command {
lsp_types::Command {
title: "Debug".into(),
title: "\u{fe0e} Debug".into(),
command: "rust-analyzer.debugSingle".into(),
arguments: Some(vec![to_value(runnable).unwrap()]),
}
Expand Down Expand Up @@ -1838,6 +1851,29 @@ pub(crate) mod command {
}
}

fn make_update_runnable(
runnable: &lsp_ext::Runnable,
label: &Option<SmolStr>,
) -> Option<lsp_ext::Runnable> {
if !matches!(runnable.args, lsp_ext::RunnableArgs::Cargo(_)) {
return None;
}
let label = label.as_ref()?;

let mut runnable = runnable.clone();
runnable.label = format!("{} + {}", runnable.label, label);

let lsp_ext::RunnableArgs::Cargo(r) = &mut runnable.args else {
unreachable!();
};

let environment_vars =
[("UPDATE_EXPECT", "1"), ("INSTA_UPDATE", "always"), ("SNAPSHOTS", "overwrite")];
r.environment.extend(environment_vars.into_iter().map(|(k, v)| (k.to_owned(), v.to_owned())));

Some(runnable)
}

pub(crate) fn implementation_title(count: usize) -> String {
if count == 1 {
"1 implementation".into()
Expand Down
2 changes: 1 addition & 1 deletion src/tools/rust-analyzer/docs/dev/lsp-extensions.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<!---
lsp/ext.rs hash: 9790509d87670c22
lsp/ext.rs hash: 512c06cd8b46a21d
If you need to change the above hash to make the test pass, please check if you
need to adjust this doc as well and ping this issue:
Expand Down
6 changes: 6 additions & 0 deletions src/tools/rust-analyzer/docs/user/generated_config.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -808,6 +808,12 @@ Only applies when `#rust-analyzer.lens.enable#` is set.
Whether to show `Run` lens. Only applies when
`#rust-analyzer.lens.enable#` is set.
--
[[rust-analyzer.lens.update.test.enable]]rust-analyzer.lens.update.test.enable (default: `true`)::
+
--
Whether to show `Update Test` lens. Only applies when
`#rust-analyzer.lens.enable#` and `#rust-analyzer.lens.run.enable#` are set.
--
[[rust-analyzer.linkedProjects]]rust-analyzer.linkedProjects (default: `[]`)::
+
--
Expand Down
Loading

0 comments on commit 60b4ed5

Please sign in to comment.