Skip to content

Commit a7df61f

Browse files
committed
Add postfix completion for unsafe.
Wrap receiver_text with { } if it's not a BlockExpr.
1 parent 1d32a7b commit a7df61f

File tree

4 files changed

+118
-83
lines changed

4 files changed

+118
-83
lines changed

crates/ide-completion/src/completions/keyword.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ fn foo(a: A) { a.$0 }
8686
sn match match expr {}
8787
sn ref &expr
8888
sn refm &mut expr
89+
sn unsafe unsafe {}
8990
"#]],
9091
);
9192

@@ -110,6 +111,7 @@ fn foo() {
110111
sn match match expr {}
111112
sn ref &expr
112113
sn refm &mut expr
114+
sn unsafe unsafe {}
113115
"#]],
114116
);
115117
}
@@ -136,6 +138,7 @@ fn foo(a: A) { a.$0 }
136138
sn match match expr {}
137139
sn ref &expr
138140
sn refm &mut expr
141+
sn unsafe unsafe {}
139142
"#]],
140143
);
141144
}

crates/ide-completion/src/completions/postfix.rs

Lines changed: 69 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,12 @@ pub(crate) fn complete_postfix(
123123
postfix_snippet("ref", "&expr", &format!("&{receiver_text}")).add_to(acc);
124124
postfix_snippet("refm", "&mut expr", &format!("&mut {receiver_text}")).add_to(acc);
125125

126+
let unsafe_completion_string = match dot_receiver {
127+
ast::Expr::BlockExpr(_) => format!("unsafe {receiver_text}"),
128+
_ => format!("unsafe {{ {receiver_text} }}"),
129+
};
130+
postfix_snippet("unsafe", "unsafe {}", &unsafe_completion_string).add_to(acc);
131+
126132
// The rest of the postfix completions create an expression that moves an argument,
127133
// so it's better to consider references now to avoid breaking the compilation
128134

@@ -329,18 +335,19 @@ fn main() {
329335
}
330336
"#,
331337
expect![[r#"
332-
sn box Box::new(expr)
333-
sn call function(expr)
334-
sn dbg dbg!(expr)
335-
sn dbgr dbg!(&expr)
336-
sn if if expr {}
337-
sn let let
338-
sn letm let mut
339-
sn match match expr {}
340-
sn not !expr
341-
sn ref &expr
342-
sn refm &mut expr
343-
sn while while expr {}
338+
sn box Box::new(expr)
339+
sn call function(expr)
340+
sn dbg dbg!(expr)
341+
sn dbgr dbg!(&expr)
342+
sn if if expr {}
343+
sn let let
344+
sn letm let mut
345+
sn match match expr {}
346+
sn not !expr
347+
sn ref &expr
348+
sn refm &mut expr
349+
sn unsafe unsafe {}
350+
sn while while expr {}
344351
"#]],
345352
);
346353
}
@@ -359,16 +366,17 @@ fn main() {
359366
}
360367
"#,
361368
expect![[r#"
362-
sn box Box::new(expr)
363-
sn call function(expr)
364-
sn dbg dbg!(expr)
365-
sn dbgr dbg!(&expr)
366-
sn if if expr {}
367-
sn match match expr {}
368-
sn not !expr
369-
sn ref &expr
370-
sn refm &mut expr
371-
sn while while expr {}
369+
sn box Box::new(expr)
370+
sn call function(expr)
371+
sn dbg dbg!(expr)
372+
sn dbgr dbg!(&expr)
373+
sn if if expr {}
374+
sn match match expr {}
375+
sn not !expr
376+
sn ref &expr
377+
sn refm &mut expr
378+
sn unsafe unsafe {}
379+
sn while while expr {}
372380
"#]],
373381
);
374382
}
@@ -383,15 +391,16 @@ fn main() {
383391
}
384392
"#,
385393
expect![[r#"
386-
sn box Box::new(expr)
387-
sn call function(expr)
388-
sn dbg dbg!(expr)
389-
sn dbgr dbg!(&expr)
390-
sn let let
391-
sn letm let mut
392-
sn match match expr {}
393-
sn ref &expr
394-
sn refm &mut expr
394+
sn box Box::new(expr)
395+
sn call function(expr)
396+
sn dbg dbg!(expr)
397+
sn dbgr dbg!(&expr)
398+
sn let let
399+
sn letm let mut
400+
sn match match expr {}
401+
sn ref &expr
402+
sn refm &mut expr
403+
sn unsafe unsafe {}
395404
"#]],
396405
)
397406
}
@@ -406,18 +415,19 @@ fn main() {
406415
}
407416
"#,
408417
expect![[r#"
409-
sn box Box::new(expr)
410-
sn call function(expr)
411-
sn dbg dbg!(expr)
412-
sn dbgr dbg!(&expr)
413-
sn if if expr {}
414-
sn let let
415-
sn letm let mut
416-
sn match match expr {}
417-
sn not !expr
418-
sn ref &expr
419-
sn refm &mut expr
420-
sn while while expr {}
418+
sn box Box::new(expr)
419+
sn call function(expr)
420+
sn dbg dbg!(expr)
421+
sn dbgr dbg!(&expr)
422+
sn if if expr {}
423+
sn let let
424+
sn letm let mut
425+
sn match match expr {}
426+
sn not !expr
427+
sn ref &expr
428+
sn refm &mut expr
429+
sn unsafe unsafe {}
430+
sn while while expr {}
421431
"#]],
422432
);
423433
}
@@ -517,6 +527,22 @@ fn main() {
517527
)
518528
}
519529

530+
#[test]
531+
fn postfix_completion_for_unsafe() {
532+
check_edit("unsafe", r#"fn main() { foo.$0 }"#, r#"fn main() { unsafe { foo } }"#);
533+
check_edit("unsafe", r#"fn main() { { foo }.$0 }"#, r#"fn main() { unsafe { foo } }"#);
534+
check_edit(
535+
"unsafe",
536+
r#"fn main() { if x { foo }.$0 }"#,
537+
r#"fn main() { unsafe { if x { foo } } }"#,
538+
);
539+
check_edit(
540+
"unsafe",
541+
r#"fn main() { loop { foo }.$0 }"#,
542+
r#"fn main() { unsafe { loop { foo } } }"#,
543+
);
544+
}
545+
520546
#[test]
521547
fn custom_postfix_completion() {
522548
let config = CompletionConfig {

crates/ide-completion/src/render.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1691,6 +1691,7 @@ fn main() {
16911691
sn while []
16921692
sn ref []
16931693
sn refm []
1694+
sn unsafe []
16941695
sn match []
16951696
sn box []
16961697
sn dbg []
@@ -1718,6 +1719,7 @@ fn main() {
17181719
me f() []
17191720
sn ref []
17201721
sn refm []
1722+
sn unsafe []
17211723
sn match []
17221724
sn box []
17231725
sn dbg []

crates/ide-completion/src/tests/proc_macros.rs

Lines changed: 44 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -24,16 +24,17 @@ fn main() {
2424
}
2525
"#,
2626
expect![[r#"
27-
me foo() fn(&self)
28-
sn box Box::new(expr)
29-
sn call function(expr)
30-
sn dbg dbg!(expr)
31-
sn dbgr dbg!(&expr)
32-
sn let let
33-
sn letm let mut
34-
sn match match expr {}
35-
sn ref &expr
36-
sn refm &mut expr
27+
me foo() fn(&self)
28+
sn box Box::new(expr)
29+
sn call function(expr)
30+
sn dbg dbg!(expr)
31+
sn dbgr dbg!(&expr)
32+
sn let let
33+
sn letm let mut
34+
sn match match expr {}
35+
sn ref &expr
36+
sn refm &mut expr
37+
sn unsafe unsafe {}
3738
"#]],
3839
)
3940
}
@@ -54,16 +55,17 @@ fn main() {
5455
}
5556
"#,
5657
expect![[r#"
57-
me foo() fn(&self)
58-
sn box Box::new(expr)
59-
sn call function(expr)
60-
sn dbg dbg!(expr)
61-
sn dbgr dbg!(&expr)
62-
sn let let
63-
sn letm let mut
64-
sn match match expr {}
65-
sn ref &expr
66-
sn refm &mut expr
58+
me foo() fn(&self)
59+
sn box Box::new(expr)
60+
sn call function(expr)
61+
sn dbg dbg!(expr)
62+
sn dbgr dbg!(&expr)
63+
sn let let
64+
sn letm let mut
65+
sn match match expr {}
66+
sn ref &expr
67+
sn refm &mut expr
68+
sn unsafe unsafe {}
6769
"#]],
6870
)
6971
}
@@ -86,16 +88,17 @@ impl Foo {
8688
fn main() {}
8789
"#,
8890
expect![[r#"
89-
me foo() fn(&self)
90-
sn box Box::new(expr)
91-
sn call function(expr)
92-
sn dbg dbg!(expr)
93-
sn dbgr dbg!(&expr)
94-
sn let let
95-
sn letm let mut
96-
sn match match expr {}
97-
sn ref &expr
98-
sn refm &mut expr
91+
me foo() fn(&self)
92+
sn box Box::new(expr)
93+
sn call function(expr)
94+
sn dbg dbg!(expr)
95+
sn dbgr dbg!(&expr)
96+
sn let let
97+
sn letm let mut
98+
sn match match expr {}
99+
sn ref &expr
100+
sn refm &mut expr
101+
sn unsafe unsafe {}
99102
"#]],
100103
)
101104
}
@@ -118,16 +121,17 @@ impl Foo {
118121
fn main() {}
119122
"#,
120123
expect![[r#"
121-
me foo() fn(&self)
122-
sn box Box::new(expr)
123-
sn call function(expr)
124-
sn dbg dbg!(expr)
125-
sn dbgr dbg!(&expr)
126-
sn let let
127-
sn letm let mut
128-
sn match match expr {}
129-
sn ref &expr
130-
sn refm &mut expr
124+
me foo() fn(&self)
125+
sn box Box::new(expr)
126+
sn call function(expr)
127+
sn dbg dbg!(expr)
128+
sn dbgr dbg!(&expr)
129+
sn let let
130+
sn letm let mut
131+
sn match match expr {}
132+
sn ref &expr
133+
sn refm &mut expr
134+
sn unsafe unsafe {}
131135
"#]],
132136
)
133137
}

0 commit comments

Comments
 (0)