add if let and while let postfix for Option and Result

Signed-off-by: Benjamin Coenen <5719034+bnjjj@users.noreply.github.com>
This commit is contained in:
Benjamin Coenen 2020-05-10 12:45:35 +02:00
parent e80903a965
commit 92b2230fef
3 changed files with 46 additions and 62 deletions

View File

@ -103,7 +103,7 @@ fn invert_special_case(expr: &ast::Expr) -> Option<ast::Expr> {
}
#[derive(Clone, Copy)]
pub(crate) enum TryEnum {
pub enum TryEnum {
Result,
Option,
}
@ -111,7 +111,7 @@ pub(crate) enum TryEnum {
impl TryEnum {
const ALL: [TryEnum; 2] = [TryEnum::Option, TryEnum::Result];
pub(crate) fn from_ty(sema: &Semantics<RootDatabase>, ty: &Type) -> Option<TryEnum> {
pub fn from_ty(sema: &Semantics<RootDatabase>, ty: &Type) -> Option<TryEnum> {
let enum_ = match ty.as_adt() {
Some(Adt::Enum(it)) => it,
_ => return None,

View File

@ -1086,28 +1086,6 @@ impl Type {
matches!(self.ty.value, Ty::Apply(ApplicationTy { ctor: TypeCtor::Bool, .. }))
}
pub fn is_option(&self, db: &dyn HirDatabase) -> bool {
if let Some(adt_ty) = self.as_adt() {
if let Adt::Enum(_) = adt_ty {
if self.display(db).to_string().starts_with("Option<") {
return true;
}
}
}
false
}
pub fn is_result(&self, db: &dyn HirDatabase) -> bool {
if let Some(adt_ty) = self.as_adt() {
if let Adt::Enum(_) = adt_ty {
if self.display(db).to_string().starts_with("Result<") {
return true;
}
}
}
false
}
pub fn is_mutable_reference(&self) -> bool {
matches!(
self.ty.value,

View File

@ -14,6 +14,7 @@ use crate::{
},
CompletionItem,
};
use ra_assists::utils::TryEnum;
pub(super) fn complete_postfix(acc: &mut Completions, ctx: &CompletionContext) {
if !ctx.config.enable_postfix_completions {
@ -38,46 +39,51 @@ pub(super) fn complete_postfix(acc: &mut Completions, ctx: &CompletionContext) {
None => return,
};
if receiver_ty.is_option(ctx.db) {
postfix_snippet(
ctx,
cap,
&dot_receiver,
"ifl",
"if let Some {}",
&format!("if let Some($1) = {} {{\n $0\n}}", receiver_text),
)
.add_to(acc);
if let Some(try_enum) = TryEnum::from_ty(&ctx.sema, &receiver_ty) {
match try_enum {
TryEnum::Result => {
postfix_snippet(
ctx,
cap,
&dot_receiver,
"ifl",
"if let Ok {}",
&format!("if let Ok($1) = {} {{\n $0\n}}", receiver_text),
)
.add_to(acc);
postfix_snippet(
ctx,
cap,
&dot_receiver,
"while",
"while let Some {}",
&format!("while let Some($1) = {} {{\n $0\n}}", receiver_text),
)
.add_to(acc);
} else if receiver_ty.is_result(ctx.db) {
postfix_snippet(
ctx,
cap,
&dot_receiver,
"ifl",
"if let Ok {}",
&format!("if let Ok($1) = {} {{\n $0\n}}", receiver_text),
)
.add_to(acc);
postfix_snippet(
ctx,
cap,
&dot_receiver,
"while",
"while let Ok {}",
&format!("while let Ok($1) = {} {{\n $0\n}}", receiver_text),
)
.add_to(acc);
}
TryEnum::Option => {
postfix_snippet(
ctx,
cap,
&dot_receiver,
"ifl",
"if let Some {}",
&format!("if let Some($1) = {} {{\n $0\n}}", receiver_text),
)
.add_to(acc);
postfix_snippet(
ctx,
cap,
&dot_receiver,
"while",
"while let Ok {}",
&format!("while let Ok($1) = {} {{\n $0\n}}", receiver_text),
)
.add_to(acc);
postfix_snippet(
ctx,
cap,
&dot_receiver,
"while",
"while let Some {}",
&format!("while let Some($1) = {} {{\n $0\n}}", receiver_text),
)
.add_to(acc);
}
}
} else if receiver_ty.is_bool() || receiver_ty.is_unknown() {
postfix_snippet(
ctx,