|
1 | 1 | use syntax::{
|
2 |
| - ast::{self, AstNode, HasAttrs}, |
| 2 | + ast::{self, edit::IndentLevel, AstNode, HasAttrs}, |
3 | 3 | SyntaxKind::{COMMENT, WHITESPACE},
|
4 | 4 | TextSize,
|
5 | 5 | };
|
@@ -42,7 +42,12 @@ pub(crate) fn generate_derive(acc: &mut Assists, ctx: &AssistContext<'_>) -> Opt
|
42 | 42 | .next();
|
43 | 43 | match derive_attr {
|
44 | 44 | None => {
|
45 |
| - builder.insert_snippet(cap, node_start, "#[derive($0)]\n"); |
| 45 | + let indent_level = IndentLevel::from_node(nominal.syntax()); |
| 46 | + builder.insert_snippet( |
| 47 | + cap, |
| 48 | + node_start, |
| 49 | + format!("#[derive($0)]\n{indent_level}"), |
| 50 | + ); |
46 | 51 | }
|
47 | 52 | Some(tt) => {
|
48 | 53 | // Just move the cursor.
|
@@ -84,6 +89,20 @@ mod tests {
|
84 | 89 | "struct Foo { $0 a: i32, }",
|
85 | 90 | "#[derive($0)]\nstruct Foo { a: i32, }",
|
86 | 91 | );
|
| 92 | + check_assist( |
| 93 | + generate_derive, |
| 94 | + " |
| 95 | +mod m { |
| 96 | + struct Foo { a: i32,$0 } |
| 97 | +} |
| 98 | + ", |
| 99 | + " |
| 100 | +mod m { |
| 101 | + #[derive($0)] |
| 102 | + struct Foo { a: i32, } |
| 103 | +} |
| 104 | + ", |
| 105 | + ); |
87 | 106 | }
|
88 | 107 |
|
89 | 108 | #[test]
|
@@ -111,6 +130,24 @@ struct Foo { a: i32$0, }
|
111 | 130 | struct Foo { a: i32, }
|
112 | 131 | ",
|
113 | 132 | );
|
| 133 | + check_assist( |
| 134 | + generate_derive, |
| 135 | + " |
| 136 | +mod m { |
| 137 | + /// `Foo` is a pretty important struct. |
| 138 | + /// It does stuff. |
| 139 | + struct Foo { a: i32,$0 } |
| 140 | +} |
| 141 | + ", |
| 142 | + " |
| 143 | +mod m { |
| 144 | + /// `Foo` is a pretty important struct. |
| 145 | + /// It does stuff. |
| 146 | + #[derive($0)] |
| 147 | + struct Foo { a: i32, } |
| 148 | +} |
| 149 | + ", |
| 150 | + ); |
114 | 151 | }
|
115 | 152 |
|
116 | 153 | #[test]
|
|
0 commit comments