]> git.lizzy.rs Git - rust.git/commitdiff
Preserve indentation
authorJonas Schievink <jonasschievink@gmail.com>
Wed, 2 Jun 2021 20:27:12 +0000 (22:27 +0200)
committerJonas Schievink <jonasschievink@gmail.com>
Wed, 2 Jun 2021 20:27:12 +0000 (22:27 +0200)
crates/ide_assists/src/handlers/extract_type_alias.rs

index a66f6abeaf3a7778a0d4510fa00f74814f2cf3fb..4bccf59847512e74ccb846c810f74dda28a25226 100644 (file)
@@ -1,5 +1,5 @@
 use syntax::{
-    ast::{self, AstNode},
+    ast::{self, edit::IndentLevel, AstNode},
     match_ast,
 };
 
@@ -31,10 +31,12 @@ pub(crate) fn extract_type_alias(acc: &mut Assists, ctx: &AssistContext) -> Opti
     let item = ctx.find_node_at_offset::<ast::Item>()?;
     let insert = match_ast! {
         match (item.syntax().parent()?) {
-            ast::AssocItemList(it) => it.syntax().parent()?.text_range().start(),
-            _ => item.syntax().text_range().start(),
+            ast::AssocItemList(it) => it.syntax().parent()?.clone(),
+            _ => item.syntax().clone(),
         }
     };
+    let indent = IndentLevel::from_node(&insert);
+    let insert = insert.text_range().start();
     let target = node.syntax().text_range();
 
     acc.add(
@@ -46,10 +48,14 @@ pub(crate) fn extract_type_alias(acc: &mut Assists, ctx: &AssistContext) -> Opti
             builder.replace(target, "Type");
             match ctx.config.snippet_cap {
                 Some(cap) => {
-                    builder.insert_snippet(cap, insert, format!("type $0Type = {};\n\n", node));
+                    builder.insert_snippet(
+                        cap,
+                        insert,
+                        format!("type $0Type = {};\n\n{}", node, indent),
+                    );
                 }
                 None => {
-                    builder.insert(insert, format!("type Type = {};\n\n", node));
+                    builder.insert(insert, format!("type Type = {};\n\n{}", node, indent));
                 }
             }
         },
@@ -191,4 +197,23 @@ fn f() -> Type {}
             "#,
         );
     }
+
+    #[test]
+    fn indentation() {
+        check_assist(
+            extract_type_alias,
+            r#"
+mod m {
+    fn f() -> $0u8$0 {}
+}
+            "#,
+            r#"
+mod m {
+    type $0Type = u8;
+
+    fn f() -> Type {}
+}
+            "#,
+        );
+    }
 }