@@ -2,7 +2,7 @@ use crate::{
2
2
assist_context:: { AssistContext , Assists } ,
3
3
AssistId ,
4
4
} ;
5
- use hir :: TypeRef ;
5
+ use ide_db :: helpers :: FamousDefs ;
6
6
use syntax:: {
7
7
ast:: { self , Impl , NameOwner } ,
8
8
AstNode ,
@@ -53,7 +53,8 @@ pub(crate) fn generate_default_from_new(acc: &mut Assists, ctx: &AssistContext)
53
53
}
54
54
55
55
let impl_ = fn_node. syntax ( ) . ancestors ( ) . into_iter ( ) . find_map ( ast:: Impl :: cast) ?;
56
- if is_default_implemented ( ctx, & impl_) . is_some ( ) {
56
+ let implements_default = is_default_implemented ( ctx, & impl_) ?;
57
+ if implements_default {
57
58
return None ;
58
59
}
59
60
@@ -85,29 +86,25 @@ impl Default for {} {{
85
86
86
87
fn is_default_implemented ( ctx : & AssistContext , impl_ : & Impl ) -> Option < bool > {
87
88
let db = ctx. sema . db ;
88
- let module = impl_. syntax ( ) . parent ( ) ?;
89
- let sema_scope = ctx. sema . scope ( & module) ;
90
- let impls = sema_scope. module ( ) ?. impl_defs ( db) ;
91
- let mut name = None ;
92
- for i in impls {
93
- if let Some ( TypeRef :: Path ( p) ) = i. target_trait ( db) {
94
- name = p. segments ( ) . iter ( ) . map ( |s| s. name . to_string ( ) ) . find ( |n| n == "Default" ) ;
95
- }
96
- }
97
-
98
- name. map ( |n| !n. is_empty ( ) )
89
+ let impl_def = ctx. sema . to_def ( impl_) ?;
90
+ let ty = impl_def. target_ty ( db) ;
91
+ let krate = impl_def. module ( db) . krate ( ) ;
92
+ let default_trait = FamousDefs ( & ctx. sema , Some ( krate) ) . core_default_Default ( ) ?;
93
+ let implements_default = ty. impls_trait ( db, default_trait, & [ ] ) ;
94
+ Some ( implements_default)
99
95
}
100
96
101
97
#[ cfg( test) ]
102
98
mod tests {
99
+ use ide_db:: helpers:: FamousDefs ;
100
+
103
101
use crate :: tests:: { check_assist, check_assist_not_applicable} ;
104
102
105
103
use super :: * ;
106
104
107
105
#[ test]
108
106
fn generate_default ( ) {
109
- check_assist (
110
- generate_default_from_new,
107
+ check_pass (
111
108
r#"
112
109
struct Example { _inner: () }
113
110
@@ -141,8 +138,7 @@ fn main() {}
141
138
142
139
#[ test]
143
140
fn generate_default2 ( ) {
144
- check_assist (
145
- generate_default_from_new,
141
+ check_pass (
146
142
r#"
147
143
struct Test { value: u32 }
148
144
@@ -173,8 +169,7 @@ impl Default for Test {
173
169
#[ test]
174
170
fn new_function_with_parameters ( ) {
175
171
mark:: check!( new_function_with_parameters) ;
176
- check_assist_not_applicable (
177
- generate_default_from_new,
172
+ check_not_applicable (
178
173
r#"
179
174
struct Example { _inner: () }
180
175
@@ -190,8 +185,7 @@ impl Example {
190
185
#[ test]
191
186
fn other_function_than_new ( ) {
192
187
mark:: check!( other_function_than_new) ;
193
- check_assist_not_applicable (
194
- generate_default_from_new,
188
+ check_not_applicable (
195
189
r#"
196
190
struct Example { _inner: () }
197
191
@@ -207,8 +201,7 @@ impl Exmaple {
207
201
208
202
#[ test]
209
203
fn default_block_is_already_present ( ) {
210
- check_assist_not_applicable (
211
- generate_default_from_new,
204
+ check_not_applicable (
212
205
r#"
213
206
struct Example { _inner: () }
214
207
@@ -229,8 +222,7 @@ impl Default for Example {
229
222
230
223
#[ test]
231
224
fn standalone_new_function ( ) {
232
- check_assist_not_applicable (
233
- generate_default_from_new,
225
+ check_not_applicable (
234
226
r#"
235
227
fn n$0ew() -> u32 {
236
228
0
@@ -241,8 +233,7 @@ fn n$0ew() -> u32 {
241
233
242
234
#[ test]
243
235
fn multiple_struct_blocks ( ) {
244
- check_assist (
245
- generate_default_from_new,
236
+ check_pass (
246
237
r#"
247
238
struct Example { _inner: () }
248
239
struct Test { value: u32 }
@@ -274,8 +265,7 @@ impl Default for Example {
274
265
275
266
#[ test]
276
267
fn when_struct_is_after_impl ( ) {
277
- check_assist (
278
- generate_default_from_new,
268
+ check_pass (
279
269
r#"
280
270
impl Example {
281
271
pub fn $0new() -> Self {
@@ -305,8 +295,7 @@ struct Example { _inner: () }
305
295
306
296
#[ test]
307
297
fn struct_in_module ( ) {
308
- check_assist (
309
- generate_default_from_new,
298
+ check_pass (
310
299
r#"
311
300
mod test {
312
301
struct Example { _inner: () }
@@ -340,8 +329,7 @@ impl Default for Example {
340
329
341
330
#[ test]
342
331
fn struct_in_module_with_default ( ) {
343
- check_assist_not_applicable (
344
- generate_default_from_new,
332
+ check_not_applicable (
345
333
r#"
346
334
mod test {
347
335
struct Example { _inner: () }
@@ -361,4 +349,14 @@ mod test {
361
349
"# ,
362
350
) ;
363
351
}
352
+
353
+ fn check_pass ( before : & str , after : & str ) {
354
+ let before = & format ! ( "//- /main.rs crate:main deps:core{}{}" , before, FamousDefs :: FIXTURE ) ;
355
+ check_assist ( generate_default_from_new, before, after) ;
356
+ }
357
+
358
+ fn check_not_applicable ( before : & str ) {
359
+ let before = & format ! ( "//- /main.rs crate:main deps:core{}{}" , before, FamousDefs :: FIXTURE ) ;
360
+ check_assist_not_applicable ( generate_default_from_new, before) ;
361
+ }
364
362
}
0 commit comments