Skip to content

Commit 73bef85

Browse files
committed
Move shared assist code to utils
1 parent 549ce9a commit 73bef85

File tree

3 files changed

+35
-48
lines changed

3 files changed

+35
-48
lines changed

crates/ra_assists/src/handlers/replace_let_with_if_let.rs

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
use std::iter::once;
22

3-
use hir::Adt;
43
use ra_syntax::{
54
ast::{
65
self,
@@ -12,6 +11,7 @@ use ra_syntax::{
1211

1312
use crate::{
1413
assist_ctx::{Assist, AssistCtx},
14+
utils::happy_try_variant,
1515
AssistId,
1616
};
1717

@@ -45,20 +45,10 @@ pub(crate) fn replace_let_with_if_let(ctx: AssistCtx) -> Option<Assist> {
4545
let init = let_stmt.initializer()?;
4646
let original_pat = let_stmt.pat()?;
4747
let ty = ctx.sema.type_of_expr(&init)?;
48-
let enum_ = match ty.as_adt() {
49-
Some(Adt::Enum(it)) => it,
50-
_ => return None,
51-
};
52-
let happy_case =
53-
[("Result", "Ok"), ("Option", "Some")].iter().find_map(|(known_type, happy_case)| {
54-
if &enum_.name(ctx.db).to_string() == known_type {
55-
return Some(happy_case);
56-
}
57-
None
58-
});
48+
let happy_variant = happy_try_variant(ctx.sema, &ty);
5949

6050
ctx.add_assist(AssistId("replace_let_with_if_let"), "Replace with if-let", |edit| {
61-
let with_placeholder: ast::Pat = match happy_case {
51+
let with_placeholder: ast::Pat = match happy_variant {
6252
None => make::placeholder_pat().into(),
6353
Some(var_name) => make::tuple_struct_pat(
6454
make::path_unqualified(make::path_segment(make::name_ref(var_name))),

crates/ra_assists/src/handlers/replace_unwrap_with_match.rs

Lines changed: 18 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,11 @@
11
use std::iter;
22

33
use ra_syntax::{
4-
ast::{self, make},
4+
ast::{self, edit::IndentLevel, make},
55
AstNode,
66
};
77

8-
use crate::{Assist, AssistCtx, AssistId};
9-
use ast::edit::IndentLevel;
8+
use crate::{utils::happy_try_variant, Assist, AssistCtx, AssistId};
109

1110
// Assist: replace_unwrap_with_match
1211
//
@@ -38,42 +37,27 @@ pub(crate) fn replace_unwrap_with_match(ctx: AssistCtx) -> Option<Assist> {
3837
}
3938
let caller = method_call.expr()?;
4039
let ty = ctx.sema.type_of_expr(&caller)?;
40+
let happy_variant = happy_try_variant(ctx.sema, &ty)?;
4141

42-
let type_name = ty.as_adt()?.name(ctx.sema.db).to_string();
42+
ctx.add_assist(AssistId("replace_unwrap_with_match"), "Replace unwrap with match", |edit| {
43+
let ok_path = make::path_unqualified(make::path_segment(make::name_ref(happy_variant)));
44+
let it = make::bind_pat(make::name("a")).into();
45+
let ok_tuple = make::tuple_struct_pat(ok_path, iter::once(it)).into();
4346

44-
for (unwrap_type, variant_name) in [("Result", "Ok"), ("Option", "Some")].iter() {
45-
if &type_name == unwrap_type {
46-
return ctx.add_assist(
47-
AssistId("replace_unwrap_with_match"),
48-
"Replace unwrap with match",
49-
|edit| {
50-
let ok_path =
51-
make::path_unqualified(make::path_segment(make::name_ref(variant_name)));
52-
let it = make::bind_pat(make::name("a")).into();
53-
let ok_tuple = make::tuple_struct_pat(ok_path, iter::once(it)).into();
47+
let bind_path = make::path_unqualified(make::path_segment(make::name_ref("a")));
48+
let ok_arm = make::match_arm(iter::once(ok_tuple), make::expr_path(bind_path));
5449

55-
let bind_path = make::path_unqualified(make::path_segment(make::name_ref("a")));
56-
let ok_arm = make::match_arm(iter::once(ok_tuple), make::expr_path(bind_path));
50+
let unreachable_call = make::unreachable_macro_call().into();
51+
let err_arm = make::match_arm(iter::once(make::placeholder_pat().into()), unreachable_call);
5752

58-
let unreachable_call = make::unreachable_macro_call().into();
59-
let err_arm = make::match_arm(
60-
iter::once(make::placeholder_pat().into()),
61-
unreachable_call,
62-
);
53+
let match_arm_list = make::match_arm_list(vec![ok_arm, err_arm]);
54+
let match_expr = make::expr_match(caller.clone(), match_arm_list);
55+
let match_expr = IndentLevel::from_node(method_call.syntax()).increase_indent(match_expr);
6356

64-
let match_arm_list = make::match_arm_list(vec![ok_arm, err_arm]);
65-
let match_expr = make::expr_match(caller.clone(), match_arm_list);
66-
let match_expr =
67-
IndentLevel::from_node(method_call.syntax()).increase_indent(match_expr);
68-
69-
edit.target(method_call.syntax().text_range());
70-
edit.set_cursor(caller.syntax().text_range().start());
71-
edit.replace_ast::<ast::Expr>(method_call.into(), match_expr);
72-
},
73-
);
74-
}
75-
}
76-
None
57+
edit.target(method_call.syntax().text_range());
58+
edit.set_cursor(caller.syntax().text_range().start());
59+
edit.replace_ast::<ast::Expr>(method_call.into(), match_expr);
60+
})
7761
}
7862

7963
#[cfg(test)]

crates/ra_assists/src/utils.rs

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
//! Assorted functions shared by several assists.
22
pub(crate) mod insert_use;
33

4-
use hir::Semantics;
4+
use hir::{Adt, Semantics, Type};
55
use ra_ide_db::RootDatabase;
66
use ra_syntax::{
77
ast::{self, make, NameOwner},
@@ -99,3 +99,16 @@ fn invert_special_case(expr: &ast::Expr) -> Option<ast::Expr> {
9999
_ => None,
100100
}
101101
}
102+
103+
pub(crate) fn happy_try_variant(sema: &Semantics<RootDatabase>, ty: &Type) -> Option<&'static str> {
104+
let enum_ = match ty.as_adt() {
105+
Some(Adt::Enum(it)) => it,
106+
_ => return None,
107+
};
108+
[("Result", "Ok"), ("Option", "Some")].iter().find_map(|(known_type, happy_case)| {
109+
if &enum_.name(sema.db).to_string() == known_type {
110+
return Some(*happy_case);
111+
}
112+
None
113+
})
114+
}

0 commit comments

Comments
 (0)