Add postfix completion for let else

This commit is contained in:
Alain Siegrist 2023-10-08 23:15:04 +02:00
parent 7219414e81
commit 57934ac47a

View file

@ -75,6 +75,11 @@ pub(crate) fn complete_postfix(
let try_enum = TryEnum::from_ty(&ctx.sema, &receiver_ty.strip_references()); let try_enum = TryEnum::from_ty(&ctx.sema, &receiver_ty.strip_references());
if let Some(try_enum) = &try_enum { if let Some(try_enum) = &try_enum {
let in_loop = dot_receiver
.syntax()
.ancestors()
.any(|n| matches!(n.kind(), WHILE_EXPR | LOOP_EXPR | FOR_EXPR));
match try_enum { match try_enum {
TryEnum::Result => { TryEnum::Result => {
postfix_snippet( postfix_snippet(
@ -84,6 +89,17 @@ pub(crate) fn complete_postfix(
) )
.add_to(acc, ctx.db); .add_to(acc, ctx.db);
postfix_snippet(
"lete",
"let Ok else {}",
&if in_loop {
format!("let Ok($1) = {receiver_text} else {{\n ${{2|continue,break,return|}};\n}};\n$0")
} else {
format!("let Ok($1) = {receiver_text} else {{\n return;\n}};\n$0")
},
)
.add_to(acc, ctx.db);
postfix_snippet( postfix_snippet(
"while", "while",
"while let Ok {}", "while let Ok {}",
@ -99,6 +115,17 @@ pub(crate) fn complete_postfix(
) )
.add_to(acc, ctx.db); .add_to(acc, ctx.db);
postfix_snippet(
"lete",
"let Some else {}",
&if in_loop {
format!("let Some($1) = {receiver_text} else {{\n ${{2|continue,break,return|}};\n}};\n$0")
} else {
format!("let Some($1) = {receiver_text} else {{\n return;\n}};\n$0")
},
)
.add_to(acc, ctx.db);
postfix_snippet( postfix_snippet(
"while", "while",
"while let Some {}", "while let Some {}",
@ -469,6 +496,56 @@ fn main() {
); );
} }
#[test]
fn option_letelse() {
check_edit(
"lete",
r#"
//- minicore: option
fn main() {
let bar = Some(true);
bar.$0
}
"#,
r#"
fn main() {
let bar = Some(true);
let Some($1) = bar else {
return;
};
$0
}
"#,
);
}
#[test]
fn option_letelse_loop() {
check_edit(
"lete",
r#"
//- minicore: option
fn main() {
let bar = Some(true);
loop {
bar.$0
}
}
"#,
r#"
fn main() {
let bar = Some(true);
loop {
let Some($1) = bar else {
${2|continue,break,return|};
};
$0
}
}
"#,
);
}
#[test] #[test]
fn result_match() { fn result_match() {
check_edit( check_edit(