@@ -65,14 +65,17 @@ pub(crate) fn generate_delegate_methods(acc: &mut Assists, ctx: &AssistContext<'
65
65
let sema_field_ty = ctx. sema . resolve_type ( & field_ty) ?;
66
66
let krate = sema_field_ty. krate ( ctx. db ( ) ) ;
67
67
let mut methods = vec ! [ ] ;
68
- sema_field_ty. iterate_assoc_items ( ctx. db ( ) , krate, |item| {
69
- if let hir:: AssocItem :: Function ( f) = item {
70
- if f. self_param ( ctx. db ( ) ) . is_some ( ) && f. is_visible_from ( ctx. db ( ) , current_module) {
71
- methods. push ( f)
68
+
69
+ for ty in sema_field_ty. autoderef ( ctx. db ( ) ) {
70
+ ty. iterate_assoc_items ( ctx. db ( ) , krate, |item| {
71
+ if let hir:: AssocItem :: Function ( f) = item {
72
+ if f. self_param ( ctx. db ( ) ) . is_some ( ) && f. is_visible_from ( ctx. db ( ) , current_module) {
73
+ methods. push ( f)
74
+ }
72
75
}
73
- }
74
- Option :: < ( ) > :: None
75
- } ) ;
76
+ Option :: < ( ) > :: None
77
+ } ) ;
78
+ }
76
79
77
80
for method in methods {
78
81
let adt = ast:: Adt :: Struct ( strukt. clone ( ) ) ;
@@ -314,6 +317,44 @@ impl<T> Person<T> {
314
317
) ;
315
318
}
316
319
320
+ #[ test]
321
+ fn test_generates_delegate_autoderef ( ) {
322
+ check_assist (
323
+ generate_delegate_methods,
324
+ r#"
325
+ //- minicore: deref
326
+ struct Age(u8);
327
+ impl Age {
328
+ fn age(&self) -> u8 {
329
+ self.0
330
+ }
331
+ }
332
+ struct AgeDeref(Age);
333
+ impl core::ops::Deref for AgeDeref { type Target = Age; }
334
+ struct Person {
335
+ ag$0e: AgeDeref,
336
+ }
337
+ impl Person {}"# ,
338
+ r#"
339
+ struct Age(u8);
340
+ impl Age {
341
+ fn age(&self) -> u8 {
342
+ self.0
343
+ }
344
+ }
345
+ struct AgeDeref(Age);
346
+ impl core::ops::Deref for AgeDeref { type Target = Age; }
347
+ struct Person {
348
+ age: AgeDeref,
349
+ }
350
+ impl Person {
351
+ $0fn age(&self) -> u8 {
352
+ self.age.age()
353
+ }
354
+ }"# ,
355
+ ) ;
356
+ }
357
+
317
358
#[ test]
318
359
fn test_generate_delegate_visibility ( ) {
319
360
check_assist_not_applicable (
0 commit comments