|
1 | | -use syntax::ast::{self, AstNode}; |
| 1 | +use syntax::{ |
| 2 | + ast::{self, make, AstNode}, |
| 3 | + ted, |
| 4 | +}; |
2 | 5 |
|
3 | 6 | use crate::{utils::suggest_name, AssistContext, AssistId, AssistKind, Assists}; |
4 | 7 |
|
@@ -42,19 +45,34 @@ pub(crate) fn replace_is_method_with_if_let_method( |
42 | 45 | suggest_name::for_variable(&receiver, &ctx.sema) |
43 | 46 | }; |
44 | 47 |
|
45 | | - let target = call_expr.syntax().text_range(); |
46 | | - |
47 | 48 | let (assist_id, message, text) = if name_ref.text() == "is_some" { |
48 | 49 | ("replace_is_some_with_if_let_some", "Replace `is_some` with `if let Some`", "Some") |
49 | 50 | } else { |
50 | 51 | ("replace_is_ok_with_if_let_ok", "Replace `is_ok` with `if let Ok`", "Ok") |
51 | 52 | }; |
52 | 53 |
|
53 | | - acc.add(AssistId(assist_id, AssistKind::RefactorRewrite), message, target, |edit| { |
54 | | - let var_name = format!("${{0:{}}}", var_name); |
55 | | - let replacement = format!("let {}({}) = {}", text, var_name, receiver); |
56 | | - edit.replace(target, replacement); |
57 | | - }) |
| 54 | + acc.add( |
| 55 | + AssistId(assist_id, AssistKind::RefactorRewrite), |
| 56 | + message, |
| 57 | + call_expr.syntax().text_range(), |
| 58 | + |edit| { |
| 59 | + let call_expr = edit.make_mut(call_expr); |
| 60 | + |
| 61 | + let var_pat = make::ident_pat(false, false, make::name(&var_name)); |
| 62 | + let pat = make::tuple_struct_pat(make::ext::ident_path(text), [var_pat.into()]); |
| 63 | + let let_expr = make::expr_let(pat.into(), receiver).clone_for_update(); |
| 64 | + |
| 65 | + if let Some(cap) = ctx.config.snippet_cap { |
| 66 | + if let Some(ast::Pat::TupleStructPat(pat)) = let_expr.pat() { |
| 67 | + if let Some(first_var) = pat.fields().next() { |
| 68 | + edit.add_placeholder_snippet(cap, first_var); |
| 69 | + } |
| 70 | + } |
| 71 | + } |
| 72 | + |
| 73 | + ted::replace(call_expr.syntax(), let_expr.syntax()); |
| 74 | + }, |
| 75 | + ) |
58 | 76 | } |
59 | 77 | _ => return None, |
60 | 78 | } |
|
0 commit comments