@@ -2251,26 +2251,39 @@ fn fn_sig_suggestion(
2251
2251
sig : & ty:: FnSig < ' _ > ,
2252
2252
ident : Ident ,
2253
2253
predicates : ty:: GenericPredicates < ' _ > ,
2254
+ assoc : & ty:: AssocItem ,
2254
2255
) -> String {
2255
2256
let args = sig
2256
2257
. inputs ( )
2257
2258
. iter ( )
2258
- . map ( |ty| {
2259
+ . enumerate ( )
2260
+ . map ( |( i, ty) | {
2259
2261
Some ( match ty. kind {
2260
- ty:: Param ( param ) if param . name == kw :: SelfUpper => "self" . to_string ( ) ,
2261
- ty:: Ref ( reg, ref_ty, mutability) => {
2262
+ ty:: Param ( _ ) if assoc . fn_has_self_parameter && i == 0 => "self" . to_string ( ) ,
2263
+ ty:: Ref ( reg, ref_ty, mutability) if i == 0 => {
2262
2264
let reg = match & format ! ( "{}" , reg) [ ..] {
2263
2265
"'_" | "" => String :: new ( ) ,
2264
2266
reg => format ! ( "{} " , reg) ,
2265
2267
} ;
2266
- match ref_ty. kind {
2267
- ty:: Param ( param) if param. name == kw:: SelfUpper => {
2268
- format ! ( "&{}{}self" , reg, mutability. prefix_str( ) )
2268
+ if assoc. fn_has_self_parameter {
2269
+ match ref_ty. kind {
2270
+ ty:: Param ( param) if param. name == kw:: SelfUpper => {
2271
+ format ! ( "&{}{}self" , reg, mutability. prefix_str( ) )
2272
+ }
2273
+
2274
+ _ => format ! ( "self: {}" , ty) ,
2269
2275
}
2270
- _ => format ! ( "_: {:?}" , ty) ,
2276
+ } else {
2277
+ format ! ( "_: {:?}" , ty)
2278
+ }
2279
+ }
2280
+ _ => {
2281
+ if assoc. fn_has_self_parameter && i == 0 {
2282
+ format ! ( "self: {:?}" , ty)
2283
+ } else {
2284
+ format ! ( "_: {:?}" , ty)
2271
2285
}
2272
2286
}
2273
- _ => format ! ( "_: {:?}" , ty) ,
2274
2287
} )
2275
2288
} )
2276
2289
. chain ( std:: iter:: once ( if sig. c_variadic { Some ( "..." . to_string ( ) ) } else { None } ) )
@@ -2309,6 +2322,7 @@ fn suggestion_signature(assoc: &ty::AssocItem, tcx: TyCtxt<'_>) -> String {
2309
2322
tcx. fn_sig ( assoc. def_id ) . skip_binder ( ) ,
2310
2323
assoc. ident ,
2311
2324
tcx. predicates_of ( assoc. def_id ) ,
2325
+ assoc,
2312
2326
)
2313
2327
}
2314
2328
ty:: AssocKind :: Type => format ! ( "type {} = Type;" , assoc. ident) ,
0 commit comments