about summary refs log tree commit diff
diff options
context:
space:
mode:
authorDuong Quoc Khanh <dqkqdlot@gmail.com>2023-02-07 23:55:44 +0900
committerDuong Quoc Khanh <dqkqdlot@gmail.com>2023-02-07 23:55:44 +0900
commita7df61f1d35d05100722af1ec90bccd68dd8ad9c (patch)
tree35302d8bb9aa88ccf22d89ef8510310d2e304757
parent1d32a7b7c66450c792dafe162b229d40ab6a1cc8 (diff)
downloadrust-a7df61f1d35d05100722af1ec90bccd68dd8ad9c.tar.gz
rust-a7df61f1d35d05100722af1ec90bccd68dd8ad9c.zip
Add postfix completion for `unsafe`.
Wrap receiver_text with { } if it's not a BlockExpr.
-rw-r--r--crates/ide-completion/src/completions/keyword.rs3
-rw-r--r--crates/ide-completion/src/completions/postfix.rs112
-rw-r--r--crates/ide-completion/src/render.rs2
-rw-r--r--crates/ide-completion/src/tests/proc_macros.rs84
4 files changed, 118 insertions, 83 deletions
diff --git a/crates/ide-completion/src/completions/keyword.rs b/crates/ide-completion/src/completions/keyword.rs
index 1d03c8cc5ca..b9ab2afca2b 100644
--- a/crates/ide-completion/src/completions/keyword.rs
+++ b/crates/ide-completion/src/completions/keyword.rs
@@ -86,6 +86,7 @@ fn foo(a: A) { a.$0 }
                 sn match                  match expr {}
                 sn ref                    &expr
                 sn refm                   &mut expr
+                sn unsafe                 unsafe {}
             "#]],
         );
 
@@ -110,6 +111,7 @@ fn foo() {
                 sn match                  match expr {}
                 sn ref                    &expr
                 sn refm                   &mut expr
+                sn unsafe                 unsafe {}
             "#]],
         );
     }
@@ -136,6 +138,7 @@ fn foo(a: A) { a.$0 }
                 sn match                  match expr {}
                 sn ref                    &expr
                 sn refm                   &mut expr
+                sn unsafe                 unsafe {}
             "#]],
         );
     }
diff --git a/crates/ide-completion/src/completions/postfix.rs b/crates/ide-completion/src/completions/postfix.rs
index f4f37d77d81..19df8e2b206 100644
--- a/crates/ide-completion/src/completions/postfix.rs
+++ b/crates/ide-completion/src/completions/postfix.rs
@@ -123,6 +123,12 @@ pub(crate) fn complete_postfix(
     postfix_snippet("ref", "&expr", &format!("&{receiver_text}")).add_to(acc);
     postfix_snippet("refm", "&mut expr", &format!("&mut {receiver_text}")).add_to(acc);
 
+    let unsafe_completion_string = match dot_receiver {
+        ast::Expr::BlockExpr(_) => format!("unsafe {receiver_text}"),
+        _ => format!("unsafe {{ {receiver_text} }}"),
+    };
+    postfix_snippet("unsafe", "unsafe {}", &unsafe_completion_string).add_to(acc);
+
     // The rest of the postfix completions create an expression that moves an argument,
     // so it's better to consider references now to avoid breaking the compilation
 
@@ -329,18 +335,19 @@ fn main() {
 }
 "#,
             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 ref   &expr
-                sn refm  &mut expr
-                sn while while expr {}
+                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 ref    &expr
+                sn refm   &mut expr
+                sn unsafe unsafe {}
+                sn while  while expr {}
             "#]],
         );
     }
@@ -359,16 +366,17 @@ fn main() {
 }
 "#,
             expect![[r#"
-                sn box   Box::new(expr)
-                sn call  function(expr)
-                sn dbg   dbg!(expr)
-                sn dbgr  dbg!(&expr)
-                sn if    if expr {}
-                sn match match expr {}
-                sn not   !expr
-                sn ref   &expr
-                sn refm  &mut expr
-                sn while while expr {}
+                sn box    Box::new(expr)
+                sn call   function(expr)
+                sn dbg    dbg!(expr)
+                sn dbgr   dbg!(&expr)
+                sn if     if expr {}
+                sn match  match expr {}
+                sn not    !expr
+                sn ref    &expr
+                sn refm   &mut expr
+                sn unsafe unsafe {}
+                sn while  while expr {}
             "#]],
         );
     }
@@ -383,15 +391,16 @@ fn main() {
 }
 "#,
             expect![[r#"
-                sn box   Box::new(expr)
-                sn call  function(expr)
-                sn dbg   dbg!(expr)
-                sn dbgr  dbg!(&expr)
-                sn let   let
-                sn letm  let mut
-                sn match match expr {}
-                sn ref   &expr
-                sn refm  &mut expr
+                sn box    Box::new(expr)
+                sn call   function(expr)
+                sn dbg    dbg!(expr)
+                sn dbgr   dbg!(&expr)
+                sn let    let
+                sn letm   let mut
+                sn match  match expr {}
+                sn ref    &expr
+                sn refm   &mut expr
+                sn unsafe unsafe {}
             "#]],
         )
     }
@@ -406,18 +415,19 @@ fn main() {
 }
 "#,
             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 ref   &expr
-                sn refm  &mut expr
-                sn while while expr {}
+                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 ref    &expr
+                sn refm   &mut expr
+                sn unsafe unsafe {}
+                sn while  while expr {}
             "#]],
         );
     }
@@ -518,6 +528,22 @@ fn main() {
     }
 
     #[test]
+    fn postfix_completion_for_unsafe() {
+        check_edit("unsafe", r#"fn main() { foo.$0 }"#, r#"fn main() { unsafe { foo } }"#);
+        check_edit("unsafe", r#"fn main() { { foo }.$0 }"#, r#"fn main() { unsafe { foo } }"#);
+        check_edit(
+            "unsafe",
+            r#"fn main() { if x { foo }.$0 }"#,
+            r#"fn main() { unsafe { if x { foo } } }"#,
+        );
+        check_edit(
+            "unsafe",
+            r#"fn main() { loop { foo }.$0 }"#,
+            r#"fn main() { unsafe { loop { foo } } }"#,
+        );
+    }
+
+    #[test]
     fn custom_postfix_completion() {
         let config = CompletionConfig {
             snippets: vec![Snippet::new(
diff --git a/crates/ide-completion/src/render.rs b/crates/ide-completion/src/render.rs
index e48d1aecd04..d6476c10258 100644
--- a/crates/ide-completion/src/render.rs
+++ b/crates/ide-completion/src/render.rs
@@ -1691,6 +1691,7 @@ fn main() {
                 sn while []
                 sn ref []
                 sn refm []
+                sn unsafe []
                 sn match []
                 sn box []
                 sn dbg []
@@ -1718,6 +1719,7 @@ fn main() {
                 me f() []
                 sn ref []
                 sn refm []
+                sn unsafe []
                 sn match []
                 sn box []
                 sn dbg []
diff --git a/crates/ide-completion/src/tests/proc_macros.rs b/crates/ide-completion/src/tests/proc_macros.rs
index fec149e56a9..92ea4d15b85 100644
--- a/crates/ide-completion/src/tests/proc_macros.rs
+++ b/crates/ide-completion/src/tests/proc_macros.rs
@@ -24,16 +24,17 @@ fn main() {
 }
 "#,
         expect![[r#"
-            me foo() fn(&self)
-            sn box   Box::new(expr)
-            sn call  function(expr)
-            sn dbg   dbg!(expr)
-            sn dbgr  dbg!(&expr)
-            sn let   let
-            sn letm  let mut
-            sn match match expr {}
-            sn ref   &expr
-            sn refm  &mut expr
+            me foo()  fn(&self)
+            sn box    Box::new(expr)
+            sn call   function(expr)
+            sn dbg    dbg!(expr)
+            sn dbgr   dbg!(&expr)
+            sn let    let
+            sn letm   let mut
+            sn match  match expr {}
+            sn ref    &expr
+            sn refm   &mut expr
+            sn unsafe unsafe {}
         "#]],
     )
 }
@@ -54,16 +55,17 @@ fn main() {
 }
 "#,
         expect![[r#"
-            me foo() fn(&self)
-            sn box   Box::new(expr)
-            sn call  function(expr)
-            sn dbg   dbg!(expr)
-            sn dbgr  dbg!(&expr)
-            sn let   let
-            sn letm  let mut
-            sn match match expr {}
-            sn ref   &expr
-            sn refm  &mut expr
+            me foo()  fn(&self)
+            sn box    Box::new(expr)
+            sn call   function(expr)
+            sn dbg    dbg!(expr)
+            sn dbgr   dbg!(&expr)
+            sn let    let
+            sn letm   let mut
+            sn match  match expr {}
+            sn ref    &expr
+            sn refm   &mut expr
+            sn unsafe unsafe {}
         "#]],
     )
 }
@@ -86,16 +88,17 @@ impl Foo {
 fn main() {}
 "#,
         expect![[r#"
-            me foo() fn(&self)
-            sn box   Box::new(expr)
-            sn call  function(expr)
-            sn dbg   dbg!(expr)
-            sn dbgr  dbg!(&expr)
-            sn let   let
-            sn letm  let mut
-            sn match match expr {}
-            sn ref   &expr
-            sn refm  &mut expr
+            me foo()  fn(&self)
+            sn box    Box::new(expr)
+            sn call   function(expr)
+            sn dbg    dbg!(expr)
+            sn dbgr   dbg!(&expr)
+            sn let    let
+            sn letm   let mut
+            sn match  match expr {}
+            sn ref    &expr
+            sn refm   &mut expr
+            sn unsafe unsafe {}
         "#]],
     )
 }
@@ -118,16 +121,17 @@ impl Foo {
 fn main() {}
 "#,
         expect![[r#"
-            me foo() fn(&self)
-            sn box   Box::new(expr)
-            sn call  function(expr)
-            sn dbg   dbg!(expr)
-            sn dbgr  dbg!(&expr)
-            sn let   let
-            sn letm  let mut
-            sn match match expr {}
-            sn ref   &expr
-            sn refm  &mut expr
+            me foo()  fn(&self)
+            sn box    Box::new(expr)
+            sn call   function(expr)
+            sn dbg    dbg!(expr)
+            sn dbgr   dbg!(&expr)
+            sn let    let
+            sn letm   let mut
+            sn match  match expr {}
+            sn ref    &expr
+            sn refm   &mut expr
+            sn unsafe unsafe {}
         "#]],
     )
 }