|
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