1
- use ast:: Adt ;
2
1
use itertools:: Itertools ;
3
2
use stdx:: format_to;
4
3
use syntax:: ast:: { self , AstNode , NameOwner , StructKind , VisibilityOwner } ;
@@ -37,7 +36,7 @@ pub(crate) fn generate_new(acc: &mut Assists, ctx: &AssistContext) -> Option<()>
37
36
} ;
38
37
39
38
// Return early if we've found an existing new fn
40
- let impl_def = find_struct_impl ( & ctx, & Adt :: Struct ( strukt. clone ( ) ) , "new" ) ?;
39
+ let impl_def = find_struct_impl ( & ctx, & ast :: Adt :: Struct ( strukt. clone ( ) ) , "new" ) ?;
41
40
42
41
let target = strukt. syntax ( ) . text_range ( ) ;
43
42
acc. add ( AssistId ( "generate_new" , AssistKind :: Generate ) , "Generate `new`" , target, |builder| {
@@ -60,7 +59,7 @@ pub(crate) fn generate_new(acc: &mut Assists, ctx: &AssistContext) -> Option<()>
60
59
let start_offset = impl_def
61
60
. and_then ( |impl_def| find_impl_block_start ( impl_def, & mut buf) )
62
61
. unwrap_or_else ( || {
63
- buf = generate_impl_text ( & Adt :: Struct ( strukt. clone ( ) ) , & buf) ;
62
+ buf = generate_impl_text ( & ast :: Adt :: Struct ( strukt. clone ( ) ) , & buf) ;
64
63
strukt. syntax ( ) . text_range ( ) . end ( )
65
64
} ) ;
66
65
@@ -81,110 +80,142 @@ mod tests {
81
80
use super :: * ;
82
81
83
82
#[ test]
84
- #[ rustfmt:: skip]
85
83
fn test_generate_new ( ) {
86
- // Check output of generation
87
84
check_assist (
88
85
generate_new,
89
- "struct Foo {$0}" ,
90
- "struct Foo {}
86
+ r#"
87
+ struct Foo {$0}
88
+ "# ,
89
+ r#"
90
+ struct Foo {}
91
91
92
92
impl Foo {
93
93
fn $0new() -> Self { Self { } }
94
- }" ,
94
+ }
95
+ "# ,
95
96
) ;
96
97
check_assist (
97
98
generate_new,
98
- "struct Foo<T: Clone> {$0}" ,
99
- "struct Foo<T: Clone> {}
99
+ r#"
100
+ struct Foo<T: Clone> {$0}
101
+ "# ,
102
+ r#"
103
+ struct Foo<T: Clone> {}
100
104
101
105
impl<T: Clone> Foo<T> {
102
106
fn $0new() -> Self { Self { } }
103
- }" ,
107
+ }
108
+ "# ,
104
109
) ;
105
110
check_assist (
106
111
generate_new,
107
- "struct Foo<'a, T: Foo<'a>> {$0}" ,
108
- "struct Foo<'a, T: Foo<'a>> {}
112
+ r#"
113
+ struct Foo<'a, T: Foo<'a>> {$0}
114
+ "# ,
115
+ r#"
116
+ struct Foo<'a, T: Foo<'a>> {}
109
117
110
118
impl<'a, T: Foo<'a>> Foo<'a, T> {
111
119
fn $0new() -> Self { Self { } }
112
- }" ,
120
+ }
121
+ "# ,
113
122
) ;
114
123
check_assist (
115
124
generate_new,
116
- "struct Foo { baz: String $0}" ,
117
- "struct Foo { baz: String }
125
+ r#"
126
+ struct Foo { baz: String $0}
127
+ "# ,
128
+ r#"
129
+ struct Foo { baz: String }
118
130
119
131
impl Foo {
120
132
fn $0new(baz: String) -> Self { Self { baz } }
121
- }" ,
133
+ }
134
+ "# ,
122
135
) ;
123
136
check_assist (
124
137
generate_new,
125
- "struct Foo { baz: String, qux: Vec<i32> $0}" ,
126
- "struct Foo { baz: String, qux: Vec<i32> }
138
+ r#"
139
+ struct Foo { baz: String, qux: Vec<i32> $0}
140
+ "# ,
141
+ r#"
142
+ struct Foo { baz: String, qux: Vec<i32> }
127
143
128
144
impl Foo {
129
145
fn $0new(baz: String, qux: Vec<i32>) -> Self { Self { baz, qux } }
130
- }" ,
146
+ }
147
+ "# ,
131
148
) ;
149
+ }
132
150
133
- // Check that visibility modifiers don't get brought in for fields
151
+ #[ test]
152
+ fn check_that_visibility_modifiers_dont_get_brought_in ( ) {
134
153
check_assist (
135
154
generate_new,
136
- "struct Foo { pub baz: String, pub qux: Vec<i32> $0}" ,
137
- "struct Foo { pub baz: String, pub qux: Vec<i32> }
155
+ r#"
156
+ struct Foo { pub baz: String, pub qux: Vec<i32> $0}
157
+ "# ,
158
+ r#"
159
+ struct Foo { pub baz: String, pub qux: Vec<i32> }
138
160
139
161
impl Foo {
140
162
fn $0new(baz: String, qux: Vec<i32>) -> Self { Self { baz, qux } }
141
- }" ,
163
+ }
164
+ "# ,
142
165
) ;
166
+ }
143
167
144
- // Check that it reuses existing impls
168
+ #[ test]
169
+ fn check_it_reuses_existing_impls ( ) {
145
170
check_assist (
146
171
generate_new,
147
- "struct Foo {$0}
172
+ r#"
173
+ struct Foo {$0}
148
174
149
175
impl Foo {}
150
- " ,
151
- "struct Foo {}
176
+ "# ,
177
+ r#"
178
+ struct Foo {}
152
179
153
180
impl Foo {
154
181
fn $0new() -> Self { Self { } }
155
182
}
156
- " ,
183
+ "# ,
157
184
) ;
158
185
check_assist (
159
186
generate_new,
160
- "struct Foo {$0}
187
+ r#"
188
+ struct Foo {$0}
161
189
162
190
impl Foo {
163
191
fn qux(&self) {}
164
192
}
165
- " ,
166
- "struct Foo {}
193
+ "# ,
194
+ r#"
195
+ struct Foo {}
167
196
168
197
impl Foo {
169
198
fn $0new() -> Self { Self { } }
170
199
171
200
fn qux(&self) {}
172
201
}
173
- " ,
202
+ "# ,
174
203
) ;
175
204
176
205
check_assist (
177
206
generate_new,
178
- "struct Foo {$0}
207
+ r#"
208
+ struct Foo {$0}
179
209
180
210
impl Foo {
181
211
fn qux(&self) {}
182
212
fn baz() -> i32 {
183
213
5
184
214
}
185
215
}
186
- " ,
187
- "struct Foo {}
216
+ "# ,
217
+ r#"
218
+ struct Foo {}
188
219
189
220
impl Foo {
190
221
fn $0new() -> Self { Self { } }
@@ -194,67 +225,79 @@ impl Foo {
194
225
5
195
226
}
196
227
}
197
- " ,
228
+ "# ,
198
229
) ;
230
+ }
199
231
200
- // Check visibility of new fn based on struct
232
+ #[ test]
233
+ fn check_visibility_of_new_fn_based_on_struct ( ) {
201
234
check_assist (
202
235
generate_new,
203
- "pub struct Foo {$0}" ,
204
- "pub struct Foo {}
236
+ r#"
237
+ pub struct Foo {$0}
238
+ "# ,
239
+ r#"
240
+ pub struct Foo {}
205
241
206
242
impl Foo {
207
243
pub fn $0new() -> Self { Self { } }
208
- }" ,
244
+ }
245
+ "# ,
209
246
) ;
210
247
check_assist (
211
248
generate_new,
212
- "pub(crate) struct Foo {$0}" ,
213
- "pub(crate) struct Foo {}
249
+ r#"
250
+ pub(crate) struct Foo {$0}
251
+ "# ,
252
+ r#"
253
+ pub(crate) struct Foo {}
214
254
215
255
impl Foo {
216
256
pub(crate) fn $0new() -> Self { Self { } }
217
- }" ,
257
+ }
258
+ "# ,
218
259
) ;
219
260
}
220
261
221
262
#[ test]
222
263
fn generate_new_not_applicable_if_fn_exists ( ) {
223
264
check_assist_not_applicable (
224
265
generate_new,
225
- "
266
+ r# "
226
267
struct Foo {$0}
227
268
228
269
impl Foo {
229
270
fn new() -> Self {
230
271
Self
231
272
}
232
- }" ,
273
+ }
274
+ "# ,
233
275
) ;
234
276
235
277
check_assist_not_applicable (
236
278
generate_new,
237
- "
279
+ r# "
238
280
struct Foo {$0}
239
281
240
282
impl Foo {
241
283
fn New() -> Self {
242
284
Self
243
285
}
244
- }" ,
286
+ }
287
+ "# ,
245
288
) ;
246
289
}
247
290
248
291
#[ test]
249
292
fn generate_new_target ( ) {
250
293
check_assist_target (
251
294
generate_new,
252
- "
295
+ r# "
253
296
struct SomeThingIrrelevant;
254
297
/// Has a lifetime parameter
255
298
struct Foo<'a, T: Foo<'a>> {$0}
256
299
struct EvenMoreIrrelevant;
257
- " ,
300
+ "# ,
258
301
"/// Has a lifetime parameter
259
302
struct Foo<'a, T: Foo<'a>> {}" ,
260
303
) ;
@@ -264,7 +307,7 @@ struct Foo<'a, T: Foo<'a>> {}",
264
307
fn test_unrelated_new ( ) {
265
308
check_assist (
266
309
generate_new,
267
- r## "
310
+ r#"
268
311
pub struct AstId<N: AstNode> {
269
312
file_id: HirFileId,
270
313
file_ast_id: FileAstId<N>,
@@ -285,8 +328,9 @@ impl<T> Source<T> {
285
328
pub fn map<F: FnOnce(T) -> U, U>(self, f: F) -> Source<U> {
286
329
Source { file_id: self.file_id, ast: f(self.ast) }
287
330
}
288
- }"## ,
289
- r##"
331
+ }
332
+ "# ,
333
+ r#"
290
334
pub struct AstId<N: AstNode> {
291
335
file_id: HirFileId,
292
336
file_ast_id: FileAstId<N>,
@@ -309,7 +353,8 @@ impl<T> Source<T> {
309
353
pub fn map<F: FnOnce(T) -> U, U>(self, f: F) -> Source<U> {
310
354
Source { file_id: self.file_id, ast: f(self.ast) }
311
355
}
312
- }"## ,
356
+ }
357
+ "# ,
313
358
) ;
314
359
}
315
360
}
0 commit comments