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 | 61 |
1 files changed, 34 insertions, 27 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 cff7dfb81..5f9705be1 100644 --- a/crates/ra_assists/src/handlers/replace_unwrap_with_match.rs +++ b/crates/ra_assists/src/handlers/replace_unwrap_with_match.rs | |||
@@ -11,7 +11,7 @@ use ra_syntax::{ | |||
11 | 11 | ||
12 | use crate::{ | 12 | use crate::{ |
13 | utils::{render_snippet, Cursor, TryEnum}, | 13 | utils::{render_snippet, Cursor, TryEnum}, |
14 | AssistContext, AssistId, Assists, | 14 | AssistContext, AssistId, AssistKind, Assists, |
15 | }; | 15 | }; |
16 | 16 | ||
17 | // Assist: replace_unwrap_with_match | 17 | // Assist: replace_unwrap_with_match |
@@ -46,37 +46,44 @@ pub(crate) fn replace_unwrap_with_match(acc: &mut Assists, ctx: &AssistContext) | |||
46 | let ty = ctx.sema.type_of_expr(&caller)?; | 46 | let ty = ctx.sema.type_of_expr(&caller)?; |
47 | let happy_variant = TryEnum::from_ty(&ctx.sema, &ty)?.happy_case(); | 47 | let happy_variant = TryEnum::from_ty(&ctx.sema, &ty)?.happy_case(); |
48 | let target = method_call.syntax().text_range(); | 48 | let target = method_call.syntax().text_range(); |
49 | acc.add(AssistId("replace_unwrap_with_match"), "Replace unwrap with match", target, |builder| { | 49 | acc.add( |
50 | let ok_path = make::path_unqualified(make::path_segment(make::name_ref(happy_variant))); | 50 | AssistId("replace_unwrap_with_match"), |
51 | let it = make::bind_pat(make::name("a")).into(); | 51 | AssistKind::RefactorRewrite, |
52 | let ok_tuple = make::tuple_struct_pat(ok_path, iter::once(it)).into(); | 52 | "Replace unwrap with match", |
53 | target, | ||
54 | |builder| { | ||
55 | let ok_path = make::path_unqualified(make::path_segment(make::name_ref(happy_variant))); | ||
56 | let it = make::bind_pat(make::name("a")).into(); | ||
57 | let ok_tuple = make::tuple_struct_pat(ok_path, iter::once(it)).into(); | ||
53 | 58 | ||
54 | let bind_path = make::path_unqualified(make::path_segment(make::name_ref("a"))); | 59 | let bind_path = make::path_unqualified(make::path_segment(make::name_ref("a"))); |
55 | let ok_arm = make::match_arm(iter::once(ok_tuple), make::expr_path(bind_path)); | 60 | let ok_arm = make::match_arm(iter::once(ok_tuple), make::expr_path(bind_path)); |
56 | 61 | ||
57 | let unreachable_call = make::expr_unreachable(); | 62 | let unreachable_call = make::expr_unreachable(); |
58 | let err_arm = make::match_arm(iter::once(make::placeholder_pat().into()), unreachable_call); | 63 | let err_arm = |
64 | make::match_arm(iter::once(make::placeholder_pat().into()), unreachable_call); | ||
59 | 65 | ||
60 | let match_arm_list = make::match_arm_list(vec![ok_arm, err_arm]); | 66 | let match_arm_list = make::match_arm_list(vec![ok_arm, err_arm]); |
61 | let match_expr = make::expr_match(caller.clone(), match_arm_list) | 67 | let match_expr = make::expr_match(caller.clone(), match_arm_list) |
62 | .indent(IndentLevel::from_node(method_call.syntax())); | 68 | .indent(IndentLevel::from_node(method_call.syntax())); |
63 | 69 | ||
64 | let range = method_call.syntax().text_range(); | 70 | let range = method_call.syntax().text_range(); |
65 | match ctx.config.snippet_cap { | 71 | match ctx.config.snippet_cap { |
66 | Some(cap) => { | 72 | Some(cap) => { |
67 | let err_arm = match_expr | 73 | let err_arm = match_expr |
68 | .syntax() | 74 | .syntax() |
69 | .descendants() | 75 | .descendants() |
70 | .filter_map(ast::MatchArm::cast) | 76 | .filter_map(ast::MatchArm::cast) |
71 | .last() | 77 | .last() |
72 | .unwrap(); | 78 | .unwrap(); |
73 | let snippet = | 79 | let snippet = |
74 | render_snippet(cap, match_expr.syntax(), Cursor::Before(err_arm.syntax())); | 80 | render_snippet(cap, match_expr.syntax(), Cursor::Before(err_arm.syntax())); |
75 | builder.replace_snippet(cap, range, snippet) | 81 | builder.replace_snippet(cap, range, snippet) |
82 | } | ||
83 | None => builder.replace(range, match_expr.to_string()), | ||
76 | } | 84 | } |
77 | None => builder.replace(range, match_expr.to_string()), | 85 | }, |
78 | } | 86 | ) |
79 | }) | ||
80 | } | 87 | } |
81 | 88 | ||
82 | #[cfg(test)] | 89 | #[cfg(test)] |