@@ -3304,6 +3304,7 @@ fn print_disambiguation_help<'tcx>(
3304
3304
span : Span ,
3305
3305
item : ty:: AssocItem ,
3306
3306
) -> Option < String > {
3307
+ let trait_impl_type = trait_ref. self_ty ( ) ;
3307
3308
let trait_ref = if item. fn_has_self_parameter {
3308
3309
trait_ref. print_only_trait_name ( ) . to_string ( )
3309
3310
} else {
@@ -3316,6 +3317,13 @@ fn print_disambiguation_help<'tcx>(
3316
3317
{
3317
3318
let def_kind_descr = tcx. def_kind_descr ( item. kind . as_def_kind ( ) , item. def_id ) ;
3318
3319
let item_name = item. ident ( tcx) ;
3320
+ let first_arg_type = tcx
3321
+ . fn_sig ( item. def_id )
3322
+ . instantiate_identity ( )
3323
+ . skip_binder ( )
3324
+ . inputs ( )
3325
+ . get ( 0 )
3326
+ . and_then ( |first| Some ( first. peel_refs ( ) ) ) ;
3319
3327
let rcvr_ref = tcx
3320
3328
. fn_sig ( item. def_id )
3321
3329
. skip_binder ( )
@@ -3324,19 +3332,22 @@ fn print_disambiguation_help<'tcx>(
3324
3332
. get ( 0 )
3325
3333
. and_then ( |ty| ty. ref_mutability ( ) )
3326
3334
. map_or ( "" , |mutbl| mutbl. ref_prefix_str ( ) ) ;
3327
- let args = format ! (
3328
- "({}{})" ,
3329
- rcvr_ref,
3330
- std:: iter:: once( receiver)
3331
- . chain( args. iter( ) )
3332
- . map( |arg| tcx
3333
- . sess
3334
- . source_map( )
3335
- . span_to_snippet( arg. span)
3336
- . unwrap_or_else( |_| { "_" . to_owned( ) } ) )
3337
- . collect:: <Vec <_>>( )
3338
- . join( ", " ) ,
3339
- ) ;
3335
+ // If the type of first arg of this assoc function is `Self` or current trait impl type, we need to take the receiver as args. Otherwise, we don't.
3336
+ let args = if let Some ( t) = first_arg_type
3337
+ && ( t. to_string ( ) == "Self" || t == trait_impl_type)
3338
+ {
3339
+ std:: iter:: once ( receiver) . chain ( args. iter ( ) ) . collect :: < Vec < _ > > ( )
3340
+ } else {
3341
+ args. iter ( ) . collect :: < Vec < _ > > ( )
3342
+ }
3343
+ . iter ( )
3344
+ . map ( |arg| {
3345
+ tcx. sess . source_map ( ) . span_to_snippet ( arg. span ) . unwrap_or_else ( |_| "_" . to_owned ( ) )
3346
+ } )
3347
+ . collect :: < Vec < _ > > ( )
3348
+ . join ( ", " ) ;
3349
+
3350
+ let args = format ! ( "({}{})" , rcvr_ref, args) ;
3340
3351
err. span_suggestion_verbose (
3341
3352
span,
3342
3353
format ! (
0 commit comments