From: bors[bot] <26634292+bors[bot]@users.noreply.github.com> Date: Sun, 29 Nov 2020 19:21:25 +0000 (+0000) Subject: Merge #6601 X-Git-Url: https://git.lizzy.rs/?a=commitdiff_plain;h=f8726d781a971752a6918a20eea10cddca2114ed;hp=68910d2f341ddd7635265c3847712cc7e44ef75e;p=rust.git 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 <5719034+bnjjj@users.noreply.github.com> --- diff --git a/crates/completion/src/completions/postfix.rs b/crates/completion/src/completions/postfix.rs index 7fbda7a6bd9..1785794cc5c 100644 --- a/crates/completion/src/completions/postfix.rs +++ b/crates/completion/src/completions/postfix.rs @@ -5,6 +5,7 @@ use ide_db::ty_filter::TryEnum; use syntax::{ ast::{self, AstNode, AstToken}, + SyntaxKind::BLOCK_EXPR, TextRange, TextSize, }; use text_edit::TextEdit; @@ -220,6 +221,30 @@ pub(crate) fn complete_postfix(acc: &mut Completions, ctx: &CompletionContext) { ) .add_to(acc); + let parent_node = dot_receiver.syntax().parent().and_then(|p| p.parent()); + if let Some(parent) = parent_node { + if parent.kind() == BLOCK_EXPR { + postfix_snippet( + ctx, + cap, + &dot_receiver, + "let", + "let", + &format!("let $0 = {};", receiver_text), + ) + .add_to(acc); + postfix_snippet( + ctx, + cap, + &dot_receiver, + "letm", + "let mut", + &format!("let mut $0 = {};", receiver_text), + ) + .add_to(acc); + } + } + if let ast::Expr::Literal(literal) = dot_receiver.clone() { if let Some(literal_text) = ast::String::cast(literal.token()) { add_format_like_completions(acc, ctx, &dot_receiver, cap, &literal_text); @@ -289,6 +314,38 @@ fn main() { let bar = true; bar.<|> } +"#, + expect![[r#" + sn box Box::new(expr) + sn call function(expr) + sn dbg dbg!(expr) + sn dbgr dbg!(&expr) + sn if if expr {} + sn let let + sn letm let mut + sn match match expr {} + sn not !expr + sn ok Ok(expr) + sn ref &expr + sn refm &mut expr + sn some Some(expr) + sn while while expr {} + "#]], + ); + } + + #[test] + fn postfix_completion_works_for_function_calln() { + check( + r#" +fn foo(elt: bool) -> bool { + !elt +} + +fn main() { + let bar = true; + foo(bar.<|>) +} "#, expect![[r#" sn box Box::new(expr) @@ -321,6 +378,8 @@ fn main() { sn call function(expr) sn dbg dbg!(expr) sn dbgr dbg!(&expr) + sn let let + sn letm let mut sn match match expr {} sn ok Ok(expr) sn ref &expr diff --git a/crates/completion/src/lib.rs b/crates/completion/src/lib.rs index aecc1378b1b..1ec2e9be72d 100644 --- a/crates/completion/src/lib.rs +++ b/crates/completion/src/lib.rs @@ -44,6 +44,8 @@ // - `expr.while` -> `while expr {}` or `while let ... {}` for `Option` or `Result` // - `expr.ref` -> `&expr` // - `expr.refm` -> `&mut expr` +// - `expr.let` -> `let <|> = expr;` +// - `expr.letm` -> `let mut <|> = expr;` // - `expr.not` -> `!expr` // - `expr.dbg` -> `dbg!(expr)` // - `expr.dbgr` -> `dbg!(&expr)`