Unnamed repository; edit this file 'description' to name the repository.
-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 339245b94e..78ac2eb30e 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]