diff options
Diffstat (limited to 'crates/ra_assists/src/handlers/replace_unwrap_with_match.rs')
-rw-r--r-- | crates/ra_assists/src/handlers/replace_unwrap_with_match.rs | 38 |
1 files changed, 22 insertions, 16 deletions
diff --git a/crates/ra_assists/src/handlers/replace_unwrap_with_match.rs b/crates/ra_assists/src/handlers/replace_unwrap_with_match.rs index dcb471edb..c6b73da67 100644 --- a/crates/ra_assists/src/handlers/replace_unwrap_with_match.rs +++ b/crates/ra_assists/src/handlers/replace_unwrap_with_match.rs | |||
@@ -38,26 +38,32 @@ pub(crate) fn replace_unwrap_with_match(ctx: AssistCtx) -> Option<Assist> { | |||
38 | let caller = method_call.expr()?; | 38 | let caller = method_call.expr()?; |
39 | let ty = ctx.sema.type_of_expr(&caller)?; | 39 | let ty = ctx.sema.type_of_expr(&caller)?; |
40 | let happy_variant = TryEnum::from_ty(ctx.sema, &ty)?.happy_case(); | 40 | let happy_variant = TryEnum::from_ty(ctx.sema, &ty)?.happy_case(); |
41 | let target = method_call.syntax().text_range(); | ||
42 | ctx.add_assist( | ||
43 | AssistId("replace_unwrap_with_match"), | ||
44 | "Replace unwrap with match", | ||
45 | target, | ||
46 | |edit| { | ||
47 | let ok_path = make::path_unqualified(make::path_segment(make::name_ref(happy_variant))); | ||
48 | let it = make::bind_pat(make::name("a")).into(); | ||
49 | let ok_tuple = make::tuple_struct_pat(ok_path, iter::once(it)).into(); | ||
41 | 50 | ||
42 | ctx.add_assist(AssistId("replace_unwrap_with_match"), "Replace unwrap with match", |edit| { | 51 | let bind_path = make::path_unqualified(make::path_segment(make::name_ref("a"))); |
43 | let ok_path = make::path_unqualified(make::path_segment(make::name_ref(happy_variant))); | 52 | let ok_arm = make::match_arm(iter::once(ok_tuple), make::expr_path(bind_path)); |
44 | let it = make::bind_pat(make::name("a")).into(); | ||
45 | let ok_tuple = make::tuple_struct_pat(ok_path, iter::once(it)).into(); | ||
46 | 53 | ||
47 | let bind_path = make::path_unqualified(make::path_segment(make::name_ref("a"))); | 54 | let unreachable_call = make::unreachable_macro_call().into(); |
48 | let ok_arm = make::match_arm(iter::once(ok_tuple), make::expr_path(bind_path)); | 55 | let err_arm = |
56 | make::match_arm(iter::once(make::placeholder_pat().into()), unreachable_call); | ||
49 | 57 | ||
50 | let unreachable_call = make::unreachable_macro_call().into(); | 58 | let match_arm_list = make::match_arm_list(vec![ok_arm, err_arm]); |
51 | let err_arm = make::match_arm(iter::once(make::placeholder_pat().into()), unreachable_call); | 59 | let match_expr = make::expr_match(caller.clone(), match_arm_list); |
60 | let match_expr = | ||
61 | IndentLevel::from_node(method_call.syntax()).increase_indent(match_expr); | ||
52 | 62 | ||
53 | let match_arm_list = make::match_arm_list(vec![ok_arm, err_arm]); | 63 | edit.set_cursor(caller.syntax().text_range().start()); |
54 | let match_expr = make::expr_match(caller.clone(), match_arm_list); | 64 | edit.replace_ast::<ast::Expr>(method_call.into(), match_expr); |
55 | let match_expr = IndentLevel::from_node(method_call.syntax()).increase_indent(match_expr); | 65 | }, |
56 | 66 | ) | |
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 | }) | ||
61 | } | 67 | } |
62 | 68 | ||
63 | #[cfg(test)] | 69 | #[cfg(test)] |