diff options
author | Aleksey Kladov <[email protected]> | 2020-05-06 11:51:28 +0100 |
---|---|---|
committer | Aleksey Kladov <[email protected]> | 2020-05-06 11:51:28 +0100 |
commit | 233f01c9ba555e5d06f336cb0ff64e7a83e4a23a (patch) | |
tree | 7922dca3f7c4133e2616257be537428337e479d6 /crates/ra_assists/src/handlers/replace_unwrap_with_match.rs | |
parent | ede8906844e206f252810d58533538cf1fb326d4 (diff) |
Move target to AssistLabel
Target is used for assists sorting, so we need it before we compute
the action.
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)] |