Add postfix completion for unsafe.

Wrap receiver_text with { } if it's not a BlockExpr.
This commit is contained in:
Duong Quoc Khanh 2023-02-07 23:55:44 +09:00
parent 1d32a7b7c6
commit a7df61f1d3
No known key found for this signature in database
GPG key ID: DA52A74E804A00E7
4 changed files with 118 additions and 83 deletions

View file

@ -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 {}
"#]],
);
}

View file

@ -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 {}
"#]],
);
}
@ -517,6 +527,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 {

View file

@ -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 []

View file

@ -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 {}
"#]],
)
}