about summary refs log tree commit diff
diff options
context:
space:
mode:
authorponyii <ponyii@protonmail.com>2023-05-06 22:04:47 +0400
committerponyii <ponyii@protonmail.com>2023-05-10 16:35:43 +0400
commita0db4781dca403a33fcc9209f71fa1a26387d05c (patch)
tree8ef3c7fad074951b58fe0a9a46ab046b1f451245
parent5ee39a6ee50e6ddfdf5ac5532bbd13e268b3bf36 (diff)
downloadrust-a0db4781dca403a33fcc9209f71fa1a26387d05c.tar.gz
rust-a0db4781dca403a33fcc9209f71fa1a26387d05c.zip
`generate_derive` no longer breaks indentation
-rw-r--r--crates/ide-assists/src/handlers/generate_derive.rs41
1 files changed, 39 insertions, 2 deletions
diff --git a/crates/ide-assists/src/handlers/generate_derive.rs b/crates/ide-assists/src/handlers/generate_derive.rs
index 339245b94ec..78ac2eb30e5 100644
--- a/crates/ide-assists/src/handlers/generate_derive.rs
+++ b/crates/ide-assists/src/handlers/generate_derive.rs
@@ -1,5 +1,5 @@
 use syntax::{
-    ast::{self, AstNode, HasAttrs},
+    ast::{self, edit::IndentLevel, AstNode, HasAttrs},
     SyntaxKind::{COMMENT, WHITESPACE},
     TextSize,
 };
@@ -42,7 +42,12 @@ pub(crate) fn generate_derive(acc: &mut Assists, ctx: &AssistContext<'_>) -> Opt
                 .next();
             match derive_attr {
                 None => {
-                    builder.insert_snippet(cap, node_start, "#[derive($0)]\n");
+                    let indent_level = IndentLevel::from_node(nominal.syntax());
+                    builder.insert_snippet(
+                        cap,
+                        node_start,
+                        format!("#[derive($0)]\n{indent_level}"),
+                    );
                 }
                 Some(tt) => {
                     // Just move the cursor.
@@ -84,6 +89,20 @@ mod tests {
             "struct Foo { $0 a: i32, }",
             "#[derive($0)]\nstruct Foo {  a: i32, }",
         );
+        check_assist(
+            generate_derive,
+            "
+mod m {
+    struct Foo { a: i32,$0 }
+}
+            ",
+            "
+mod m {
+    #[derive($0)]
+    struct Foo { a: i32, }
+}
+            ",
+        );
     }
 
     #[test]
@@ -111,6 +130,24 @@ struct Foo { a: i32$0, }
 struct Foo { a: i32, }
             ",
         );
+        check_assist(
+            generate_derive,
+            "
+mod m {
+    /// `Foo` is a pretty important struct.
+    /// It does stuff.
+    struct Foo { a: i32,$0 }
+}
+            ",
+            "
+mod m {
+    /// `Foo` is a pretty important struct.
+    /// It does stuff.
+    #[derive($0)]
+    struct Foo { a: i32, }
+}
+            ",
+        );
     }
 
     #[test]