Skip to content

Commit f8726d7

Browse files
bors[bot]bnjjj
andauthored
Merge #6601
6601: add let and letm postfix to turn expressions into variables r=matklad a=bnjjj Partially resolve #6426 Co-authored-by: Benjamin Coenen <[email protected]>
2 parents 68910d2 + 474ebd6 commit f8726d7

File tree

2 files changed

+61
-0
lines changed

2 files changed

+61
-0
lines changed

crates/completion/src/completions/postfix.rs

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ mod format_like;
55
use ide_db::ty_filter::TryEnum;
66
use syntax::{
77
ast::{self, AstNode, AstToken},
8+
SyntaxKind::BLOCK_EXPR,
89
TextRange, TextSize,
910
};
1011
use text_edit::TextEdit;
@@ -220,6 +221,30 @@ pub(crate) fn complete_postfix(acc: &mut Completions, ctx: &CompletionContext) {
220221
)
221222
.add_to(acc);
222223

224+
let parent_node = dot_receiver.syntax().parent().and_then(|p| p.parent());
225+
if let Some(parent) = parent_node {
226+
if parent.kind() == BLOCK_EXPR {
227+
postfix_snippet(
228+
ctx,
229+
cap,
230+
&dot_receiver,
231+
"let",
232+
"let",
233+
&format!("let $0 = {};", receiver_text),
234+
)
235+
.add_to(acc);
236+
postfix_snippet(
237+
ctx,
238+
cap,
239+
&dot_receiver,
240+
"letm",
241+
"let mut",
242+
&format!("let mut $0 = {};", receiver_text),
243+
)
244+
.add_to(acc);
245+
}
246+
}
247+
223248
if let ast::Expr::Literal(literal) = dot_receiver.clone() {
224249
if let Some(literal_text) = ast::String::cast(literal.token()) {
225250
add_format_like_completions(acc, ctx, &dot_receiver, cap, &literal_text);
@@ -289,6 +314,38 @@ fn main() {
289314
let bar = true;
290315
bar.<|>
291316
}
317+
"#,
318+
expect![[r#"
319+
sn box Box::new(expr)
320+
sn call function(expr)
321+
sn dbg dbg!(expr)
322+
sn dbgr dbg!(&expr)
323+
sn if if expr {}
324+
sn let let
325+
sn letm let mut
326+
sn match match expr {}
327+
sn not !expr
328+
sn ok Ok(expr)
329+
sn ref &expr
330+
sn refm &mut expr
331+
sn some Some(expr)
332+
sn while while expr {}
333+
"#]],
334+
);
335+
}
336+
337+
#[test]
338+
fn postfix_completion_works_for_function_calln() {
339+
check(
340+
r#"
341+
fn foo(elt: bool) -> bool {
342+
!elt
343+
}
344+
345+
fn main() {
346+
let bar = true;
347+
foo(bar.<|>)
348+
}
292349
"#,
293350
expect![[r#"
294351
sn box Box::new(expr)
@@ -321,6 +378,8 @@ fn main() {
321378
sn call function(expr)
322379
sn dbg dbg!(expr)
323380
sn dbgr dbg!(&expr)
381+
sn let let
382+
sn letm let mut
324383
sn match match expr {}
325384
sn ok Ok(expr)
326385
sn ref &expr

crates/completion/src/lib.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,8 @@ pub use crate::{
4444
// - `expr.while` -> `while expr {}` or `while let ... {}` for `Option` or `Result`
4545
// - `expr.ref` -> `&expr`
4646
// - `expr.refm` -> `&mut expr`
47+
// - `expr.let` -> `let <|> = expr;`
48+
// - `expr.letm` -> `let mut <|> = expr;`
4749
// - `expr.not` -> `!expr`
4850
// - `expr.dbg` -> `dbg!(expr)`
4951
// - `expr.dbgr` -> `dbg!(&expr)`

0 commit comments

Comments
 (0)