@@ -749,23 +749,45 @@ impl<'a, 'tcx> WrongNumberOfGenericArgs<'a, 'tcx> {
749749 fn suggest_moving_args_from_assoc_fn_to_trait_for_method_call (
750750 & self ,
751751 err : & mut Diagnostic ,
752- trait_ : DefId ,
752+ trait_def_id : DefId ,
753753 expr : & ' tcx hir:: Expr < ' tcx > ,
754754 msg : String ,
755755 num_assoc_fn_excess_args : usize ,
756756 num_trait_generics_except_self : usize ,
757757 ) {
758- if let hir:: ExprKind :: MethodCall ( _, receiver, args, ..) = expr. kind {
759- assert_eq ! ( args. len( ) , 0 ) ;
760- if num_assoc_fn_excess_args == num_trait_generics_except_self {
761- if let Some ( gen_args) = self . gen_args . span_ext ( )
762- && let Ok ( gen_args) = self . tcx . sess . source_map ( ) . span_to_snippet ( gen_args)
763- && let Ok ( receiver) = self . tcx . sess . source_map ( ) . span_to_snippet ( receiver. span ) {
764- let sugg = format ! ( "{}::{}::{}({})" , self . tcx. item_name( trait_) , gen_args, self . tcx. item_name( self . def_id) , receiver) ;
765- err. span_suggestion ( expr. span , msg, sugg, Applicability :: MaybeIncorrect ) ;
766- }
767- }
758+ let sm = self . tcx . sess . source_map ( ) ;
759+ let hir:: ExprKind :: MethodCall ( _, rcvr, args, _) = expr. kind else { return ; } ;
760+ if num_assoc_fn_excess_args != num_trait_generics_except_self {
761+ return ;
768762 }
763+ let Some ( gen_args) = self . gen_args . span_ext ( ) else { return ; } ;
764+ let Ok ( generics) = sm. span_to_snippet ( gen_args) else { return ; } ;
765+ let Ok ( rcvr) = sm. span_to_snippet (
766+ rcvr. span . find_ancestor_inside ( expr. span ) . unwrap_or ( rcvr. span )
767+ ) else { return ; } ;
768+ let Ok ( rest) =
769+ ( match args {
770+ [ ] => Ok ( String :: new ( ) ) ,
771+ [ arg] => sm. span_to_snippet (
772+ arg. span . find_ancestor_inside ( expr. span ) . unwrap_or ( arg. span ) ,
773+ ) ,
774+ [ first, .., last] => {
775+ let first_span =
776+ first. span . find_ancestor_inside ( expr. span ) . unwrap_or ( first. span ) ;
777+ let last_span =
778+ last. span . find_ancestor_inside ( expr. span ) . unwrap_or ( last. span ) ;
779+ sm. span_to_snippet ( first_span. to ( last_span) )
780+ }
781+ } ) else { return ; } ;
782+ let comma = if args. len ( ) > 0 { ", " } else { "" } ;
783+ let trait_path = self . tcx . def_path_str ( trait_def_id) ;
784+ let method_name = self . tcx . item_name ( self . def_id ) ;
785+ err. span_suggestion (
786+ expr. span ,
787+ msg,
788+ format ! ( "{trait_path}::{generics}::{method_name}({rcvr}{comma}{rest})" ) ,
789+ Applicability :: MaybeIncorrect ,
790+ ) ;
769791 }
770792
771793 /// Suggests to remove redundant argument(s):
0 commit comments