Skip to content
This repository was archived by the owner on May 28, 2025. It is now read-only.

Commit 5582402

Browse files
committed
Auto merge of rust-lang#12032 - jonas-schievink:code-action-commands, r=jonas-schievink
feat: display signature help when applying "Add `::<>`" assist Closes rust-lang/rust-analyzer#12031
2 parents e3ec877 + c6ffffc commit 5582402

File tree

18 files changed

+58
-16
lines changed

18 files changed

+58
-16
lines changed

crates/ide/src/ssr.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ pub(crate) fn ssr_assists(
4545
group: Some(GroupLabel("Apply SSR".into())),
4646
target: comment_range,
4747
source_change,
48+
trigger_signature_help: false,
4849
};
4950

5051
ssr_assists.push(assist);
@@ -140,6 +141,7 @@ mod tests {
140141
is_snippet: false,
141142
},
142143
),
144+
trigger_signature_help: false,
143145
}
144146
"#]]
145147
.assert_debug_eq(&apply_in_file_assist);
@@ -186,6 +188,7 @@ mod tests {
186188
is_snippet: false,
187189
},
188190
),
191+
trigger_signature_help: false,
189192
}
190193
"#]]
191194
.assert_debug_eq(&apply_in_workspace_assist);
@@ -225,6 +228,7 @@ mod tests {
225228
),
226229
target: 10..21,
227230
source_change: None,
231+
trigger_signature_help: false,
228232
}
229233
"#]]
230234
.assert_debug_eq(&apply_in_file_assist);
@@ -244,6 +248,7 @@ mod tests {
244248
),
245249
target: 10..21,
246250
source_change: None,
251+
trigger_signature_help: false,
247252
}
248253
"#]]
249254
.assert_debug_eq(&apply_in_workspace_assist);

crates/ide_assists/src/assist_context.rs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -193,17 +193,19 @@ impl Assists {
193193
return None;
194194
}
195195

196+
let mut trigger_signature_help = false;
196197
let source_change = if self.resolve.should_resolve(&id) {
197198
let mut builder = AssistBuilder::new(self.file);
198199
f(&mut builder);
200+
trigger_signature_help = builder.trigger_signature_help;
199201
Some(builder.finish())
200202
} else {
201203
None
202204
};
203205

204206
let label = Label::new(label);
205207
let group = group.cloned();
206-
self.buf.push(Assist { id, label, group, target, source_change });
208+
self.buf.push(Assist { id, label, group, target, source_change, trigger_signature_help });
207209
Some(())
208210
}
209211

@@ -219,6 +221,7 @@ pub(crate) struct AssistBuilder {
219221
edit: TextEditBuilder,
220222
file_id: FileId,
221223
source_change: SourceChange,
224+
trigger_signature_help: bool,
222225

223226
/// Maps the original, immutable `SyntaxNode` to a `clone_for_update` twin.
224227
mutated_tree: Option<TreeMutator>,
@@ -252,6 +255,7 @@ impl AssistBuilder {
252255
edit: TextEdit::builder(),
253256
file_id,
254257
source_change: SourceChange::default(),
258+
trigger_signature_help: false,
255259
mutated_tree: None,
256260
}
257261
}
@@ -332,6 +336,9 @@ impl AssistBuilder {
332336
let file_system_edit = FileSystemEdit::MoveFile { src, dst };
333337
self.source_change.push_file_system_edit(file_system_edit);
334338
}
339+
pub(crate) fn trigger_signature_help(&mut self) {
340+
self.trigger_signature_help = true;
341+
}
335342

336343
fn finish(mut self) -> SourceChange {
337344
self.commit();

crates/ide_assists/src/handlers/add_turbo_fish.rs

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -89,15 +89,18 @@ pub(crate) fn add_turbo_fish(acc: &mut Assists, ctx: &AssistContext) -> Option<(
8989
AssistId("add_turbo_fish", AssistKind::RefactorRewrite),
9090
"Add `::<>`",
9191
ident.text_range(),
92-
|builder| match ctx.config.snippet_cap {
93-
Some(cap) => {
94-
let snip = format!("::<{}>", get_snippet_fish_head(number_of_arguments));
95-
builder.insert_snippet(cap, ident.text_range().end(), snip)
96-
}
97-
None => {
98-
let fish_head = std::iter::repeat("_").take(number_of_arguments).format(", ");
99-
let snip = format!("::<{}>", fish_head);
100-
builder.insert(ident.text_range().end(), snip);
92+
|builder| {
93+
builder.trigger_signature_help();
94+
match ctx.config.snippet_cap {
95+
Some(cap) => {
96+
let snip = format!("::<{}>", get_snippet_fish_head(number_of_arguments));
97+
builder.insert_snippet(cap, ident.text_range().end(), snip)
98+
}
99+
None => {
100+
let fish_head = std::iter::repeat("_").take(number_of_arguments).format(", ");
101+
let snip = format!("::<{}>", fish_head);
102+
builder.insert(ident.text_range().end(), snip);
103+
}
101104
}
102105
},
103106
)

crates/ide_assists/src/tests.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -341,6 +341,7 @@ pub fn test_some_range(a: int) -> bool {
341341
group: None,
342342
target: 59..60,
343343
source_change: None,
344+
trigger_signature_help: false,
344345
}
345346
"#]]
346347
.assert_debug_eq(&extract_into_variable_assist);
@@ -356,6 +357,7 @@ pub fn test_some_range(a: int) -> bool {
356357
group: None,
357358
target: 59..60,
358359
source_change: None,
360+
trigger_signature_help: false,
359361
}
360362
"#]]
361363
.assert_debug_eq(&extract_into_function_assist);
@@ -385,6 +387,7 @@ pub fn test_some_range(a: int) -> bool {
385387
group: None,
386388
target: 59..60,
387389
source_change: None,
390+
trigger_signature_help: false,
388391
}
389392
"#]]
390393
.assert_debug_eq(&extract_into_variable_assist);
@@ -400,6 +403,7 @@ pub fn test_some_range(a: int) -> bool {
400403
group: None,
401404
target: 59..60,
402405
source_change: None,
406+
trigger_signature_help: false,
403407
}
404408
"#]]
405409
.assert_debug_eq(&extract_into_function_assist);
@@ -450,6 +454,7 @@ pub fn test_some_range(a: int) -> bool {
450454
is_snippet: true,
451455
},
452456
),
457+
trigger_signature_help: false,
453458
}
454459
"#]]
455460
.assert_debug_eq(&extract_into_variable_assist);
@@ -465,6 +470,7 @@ pub fn test_some_range(a: int) -> bool {
465470
group: None,
466471
target: 59..60,
467472
source_change: None,
473+
trigger_signature_help: false,
468474
}
469475
"#]]
470476
.assert_debug_eq(&extract_into_function_assist);
@@ -507,6 +513,7 @@ pub fn test_some_range(a: int) -> bool {
507513
is_snippet: true,
508514
},
509515
),
516+
trigger_signature_help: false,
510517
}
511518
"#]]
512519
.assert_debug_eq(&extract_into_variable_assist);
@@ -543,6 +550,7 @@ pub fn test_some_range(a: int) -> bool {
543550
is_snippet: true,
544551
},
545552
),
553+
trigger_signature_help: false,
546554
}
547555
"#]]
548556
.assert_debug_eq(&extract_into_function_assist);

crates/ide_db/src/assists.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ pub struct Assist {
2929
/// cumbersome, especially if you want to embed an assist into another data
3030
/// structure, such as a diagnostic.
3131
pub source_change: Option<SourceChange>,
32+
pub trigger_signature_help: bool,
3233
}
3334

3435
#[derive(Debug, Clone, Copy, PartialEq, Eq)]

crates/ide_diagnostics/src/handlers/unresolved_module.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,7 @@ mod baz {}
117117
is_snippet: false,
118118
},
119119
),
120+
trigger_signature_help: false,
120121
},
121122
Assist {
122123
id: AssistId(
@@ -143,6 +144,7 @@ mod baz {}
143144
is_snippet: false,
144145
},
145146
),
147+
trigger_signature_help: false,
146148
},
147149
],
148150
),

crates/ide_diagnostics/src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -238,5 +238,6 @@ fn unresolved_fix(id: &'static str, label: &str, target: TextRange) -> Assist {
238238
group: None,
239239
target,
240240
source_change: None,
241+
trigger_signature_help: false,
241242
}
242243
}

crates/rust-analyzer/src/diagnostics/test_data/clippy_pass_by_ref.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -318,6 +318,7 @@
318318
"quickfix",
319319
),
320320
),
321+
command: None,
321322
edit: Some(
322323
SnippetWorkspaceEdit {
323324
changes: Some(

crates/rust-analyzer/src/diagnostics/test_data/rustc_unused_variable.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,7 @@
165165
"quickfix",
166166
),
167167
),
168+
command: None,
168169
edit: Some(
169170
SnippetWorkspaceEdit {
170171
changes: Some(

crates/rust-analyzer/src/diagnostics/test_data/rustc_unused_variable_as_hint.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,7 @@
165165
"quickfix",
166166
),
167167
),
168+
command: None,
168169
edit: Some(
169170
SnippetWorkspaceEdit {
170171
changes: Some(

crates/rust-analyzer/src/diagnostics/test_data/rustc_unused_variable_as_info.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,7 @@
165165
"quickfix",
166166
),
167167
),
168+
command: None,
168169
edit: Some(
169170
SnippetWorkspaceEdit {
170171
changes: Some(

crates/rust-analyzer/src/diagnostics/test_data/snap_multi_line_fix.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -328,6 +328,7 @@
328328
"quickfix",
329329
),
330330
),
331+
command: None,
331332
edit: Some(
332333
SnippetWorkspaceEdit {
333334
changes: Some(

crates/rust-analyzer/src/diagnostics/to_proto.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,7 @@ fn map_rust_child_diagnostic(
204204
}),
205205
is_preferred: Some(true),
206206
data: None,
207+
command: None,
207208
},
208209
}),
209210
})

crates/rust-analyzer/src/handlers.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1160,8 +1160,9 @@ pub(crate) fn handle_code_action_resolve(
11601160
))
11611161
.into());
11621162
}
1163-
let edit = to_proto::code_action(&snap, assist.clone(), None)?.edit;
1164-
code_action.edit = edit;
1163+
let ca = to_proto::code_action(&snap, assist.clone(), None)?;
1164+
code_action.edit = ca.edit;
1165+
code_action.command = ca.command;
11651166
Ok(code_action)
11661167
}
11671168

crates/rust-analyzer/src/lsp_ext.rs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -311,9 +311,8 @@ pub struct CodeAction {
311311
pub group: Option<String>,
312312
#[serde(skip_serializing_if = "Option::is_none")]
313313
pub kind: Option<CodeActionKind>,
314-
// We don't handle commands on the client-side
315-
// #[serde(skip_serializing_if = "Option::is_none")]
316-
// pub command: Option<lsp_types::Command>,
314+
#[serde(skip_serializing_if = "Option::is_none")]
315+
pub command: Option<lsp_types::Command>,
317316
#[serde(skip_serializing_if = "Option::is_none")]
318317
pub edit: Option<SnippetWorkspaceEdit>,
319318
#[serde(skip_serializing_if = "Option::is_none")]

crates/rust-analyzer/src/to_proto.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1018,7 +1018,13 @@ pub(crate) fn code_action(
10181018
edit: None,
10191019
is_preferred: None,
10201020
data: None,
1021+
command: None,
10211022
};
1023+
1024+
if assist.trigger_signature_help && snap.config.client_commands().trigger_parameter_hints {
1025+
res.command = Some(command::trigger_parameter_hints());
1026+
}
1027+
10221028
match (assist.source_change, resolve_data) {
10231029
(Some(it), _) => res.edit = Some(snippet_workspace_edit(snap, it)?),
10241030
(None, Some((index, code_action_params))) => {

docs/dev/lsp-extensions.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<!---
2-
lsp_ext.rs hash: 326ad62235135223
2+
lsp_ext.rs hash: 7a34bc3f38e2a7d8
33
44
If you need to change the above hash to make the test pass, please check if you
55
need to adjust this doc as well and ping this issue:

editors/code/src/commands.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -735,6 +735,9 @@ export function resolveCodeAction(ctx: Ctx): Cmd {
735735
const fileSystemEdit = await client.protocol2CodeConverter.asWorkspaceEdit(lcFileSystemEdit);
736736
await vscode.workspace.applyEdit(fileSystemEdit);
737737
await applySnippetWorkspaceEdit(edit);
738+
if (item.command != null) {
739+
await vscode.commands.executeCommand(item.command.command, item.command.arguments);
740+
}
738741
};
739742
}
740743

0 commit comments

Comments
 (0)