Skip to content

Commit d305b0b

Browse files
authored
Merge pull request #19397 from gvozdvmozgu/postfix-const-block
add postfix completion for const block
2 parents 9c01af0 + 7393d85 commit d305b0b

File tree

7 files changed

+86
-20
lines changed

7 files changed

+86
-20
lines changed

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -345,6 +345,7 @@ pub(crate) fn complete_expr_path(
345345

346346
if !in_block_expr {
347347
add_keyword("unsafe", "unsafe {\n $0\n}");
348+
add_keyword("const", "const {\n $0\n}");
348349
}
349350
add_keyword("match", "match $1 {\n $0\n}");
350351
add_keyword("while", "while $1 {\n $0\n}");

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ fn foo(a: A) { a.$0 }
7676
kw await expr.await
7777
sn box Box::new(expr)
7878
sn call function(expr)
79+
sn const const {}
7980
sn dbg dbg!(expr)
8081
sn dbgr dbg!(&expr)
8182
sn deref *expr
@@ -103,6 +104,7 @@ fn foo() {
103104
kw await expr.await
104105
sn box Box::new(expr)
105106
sn call function(expr)
107+
sn const const {}
106108
sn dbg dbg!(expr)
107109
sn dbgr dbg!(&expr)
108110
sn deref *expr
@@ -132,6 +134,7 @@ fn foo(a: A) { a.$0 }
132134
kw await expr.await
133135
sn box Box::new(expr)
134136
sn call function(expr)
137+
sn const const {}
135138
sn dbg dbg!(expr)
136139
sn dbgr dbg!(&expr)
137140
sn deref *expr

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

Lines changed: 44 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -155,22 +155,29 @@ pub(crate) fn complete_postfix(
155155
postfix_snippet("refm", "&mut expr", &format!("&mut {receiver_text}")).add_to(acc, ctx.db);
156156
postfix_snippet("deref", "*expr", &format!("*{receiver_text}")).add_to(acc, ctx.db);
157157

158-
let mut unsafe_should_be_wrapped = true;
158+
let mut block_should_be_wrapped = true;
159159
if dot_receiver.syntax().kind() == BLOCK_EXPR {
160-
unsafe_should_be_wrapped = false;
160+
block_should_be_wrapped = false;
161161
if let Some(parent) = dot_receiver.syntax().parent() {
162162
if matches!(parent.kind(), IF_EXPR | WHILE_EXPR | LOOP_EXPR | FOR_EXPR) {
163-
unsafe_should_be_wrapped = true;
163+
block_should_be_wrapped = true;
164164
}
165165
}
166166
};
167-
let unsafe_completion_string = if unsafe_should_be_wrapped {
167+
let unsafe_completion_string = if block_should_be_wrapped {
168168
format!("unsafe {{ {receiver_text} }}")
169169
} else {
170170
format!("unsafe {receiver_text}")
171171
};
172172
postfix_snippet("unsafe", "unsafe {}", &unsafe_completion_string).add_to(acc, ctx.db);
173173

174+
let const_completion_string = if block_should_be_wrapped {
175+
format!("const {{ {receiver_text} }}")
176+
} else {
177+
format!("const {receiver_text}")
178+
};
179+
postfix_snippet("const", "const {}", &const_completion_string).add_to(acc, ctx.db);
180+
174181
// The rest of the postfix completions create an expression that moves an argument,
175182
// so it's better to consider references now to avoid breaking the compilation
176183

@@ -430,6 +437,7 @@ fn main() {
430437
expect![[r#"
431438
sn box Box::new(expr)
432439
sn call function(expr)
440+
sn const const {}
433441
sn dbg dbg!(expr)
434442
sn dbgr dbg!(&expr)
435443
sn deref *expr
@@ -463,6 +471,7 @@ fn main() {
463471
expect![[r#"
464472
sn box Box::new(expr)
465473
sn call function(expr)
474+
sn const const {}
466475
sn dbg dbg!(expr)
467476
sn dbgr dbg!(&expr)
468477
sn deref *expr
@@ -490,6 +499,7 @@ fn main() {
490499
expect![[r#"
491500
sn box Box::new(expr)
492501
sn call function(expr)
502+
sn const const {}
493503
sn dbg dbg!(expr)
494504
sn dbgr dbg!(&expr)
495505
sn deref *expr
@@ -516,6 +526,7 @@ fn main() {
516526
expect![[r#"
517527
sn box Box::new(expr)
518528
sn call function(expr)
529+
sn const const {}
519530
sn dbg dbg!(expr)
520531
sn dbgr dbg!(&expr)
521532
sn deref *expr
@@ -653,44 +664,57 @@ fn main() {
653664

654665
#[test]
655666
fn postfix_completion_for_unsafe() {
656-
check_edit("unsafe", r#"fn main() { foo.$0 }"#, r#"fn main() { unsafe { foo } }"#);
657-
check_edit("unsafe", r#"fn main() { { foo }.$0 }"#, r#"fn main() { unsafe { foo } }"#);
667+
postfix_completion_for_block("unsafe");
668+
}
669+
670+
#[test]
671+
fn postfix_completion_for_const() {
672+
postfix_completion_for_block("const");
673+
}
674+
675+
fn postfix_completion_for_block(kind: &str) {
676+
check_edit(kind, r#"fn main() { foo.$0 }"#, &format!("fn main() {{ {kind} {{ foo }} }}"));
677+
check_edit(
678+
kind,
679+
r#"fn main() { { foo }.$0 }"#,
680+
&format!("fn main() {{ {kind} {{ foo }} }}"),
681+
);
658682
check_edit(
659-
"unsafe",
683+
kind,
660684
r#"fn main() { if x { foo }.$0 }"#,
661-
r#"fn main() { unsafe { if x { foo } } }"#,
685+
&format!("fn main() {{ {kind} {{ if x {{ foo }} }} }}"),
662686
);
663687
check_edit(
664-
"unsafe",
688+
kind,
665689
r#"fn main() { loop { foo }.$0 }"#,
666-
r#"fn main() { unsafe { loop { foo } } }"#,
690+
&format!("fn main() {{ {kind} {{ loop {{ foo }} }} }}"),
667691
);
668692
check_edit(
669-
"unsafe",
693+
kind,
670694
r#"fn main() { if true {}.$0 }"#,
671-
r#"fn main() { unsafe { if true {} } }"#,
695+
&format!("fn main() {{ {kind} {{ if true {{}} }} }}"),
672696
);
673697
check_edit(
674-
"unsafe",
698+
kind,
675699
r#"fn main() { while true {}.$0 }"#,
676-
r#"fn main() { unsafe { while true {} } }"#,
700+
&format!("fn main() {{ {kind} {{ while true {{}} }} }}"),
677701
);
678702
check_edit(
679-
"unsafe",
703+
kind,
680704
r#"fn main() { for i in 0..10 {}.$0 }"#,
681-
r#"fn main() { unsafe { for i in 0..10 {} } }"#,
705+
&format!("fn main() {{ {kind} {{ for i in 0..10 {{}} }} }}"),
682706
);
683707
check_edit(
684-
"unsafe",
708+
kind,
685709
r#"fn main() { let x = if true {1} else {2}.$0 }"#,
686-
r#"fn main() { let x = unsafe { if true {1} else {2} } }"#,
710+
&format!("fn main() {{ let x = {kind} {{ if true {{1}} else {{2}} }} }}"),
687711
);
688712

689713
// completion will not be triggered
690714
check_edit(
691-
"unsafe",
715+
kind,
692716
r#"fn main() { let x = true else {panic!()}.$0}"#,
693-
r#"fn main() { let x = true else {panic!()}.unsafe $0}"#,
717+
&format!("fn main() {{ let x = true else {{panic!()}}.{kind} $0}}"),
694718
);
695719
}
696720

crates/ide-completion/src/render.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3006,6 +3006,7 @@ fn main() {
30063006
sn refm &mut expr []
30073007
sn deref *expr []
30083008
sn unsafe unsafe {} []
3009+
sn const const {} []
30093010
sn match match expr {} []
30103011
sn box Box::new(expr) []
30113012
sn dbg dbg!(expr) []
@@ -3036,6 +3037,7 @@ fn main() {
30363037
sn refm &mut expr []
30373038
sn deref *expr []
30383039
sn unsafe unsafe {} []
3040+
sn const const {} []
30393041
sn match match expr {} []
30403042
sn box Box::new(expr) []
30413043
sn dbg dbg!(expr) []

0 commit comments

Comments
 (0)