From fd771707187a505c826096fc62ced6ba9b65460e Mon Sep 17 00:00:00 2001
From: Aleksey Kladov <aleksey.kladov@gmail.com>
Date: Wed, 20 May 2020 23:07:17 +0200
Subject: [PATCH 1/2] Snippetify introduce/inline var

---
 .../src/handlers/inline_local_variable.rs     |  47 ++++---
 .../src/handlers/introduce_variable.rs        | 116 ++++++++++--------
 crates/ra_assists/src/tests/generated.rs      |   2 +-
 docs/user/assists.md                          |   2 +-
 4 files changed, 90 insertions(+), 77 deletions(-)

diff --git a/crates/ra_assists/src/handlers/inline_local_variable.rs b/crates/ra_assists/src/handlers/inline_local_variable.rs
index 46d675a4e8c..d26e6884798 100644
--- a/crates/ra_assists/src/handlers/inline_local_variable.rs
+++ b/crates/ra_assists/src/handlers/inline_local_variable.rs
@@ -116,7 +116,6 @@ pub(crate) fn inline_local_variable(acc: &mut Assists, ctx: &AssistContext) -> O
             let replacement = if should_wrap { init_in_paren.clone() } else { init_str.clone() };
             builder.replace(desc.file_range.range, replacement)
         }
-        builder.set_cursor(delete_range.start())
     })
 }
 
@@ -149,7 +148,7 @@ fn foo() {
             r"
 fn bar(a: usize) {}
 fn foo() {
-    <|>1 + 1;
+    1 + 1;
     if 1 > 10 {
     }
 
@@ -183,7 +182,7 @@ fn foo() {
             r"
 fn bar(a: usize) {}
 fn foo() {
-    <|>(1 + 1) + 1;
+    (1 + 1) + 1;
     if (1 + 1) > 10 {
     }
 
@@ -217,7 +216,7 @@ fn foo() {
             r"
 fn bar(a: usize) {}
 fn foo() {
-    <|>bar(1) + 1;
+    bar(1) + 1;
     if bar(1) > 10 {
     }
 
@@ -251,7 +250,7 @@ fn foo() {
             r"
 fn bar(a: usize): usize { a }
 fn foo() {
-    <|>(bar(1) as u64) + 1;
+    (bar(1) as u64) + 1;
     if (bar(1) as u64) > 10 {
     }
 
@@ -283,7 +282,7 @@ fn foo() {
 }",
             r"
 fn foo() {
-    <|>{ 10 + 1 } + 1;
+    { 10 + 1 } + 1;
     if { 10 + 1 } > 10 {
     }
 
@@ -315,7 +314,7 @@ fn foo() {
 }",
             r"
 fn foo() {
-    <|>( 10 + 1 ) + 1;
+    ( 10 + 1 ) + 1;
     if ( 10 + 1 ) > 10 {
     }
 
@@ -353,7 +352,7 @@ fn foo() {
 }",
             r"
 fn foo() {
-    <|>let b = bar(10 + 1) * 10;
+    let b = bar(10 + 1) * 10;
     let c = bar(10 + 1) as usize;
 }",
         );
@@ -373,7 +372,7 @@ fn foo() {
             r"
 fn foo() {
     let x = vec![1, 2, 3];
-    <|>let b = x[0] * 10;
+    let b = x[0] * 10;
     let c = x[0] as usize;
 }",
         );
@@ -393,7 +392,7 @@ fn foo() {
             r"
 fn foo() {
     let bar = vec![1];
-    <|>let b = bar.len() * 10;
+    let b = bar.len() * 10;
     let c = bar.len() as usize;
 }",
         );
@@ -421,7 +420,7 @@ struct Bar {
 
 fn foo() {
     let bar = Bar { foo: 1 };
-    <|>let b = bar.foo * 10;
+    let b = bar.foo * 10;
     let c = bar.foo as usize;
 }",
         );
@@ -442,7 +441,7 @@ fn foo() -> Option<usize> {
             r"
 fn foo() -> Option<usize> {
     let bar = Some(1);
-    <|>let b = bar? * 10;
+    let b = bar? * 10;
     let c = bar? as usize;
     None
 }",
@@ -462,7 +461,7 @@ fn foo() {
             r"
 fn foo() {
     let bar = 10;
-    <|>let b = &bar * 10;
+    let b = &bar * 10;
 }",
         );
     }
@@ -478,7 +477,7 @@ fn foo() {
 }",
             r"
 fn foo() {
-    <|>let b = (10, 20)[0];
+    let b = (10, 20)[0];
 }",
         );
     }
@@ -494,7 +493,7 @@ fn foo() {
 }",
             r"
 fn foo() {
-    <|>let b = [1, 2, 3].len();
+    let b = [1, 2, 3].len();
 }",
         );
     }
@@ -511,7 +510,7 @@ fn foo() {
 }",
             r"
 fn foo() {
-    <|>let b = (10 + 20) * 10;
+    let b = (10 + 20) * 10;
     let c = (10 + 20) as usize;
 }",
         );
@@ -531,7 +530,7 @@ fn foo() {
             r"
 fn foo() {
     let d = 10;
-    <|>let b = d * 10;
+    let b = d * 10;
     let c = d as usize;
 }",
         );
@@ -549,7 +548,7 @@ fn foo() {
 }",
             r"
 fn foo() {
-    <|>let b = { 10 } * 10;
+    let b = { 10 } * 10;
     let c = { 10 } as usize;
 }",
         );
@@ -569,7 +568,7 @@ fn foo() {
 }",
             r"
 fn foo() {
-    <|>let b = (10 + 20) * 10;
+    let b = (10 + 20) * 10;
     let c = (10 + 20, 20);
     let d = [10 + 20, 10];
     let e = (10 + 20);
@@ -588,7 +587,7 @@ fn foo() {
 }",
             r"
 fn foo() {
-    <|>for i in vec![10, 20] {}
+    for i in vec![10, 20] {}
 }",
         );
     }
@@ -604,7 +603,7 @@ fn foo() {
 }",
             r"
 fn foo() {
-    <|>while 1 > 0 {}
+    while 1 > 0 {}
 }",
         );
     }
@@ -622,7 +621,7 @@ fn foo() {
 }",
             r"
 fn foo() {
-    <|>loop {
+    loop {
         break 1 + 1;
     }
 }",
@@ -640,7 +639,7 @@ fn foo() {
 }",
             r"
 fn foo() {
-    <|>return 1 > 0;
+    return 1 > 0;
 }",
         );
     }
@@ -656,7 +655,7 @@ fn foo() {
 }",
             r"
 fn foo() {
-    <|>match 1 > 0 {}
+    match 1 > 0 {}
 }",
         );
     }
diff --git a/crates/ra_assists/src/handlers/introduce_variable.rs b/crates/ra_assists/src/handlers/introduce_variable.rs
index 56c610fedd9..31d6539f7a7 100644
--- a/crates/ra_assists/src/handlers/introduce_variable.rs
+++ b/crates/ra_assists/src/handlers/introduce_variable.rs
@@ -4,7 +4,7 @@ use ra_syntax::{
         BLOCK_EXPR, BREAK_EXPR, COMMENT, LAMBDA_EXPR, LOOP_EXPR, MATCH_ARM, PATH_EXPR, RETURN_EXPR,
         WHITESPACE,
     },
-    SyntaxNode, TextSize,
+    SyntaxNode,
 };
 use stdx::format_to;
 use test_utils::mark;
@@ -23,7 +23,7 @@ use crate::{AssistContext, AssistId, Assists};
 // ->
 // ```
 // fn main() {
-//     let var_name = (1 + 2);
+//     let $0var_name = (1 + 2);
 //     var_name * 4;
 // }
 // ```
@@ -46,14 +46,13 @@ pub(crate) fn introduce_variable(acc: &mut Assists, ctx: &AssistContext) -> Opti
     acc.add(AssistId("introduce_variable"), "Extract into variable", target, move |edit| {
         let mut buf = String::new();
 
-        let cursor_offset = if wrap_in_block {
+        if wrap_in_block {
             buf.push_str("{ let var_name = ");
-            TextSize::of("{ let ")
         } else {
             buf.push_str("let var_name = ");
-            TextSize::of("let ")
         };
         format_to!(buf, "{}", expr.syntax());
+
         let full_stmt = ast::ExprStmt::cast(anchor_stmt.clone());
         let is_full_stmt = if let Some(expr_stmt) = &full_stmt {
             Some(expr.syntax().clone()) == expr_stmt.expr().map(|e| e.syntax().clone())
@@ -65,28 +64,43 @@ pub(crate) fn introduce_variable(acc: &mut Assists, ctx: &AssistContext) -> Opti
             if full_stmt.unwrap().semicolon_token().is_none() {
                 buf.push_str(";");
             }
-            edit.replace(expr.syntax().text_range(), buf);
-        } else {
-            buf.push_str(";");
-
-            // We want to maintain the indent level,
-            // but we do not want to duplicate possible
-            // extra newlines in the indent block
-            let text = indent.text();
-            if text.starts_with('\n') {
-                buf.push_str("\n");
-                buf.push_str(text.trim_start_matches('\n'));
-            } else {
-                buf.push_str(text);
-            }
-
-            edit.replace(expr.syntax().text_range(), "var_name".to_string());
-            edit.insert(anchor_stmt.text_range().start(), buf);
-            if wrap_in_block {
-                edit.insert(anchor_stmt.text_range().end(), " }");
+            let offset = expr.syntax().text_range();
+            match ctx.config.snippet_cap {
+                Some(cap) => {
+                    let snip = buf.replace("let var_name", "let $0var_name");
+                    edit.replace_snippet(cap, offset, snip)
+                }
+                None => edit.replace(offset, buf),
             }
+            return;
+        }
+
+        buf.push_str(";");
+
+        // We want to maintain the indent level,
+        // but we do not want to duplicate possible
+        // extra newlines in the indent block
+        let text = indent.text();
+        if text.starts_with('\n') {
+            buf.push_str("\n");
+            buf.push_str(text.trim_start_matches('\n'));
+        } else {
+            buf.push_str(text);
+        }
+
+        edit.replace(expr.syntax().text_range(), "var_name".to_string());
+        let offset = anchor_stmt.text_range().start();
+        match ctx.config.snippet_cap {
+            Some(cap) => {
+                let snip = buf.replace("let var_name", "let $0var_name");
+                edit.insert_snippet(cap, offset, snip)
+            }
+            None => edit.insert(offset, buf),
+        }
+
+        if wrap_in_block {
+            edit.insert(anchor_stmt.text_range().end(), " }");
         }
-        edit.set_cursor(anchor_stmt.text_range().start() + cursor_offset);
     })
 }
 
@@ -144,15 +158,15 @@ mod tests {
     fn test_introduce_var_simple() {
         check_assist(
             introduce_variable,
-            "
+            r#"
 fn foo() {
     foo(<|>1 + 1<|>);
-}",
-            "
+}"#,
+            r#"
 fn foo() {
-    let <|>var_name = 1 + 1;
+    let $0var_name = 1 + 1;
     foo(var_name);
-}",
+}"#,
         );
     }
 
@@ -167,14 +181,14 @@ fn foo() {
         mark::check!(test_introduce_var_expr_stmt);
         check_assist(
             introduce_variable,
-            "
+            r#"
 fn foo() {
     <|>1 + 1<|>;
-}",
-            "
+}"#,
+            r#"
 fn foo() {
-    let <|>var_name = 1 + 1;
-}",
+    let $0var_name = 1 + 1;
+}"#,
         );
         check_assist(
             introduce_variable,
@@ -185,7 +199,7 @@ fn foo() {
 }",
             "
 fn foo() {
-    let <|>var_name = { let x = 0; x };
+    let $0var_name = { let x = 0; x };
     something_else();
 }",
         );
@@ -201,7 +215,7 @@ fn foo() {
 }",
             "
 fn foo() {
-    let <|>var_name = 1;
+    let $0var_name = 1;
     var_name + 1;
 }",
         );
@@ -218,7 +232,7 @@ fn foo() {
 }",
             "
 fn foo() {
-    let <|>var_name = 1 + 1;
+    let $0var_name = 1 + 1;
     bar(var_name)
 }",
         );
@@ -230,7 +244,7 @@ fn foo() {
 }",
             "
 fn foo() {
-    let <|>var_name = bar(1 + 1);
+    let $0var_name = bar(1 + 1);
     var_name
 }",
         )
@@ -253,7 +267,7 @@ fn main() {
 fn main() {
     let x = true;
     let tuple = match x {
-        true => { let <|>var_name = 2 + 2; (var_name, true) }
+        true => { let $0var_name = 2 + 2; (var_name, true) }
         _ => (0, false)
     };
 }
@@ -283,7 +297,7 @@ fn main() {
     let tuple = match x {
         true => {
             let y = 1;
-            let <|>var_name = 2 + y;
+            let $0var_name = 2 + y;
             (var_name, true)
         }
         _ => (0, false)
@@ -304,7 +318,7 @@ fn main() {
 ",
             "
 fn main() {
-    let lambda = |x: u32| { let <|>var_name = x * 2; var_name };
+    let lambda = |x: u32| { let $0var_name = x * 2; var_name };
 }
 ",
         );
@@ -321,7 +335,7 @@ fn main() {
 ",
             "
 fn main() {
-    let lambda = |x: u32| { let <|>var_name = x * 2; var_name };
+    let lambda = |x: u32| { let $0var_name = x * 2; var_name };
 }
 ",
         );
@@ -338,7 +352,7 @@ fn main() {
 ",
             "
 fn main() {
-    let <|>var_name = Some(true);
+    let $0var_name = Some(true);
     let o = var_name;
 }
 ",
@@ -356,7 +370,7 @@ fn main() {
 ",
             "
 fn main() {
-    let <|>var_name = bar.foo();
+    let $0var_name = bar.foo();
     let v = var_name;
 }
 ",
@@ -374,7 +388,7 @@ fn foo() -> u32 {
 ",
             "
 fn foo() -> u32 {
-    let <|>var_name = 2 + 2;
+    let $0var_name = 2 + 2;
     return var_name;
 }
 ",
@@ -396,7 +410,7 @@ fn foo() -> u32 {
 fn foo() -> u32 {
 
 
-    let <|>var_name = 2 + 2;
+    let $0var_name = 2 + 2;
     return var_name;
 }
 ",
@@ -413,7 +427,7 @@ fn foo() -> u32 {
             "
 fn foo() -> u32 {
 
-        let <|>var_name = 2 + 2;
+        let $0var_name = 2 + 2;
         return var_name;
 }
 ",
@@ -438,7 +452,7 @@ fn foo() -> u32 {
     // bar
 
 
-    let <|>var_name = 2 + 2;
+    let $0var_name = 2 + 2;
     return var_name;
 }
 ",
@@ -459,7 +473,7 @@ fn main() {
             "
 fn main() {
     let result = loop {
-        let <|>var_name = 2 + 2;
+        let $0var_name = 2 + 2;
         break var_name;
     };
 }
@@ -478,7 +492,7 @@ fn main() {
 ",
             "
 fn main() {
-    let <|>var_name = 0f32 as u32;
+    let $0var_name = 0f32 as u32;
     let v = var_name;
 }
 ",
diff --git a/crates/ra_assists/src/tests/generated.rs b/crates/ra_assists/src/tests/generated.rs
index 3e6654c1758..0eeb5c19941 100644
--- a/crates/ra_assists/src/tests/generated.rs
+++ b/crates/ra_assists/src/tests/generated.rs
@@ -443,7 +443,7 @@ fn main() {
 "#####,
         r#####"
 fn main() {
-    let var_name = (1 + 2);
+    let $0var_name = (1 + 2);
     var_name * 4;
 }
 "#####,
diff --git a/docs/user/assists.md b/docs/user/assists.md
index 51807ffdac5..a6e27d67f3c 100644
--- a/docs/user/assists.md
+++ b/docs/user/assists.md
@@ -426,7 +426,7 @@ fn main() {
 
 // AFTER
 fn main() {
-    let var_name = (1 + 2);
+    let $0var_name = (1 + 2);
     var_name * 4;
 }
 ```

From 5e13e4eba17fe0d55afa76c8d5ff495228283c4e Mon Sep 17 00:00:00 2001
From: Aleksey Kladov <aleksey.kladov@gmail.com>
Date: Wed, 20 May 2020 23:14:31 +0200
Subject: [PATCH 2/2] More snippets

---
 .../ra_assists/src/handlers/early_return.rs   | 18 ++++-----
 .../ra_assists/src/handlers/merge_imports.rs  | 22 +++++------
 .../src/handlers/merge_match_arms.rs          | 25 +++---------
 crates/ra_assists/src/handlers/move_guard.rs  | 33 ++++++----------
 crates/ra_assists/src/handlers/remove_dbg.rs  | 39 +++++--------------
 crates/ra_assists/src/handlers/remove_mut.rs  |  5 +--
 6 files changed, 45 insertions(+), 97 deletions(-)

diff --git a/crates/ra_assists/src/handlers/early_return.rs b/crates/ra_assists/src/handlers/early_return.rs
index 66b296081d1..4cc75a7ce2d 100644
--- a/crates/ra_assists/src/handlers/early_return.rs
+++ b/crates/ra_assists/src/handlers/early_return.rs
@@ -97,7 +97,6 @@ pub(crate) fn convert_to_guarded_return(acc: &mut Assists, ctx: &AssistContext)
     }
 
     then_block.syntax().last_child_or_token().filter(|t| t.kind() == R_CURLY)?;
-    let cursor_position = ctx.offset();
 
     let target = if_expr.syntax().text_range();
     acc.add(AssistId("convert_to_guarded_return"), "Convert to guarded return", target, |edit| {
@@ -148,7 +147,6 @@ pub(crate) fn convert_to_guarded_return(acc: &mut Assists, ctx: &AssistContext)
             }
         };
         edit.replace_ast(parent_block, ast::BlockExpr::cast(new_block).unwrap());
-        edit.set_cursor(cursor_position);
 
         fn replace(
             new_expr: &SyntaxNode,
@@ -207,7 +205,7 @@ mod tests {
             r#"
             fn main() {
                 bar();
-                if<|> !true {
+                if !true {
                     return;
                 }
                 foo();
@@ -237,7 +235,7 @@ mod tests {
             r#"
             fn main(n: Option<String>) {
                 bar();
-                le<|>t n = match n {
+                let n = match n {
                     Some(it) => it,
                     _ => return,
                 };
@@ -263,7 +261,7 @@ mod tests {
             "#,
             r#"
             fn main() {
-                le<|>t x = match Err(92) {
+                let x = match Err(92) {
                     Ok(it) => it,
                     _ => return,
                 };
@@ -291,7 +289,7 @@ mod tests {
             r#"
             fn main(n: Option<String>) {
                 bar();
-                le<|>t n = match n {
+                let n = match n {
                     Ok(it) => it,
                     _ => return,
                 };
@@ -321,7 +319,7 @@ mod tests {
             r#"
             fn main() {
                 while true {
-                    if<|> !true {
+                    if !true {
                         continue;
                     }
                     foo();
@@ -349,7 +347,7 @@ mod tests {
             r#"
             fn main() {
                 while true {
-                    le<|>t n = match n {
+                    let n = match n {
                         Some(it) => it,
                         _ => continue,
                     };
@@ -378,7 +376,7 @@ mod tests {
             r#"
             fn main() {
                 loop {
-                    if<|> !true {
+                    if !true {
                         continue;
                     }
                     foo();
@@ -406,7 +404,7 @@ mod tests {
             r#"
             fn main() {
                 loop {
-                    le<|>t n = match n {
+                    let n = match n {
                         Some(it) => it,
                         _ => continue,
                     };
diff --git a/crates/ra_assists/src/handlers/merge_imports.rs b/crates/ra_assists/src/handlers/merge_imports.rs
index ac3e53c2734..972d1624194 100644
--- a/crates/ra_assists/src/handlers/merge_imports.rs
+++ b/crates/ra_assists/src/handlers/merge_imports.rs
@@ -58,8 +58,6 @@ pub(crate) fn merge_imports(acc: &mut Assists, ctx: &AssistContext) -> Option<()
     let target = tree.syntax().text_range();
     acc.add(AssistId("merge_imports"), "Merge imports", target, |builder| {
         builder.rewrite(rewriter);
-        // FIXME: we only need because our diff is imprecise
-        builder.set_cursor(offset);
     })
 }
 
@@ -142,7 +140,7 @@ use std::fmt<|>::Debug;
 use std::fmt::Display;
 ",
             r"
-use std::fmt<|>::{Debug, Display};
+use std::fmt::{Debug, Display};
 ",
         )
     }
@@ -156,7 +154,7 @@ use std::fmt::Debug;
 use std::fmt<|>::Display;
 ",
             r"
-use std::fmt:<|>:{Display, Debug};
+use std::fmt::{Display, Debug};
 ",
         );
     }
@@ -169,7 +167,7 @@ use std::fmt:<|>:{Display, Debug};
 use std::{fmt<|>::Debug, fmt::Display};
 ",
             r"
-use std::{fmt<|>::{Debug, Display}};
+use std::{fmt::{Debug, Display}};
 ",
         );
         check_assist(
@@ -178,7 +176,7 @@ use std::{fmt<|>::{Debug, Display}};
 use std::{fmt::Debug, fmt<|>::Display};
 ",
             r"
-use std::{fmt::<|>{Display, Debug}};
+use std::{fmt::{Display, Debug}};
 ",
         );
     }
@@ -192,7 +190,7 @@ use std<|>::cell::*;
 use std::str;
 ",
             r"
-use std<|>::{cell::*, str};
+use std::{cell::*, str};
 ",
         )
     }
@@ -206,7 +204,7 @@ use std<|>::cell::*;
 use std::str::*;
 ",
             r"
-use std<|>::{cell::*, str::*};
+use std::{cell::*, str::*};
 ",
         )
     }
@@ -222,7 +220,7 @@ use foo::baz;
 /// Doc comment
 ",
             r"
-use foo<|>::{bar, baz};
+use foo::{bar, baz};
 
 /// Doc comment
 ",
@@ -241,7 +239,7 @@ use {
 ",
             r"
 use {
-    foo<|>::{bar, baz},
+    foo::{bar, baz},
 };
 ",
         );
@@ -255,7 +253,7 @@ use {
 ",
             r"
 use {
-    foo::{bar<|>, baz},
+    foo::{bar, baz},
 };
 ",
         );
@@ -272,7 +270,7 @@ use foo::<|>{
 };
 ",
             r"
-use foo::{<|>
+use foo::{
     FooBar,
 bar::baz};
 ",
diff --git a/crates/ra_assists/src/handlers/merge_match_arms.rs b/crates/ra_assists/src/handlers/merge_match_arms.rs
index d4e38aa6a59..ca04ec671a0 100644
--- a/crates/ra_assists/src/handlers/merge_match_arms.rs
+++ b/crates/ra_assists/src/handlers/merge_match_arms.rs
@@ -3,7 +3,7 @@ use std::iter::successors;
 use ra_syntax::{
     algo::neighbor,
     ast::{self, AstNode},
-    Direction, TextSize,
+    Direction,
 };
 
 use crate::{AssistContext, AssistId, Assists, TextRange};
@@ -41,17 +41,6 @@ pub(crate) fn merge_match_arms(acc: &mut Assists, ctx: &AssistContext) -> Option
     let current_expr = current_arm.expr()?;
     let current_text_range = current_arm.syntax().text_range();
 
-    enum CursorPos {
-        InExpr(TextSize),
-        InPat(TextSize),
-    }
-    let cursor_pos = ctx.offset();
-    let cursor_pos = if current_expr.syntax().text_range().contains(cursor_pos) {
-        CursorPos::InExpr(current_text_range.end() - cursor_pos)
-    } else {
-        CursorPos::InPat(cursor_pos)
-    };
-
     // We check if the following match arms match this one. We could, but don't,
     // compare to the previous match arm as well.
     let arms_to_merge = successors(Some(current_arm), |it| neighbor(it, Direction::Next))
@@ -87,10 +76,6 @@ pub(crate) fn merge_match_arms(acc: &mut Assists, ctx: &AssistContext) -> Option
         let start = arms_to_merge.first().unwrap().syntax().text_range().start();
         let end = arms_to_merge.last().unwrap().syntax().text_range().end();
 
-        edit.set_cursor(match cursor_pos {
-            CursorPos::InExpr(back_offset) => start + TextSize::of(&arm) - back_offset,
-            CursorPos::InPat(offset) => offset,
-        });
         edit.replace(TextRange::new(start, end), arm);
     })
 }
@@ -132,7 +117,7 @@ mod tests {
             fn main() {
                 let x = X::A;
                 let y = match x {
-                    X::A | X::B => { 1i32<|> }
+                    X::A | X::B => { 1i32 }
                     X::C => { 2i32 }
                 }
             }
@@ -164,7 +149,7 @@ mod tests {
             fn main() {
                 let x = X::A;
                 let y = match x {
-                    X::A | X::B | X::C | X::D => {<|> 1i32 },
+                    X::A | X::B | X::C | X::D => { 1i32 },
                     X::E => { 2i32 },
                 }
             }
@@ -197,7 +182,7 @@ mod tests {
                 let x = X::A;
                 let y = match x {
                     X::A => { 1i32 },
-                    _ => { 2i<|>32 }
+                    _ => { 2i32 }
                 }
             }
             "#,
@@ -226,7 +211,7 @@ mod tests {
 
             fn main() {
                 match X::A {
-                    X::A<|> | X::B | X::C => 92,
+                    X::A | X::B | X::C => 92,
                     X::D => 62,
                     _ => panic!(),
                 }
diff --git a/crates/ra_assists/src/handlers/move_guard.rs b/crates/ra_assists/src/handlers/move_guard.rs
index fc0335b5785..7edcf074895 100644
--- a/crates/ra_assists/src/handlers/move_guard.rs
+++ b/crates/ra_assists/src/handlers/move_guard.rs
@@ -1,7 +1,6 @@
 use ra_syntax::{
-    ast,
-    ast::{AstNode, AstToken, IfExpr, MatchArm},
-    TextSize,
+    ast::{AstNode, IfExpr, MatchArm},
+    SyntaxKind::WHITESPACE,
 };
 
 use crate::{AssistContext, AssistId, Assists};
@@ -42,24 +41,15 @@ pub(crate) fn move_guard_to_arm_body(acc: &mut Assists, ctx: &AssistContext) ->
 
     let target = guard.syntax().text_range();
     acc.add(AssistId("move_guard_to_arm_body"), "Move guard to arm body", target, |edit| {
-        let offseting_amount = match space_before_guard.and_then(|it| it.into_token()) {
-            Some(tok) => {
-                if ast::Whitespace::cast(tok.clone()).is_some() {
-                    let ele = tok.text_range();
-                    edit.delete(ele);
-                    ele.len()
-                } else {
-                    TextSize::from(0)
-                }
+        match space_before_guard {
+            Some(element) if element.kind() == WHITESPACE => {
+                edit.delete(element.text_range());
             }
-            _ => TextSize::from(0),
+            _ => (),
         };
 
         edit.delete(guard.syntax().text_range());
         edit.replace_node_and_indent(arm_expr.syntax(), buf);
-        edit.set_cursor(
-            arm_expr.syntax().text_range().start() + TextSize::from(3) - offseting_amount,
-        );
     })
 }
 
@@ -124,7 +114,6 @@ pub(crate) fn move_arm_cond_to_match_guard(acc: &mut Assists, ctx: &AssistContex
             }
 
             edit.insert(match_pat.syntax().text_range().end(), buf);
-            edit.set_cursor(match_pat.syntax().text_range().end() + TextSize::from(1));
         },
     )
 }
@@ -172,7 +161,7 @@ mod tests {
                 let t = 'a';
                 let chars = "abcd";
                 match t {
-                    '\r' => if chars.clone().next() == Some('\n') { <|>false },
+                    '\r' => if chars.clone().next() == Some('\n') { false },
                     _ => true
                 }
             }
@@ -195,7 +184,7 @@ mod tests {
             r#"
             fn f() {
                 match x {
-                    y @ 4 | y @ 5 => if y > 5 { <|>true },
+                    y @ 4 | y @ 5 => if y > 5 { true },
                     _ => false
                 }
             }
@@ -222,7 +211,7 @@ mod tests {
                 let t = 'a';
                 let chars = "abcd";
                 match t {
-                    '\r' <|>if chars.clone().next() == Some('\n') => false,
+                    '\r' if chars.clone().next() == Some('\n') => false,
                     _ => true
                 }
             }
@@ -266,7 +255,7 @@ mod tests {
                 let t = 'a';
                 let chars = "abcd";
                 match t {
-                    '\r' <|>if chars.clone().next().is_some() => {  },
+                    '\r' if chars.clone().next().is_some() => {  },
                     _ => true
                 }
             }
@@ -296,7 +285,7 @@ mod tests {
                 let mut t = 'a';
                 let chars = "abcd";
                 match t {
-                    '\r' <|>if chars.clone().next().is_some() => {
+                    '\r' if chars.clone().next().is_some() => {
                         t = 'e';
                         false
                     },
diff --git a/crates/ra_assists/src/handlers/remove_dbg.rs b/crates/ra_assists/src/handlers/remove_dbg.rs
index 8eef578cf40..961ee1731ad 100644
--- a/crates/ra_assists/src/handlers/remove_dbg.rs
+++ b/crates/ra_assists/src/handlers/remove_dbg.rs
@@ -29,26 +29,6 @@ pub(crate) fn remove_dbg(acc: &mut Assists, ctx: &AssistContext) -> Option<()> {
 
     let macro_range = macro_call.syntax().text_range();
 
-    // If the cursor is inside the macro call, we'll try to maintain the cursor
-    // position by subtracting the length of dbg!( from the start of the file
-    // range, otherwise we'll default to using the start of the macro call
-    let cursor_pos = {
-        let file_range = ctx.frange.range;
-
-        let offset_start = file_range
-            .start()
-            .checked_sub(macro_range.start())
-            .unwrap_or_else(|| TextSize::from(0));
-
-        let dbg_size = TextSize::of("dbg!(");
-
-        if offset_start > dbg_size {
-            file_range.start() - dbg_size
-        } else {
-            macro_range.start()
-        }
-    };
-
     let macro_content = {
         let macro_args = macro_call.token_tree()?.syntax().clone();
 
@@ -58,9 +38,8 @@ pub(crate) fn remove_dbg(acc: &mut Assists, ctx: &AssistContext) -> Option<()> {
     };
 
     let target = macro_call.syntax().text_range();
-    acc.add(AssistId("remove_dbg"), "Remove dbg!()", target, |edit| {
-        edit.replace(macro_range, macro_content);
-        edit.set_cursor(cursor_pos);
+    acc.add(AssistId("remove_dbg"), "Remove dbg!()", target, |builder| {
+        builder.replace(macro_range, macro_content);
     })
 }
 
@@ -94,13 +73,13 @@ mod tests {
 
     #[test]
     fn test_remove_dbg() {
-        check_assist(remove_dbg, "<|>dbg!(1 + 1)", "<|>1 + 1");
+        check_assist(remove_dbg, "<|>dbg!(1 + 1)", "1 + 1");
 
-        check_assist(remove_dbg, "dbg!<|>((1 + 1))", "<|>(1 + 1)");
+        check_assist(remove_dbg, "dbg!<|>((1 + 1))", "(1 + 1)");
 
-        check_assist(remove_dbg, "dbg!(1 <|>+ 1)", "1 <|>+ 1");
+        check_assist(remove_dbg, "dbg!(1 <|>+ 1)", "1 + 1");
 
-        check_assist(remove_dbg, "let _ = <|>dbg!(1 + 1)", "let _ = <|>1 + 1");
+        check_assist(remove_dbg, "let _ = <|>dbg!(1 + 1)", "let _ = 1 + 1");
 
         check_assist(
             remove_dbg,
@@ -113,7 +92,7 @@ fn foo(n: usize) {
 ",
             "
 fn foo(n: usize) {
-    if let Some(_) = n.<|>checked_sub(4) {
+    if let Some(_) = n.checked_sub(4) {
         // ...
     }
 }
@@ -122,8 +101,8 @@ fn foo(n: usize) {
     }
     #[test]
     fn test_remove_dbg_with_brackets_and_braces() {
-        check_assist(remove_dbg, "dbg![<|>1 + 1]", "<|>1 + 1");
-        check_assist(remove_dbg, "dbg!{<|>1 + 1}", "<|>1 + 1");
+        check_assist(remove_dbg, "dbg![<|>1 + 1]", "1 + 1");
+        check_assist(remove_dbg, "dbg!{<|>1 + 1}", "1 + 1");
     }
 
     #[test]
diff --git a/crates/ra_assists/src/handlers/remove_mut.rs b/crates/ra_assists/src/handlers/remove_mut.rs
index dce546db79d..fe4eada0340 100644
--- a/crates/ra_assists/src/handlers/remove_mut.rs
+++ b/crates/ra_assists/src/handlers/remove_mut.rs
@@ -26,8 +26,7 @@ pub(crate) fn remove_mut(acc: &mut Assists, ctx: &AssistContext) -> Option<()> {
     };
 
     let target = mut_token.text_range();
-    acc.add(AssistId("remove_mut"), "Remove `mut` keyword", target, |edit| {
-        edit.set_cursor(delete_from);
-        edit.delete(TextRange::new(delete_from, delete_to));
+    acc.add(AssistId("remove_mut"), "Remove `mut` keyword", target, |builder| {
+        builder.delete(TextRange::new(delete_from, delete_to));
     })
 }