]> git.lizzy.rs Git - rust.git/commitdiff
Merge #6601
authorbors[bot] <26634292+bors[bot]@users.noreply.github.com>
Sun, 29 Nov 2020 19:21:25 +0000 (19:21 +0000)
committerGitHub <noreply@github.com>
Sun, 29 Nov 2020 19:21:25 +0000 (19:21 +0000)
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>
crates/completion/src/completions/postfix.rs
crates/completion/src/lib.rs

index 7fbda7a6bd9a8ef8a78bd9845d602f3dbdc45305..1785794cc5c7cdb796bec08bb8663f876a664fbf 100644 (file)
@@ -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
index aecc1378b1b784d36bacbd27c5e2e8c61a228fb7..1ec2e9be72de5433a46669198c2b95a671d3d229 100644 (file)
@@ -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)`