|
1 | 1 | use std::iter; |
2 | 2 |
|
3 | 3 | use ra_syntax::{ |
4 | | - ast::{self, make}, |
| 4 | + ast::{self, edit::IndentLevel, make}, |
5 | 5 | AstNode, |
6 | 6 | }; |
7 | 7 |
|
8 | | -use crate::{Assist, AssistCtx, AssistId}; |
9 | | -use ast::edit::IndentLevel; |
| 8 | +use crate::{utils::happy_try_variant, Assist, AssistCtx, AssistId}; |
10 | 9 |
|
11 | 10 | // Assist: replace_unwrap_with_match |
12 | 11 | // |
@@ -38,42 +37,27 @@ pub(crate) fn replace_unwrap_with_match(ctx: AssistCtx) -> Option<Assist> { |
38 | 37 | } |
39 | 38 | let caller = method_call.expr()?; |
40 | 39 | let ty = ctx.sema.type_of_expr(&caller)?; |
| 40 | + let happy_variant = happy_try_variant(ctx.sema, &ty)?; |
41 | 41 |
|
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(); |
43 | 46 |
|
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)); |
54 | 49 |
|
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); |
57 | 52 |
|
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); |
63 | 56 |
|
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 | + }) |
77 | 61 | } |
78 | 62 |
|
79 | 63 | #[cfg(test)] |
|
0 commit comments