@@ -3497,8 +3497,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
34973497 . detect_and_explain_multiple_crate_versions (
34983498 err,
34993499 pick. item . def_id ,
3500- pick. item . ident ( self . tcx ) . span ,
3501- rcvr. hir_id . owner ,
3500+ rcvr. hir_id ,
35023501 * rcvr_ty,
35033502 ) ;
35043503 if pick. autoderefs == 0 && !trait_in_other_version_found {
@@ -3705,8 +3704,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
37053704 trait_in_other_version_found = self . detect_and_explain_multiple_crate_versions (
37063705 err,
37073706 assoc. def_id ,
3708- self . tcx . def_span ( assoc. def_id ) ,
3709- ty. hir_id . owner ,
3707+ ty. hir_id ,
37103708 rcvr_ty,
37113709 ) ;
37123710 }
@@ -4081,55 +4079,55 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
40814079 & self ,
40824080 err : & mut Diag < ' _ > ,
40834081 item_def_id : DefId ,
4084- item_span : Span ,
4085- owner : hir:: OwnerId ,
4082+ hir_id : hir:: HirId ,
40864083 rcvr_ty : Ty < ' _ > ,
40874084 ) -> bool {
4088- let pick_name = self . tcx . crate_name ( item_def_id. krate ) ;
4089- let trait_did = self . tcx . parent ( item_def_id) ;
4090- let trait_name = self . tcx . item_name ( trait_did) ;
4091- if let Some ( map) = self . tcx . in_scope_traits_map ( owner) {
4092- for trait_candidate in map. to_sorted_stable_ord ( ) . into_iter ( ) . flat_map ( |v| v. 1 . iter ( ) ) {
4093- let crate_name = self . tcx . crate_name ( trait_candidate. def_id . krate ) ;
4094- if trait_candidate. def_id . krate != item_def_id. krate && crate_name == pick_name {
4095- let msg = format ! (
4096- "there are multiple different versions of crate `{crate_name}` in the \
4097- dependency graph",
4098- ) ;
4099- let candidate_name = self . tcx . item_name ( trait_candidate. def_id ) ;
4100- if candidate_name == trait_name
4101- && let Some ( def_id) = trait_candidate. import_ids . get ( 0 )
4102- {
4103- let span = self . tcx . def_span ( * def_id) ;
4104- let mut multi_span: MultiSpan = span. into ( ) ;
4105- multi_span. push_span_label (
4106- span,
4107- format ! (
4108- "`{crate_name}` imported here doesn't correspond to the right \
4109- crate version",
4110- ) ,
4111- ) ;
4112- multi_span. push_span_label (
4113- self . tcx . def_span ( trait_candidate. def_id ) ,
4114- format ! ( "this is the trait that was imported" ) ,
4115- ) ;
4116- multi_span. push_span_label (
4117- self . tcx . def_span ( trait_did) ,
4118- format ! ( "this is the trait that is needed" ) ,
4119- ) ;
4120- multi_span. push_span_label (
4121- item_span,
4122- format ! ( "the method is available for `{rcvr_ty}` here" ) ,
4123- ) ;
4124- err. span_note ( multi_span, msg) ;
4125- } else {
4126- err. note ( msg) ;
4127- }
4128- return true ;
4129- }
4085+ let hir_id = self . tcx . parent_hir_id ( hir_id) ;
4086+ let Some ( traits) = self . tcx . in_scope_traits ( hir_id) else { return false } ;
4087+ if traits. is_empty ( ) {
4088+ return false ;
4089+ }
4090+ let trait_def_id = self . tcx . parent ( item_def_id) ;
4091+ let krate = self . tcx . crate_name ( trait_def_id. krate ) ;
4092+ let name = self . tcx . item_name ( trait_def_id) ;
4093+ let candidates: Vec < _ > = traits
4094+ . iter ( )
4095+ . filter ( |c| {
4096+ c. def_id . krate != trait_def_id. krate
4097+ && self . tcx . crate_name ( c. def_id . krate ) == krate
4098+ && self . tcx . item_name ( c. def_id ) == name
4099+ } )
4100+ . map ( |c| ( c. def_id , c. import_ids . get ( 0 ) . cloned ( ) ) )
4101+ . collect ( ) ;
4102+ if candidates. is_empty ( ) {
4103+ return false ;
4104+ }
4105+ let item_span = self . tcx . def_span ( item_def_id) ;
4106+ let msg = format ! (
4107+ "there are multiple different versions of crate `{krate}` in the dependency graph" ,
4108+ ) ;
4109+ let trait_span = self . tcx . def_span ( trait_def_id) ;
4110+ let mut multi_span: MultiSpan = trait_span. into ( ) ;
4111+ multi_span. push_span_label ( trait_span, format ! ( "this is the trait that is needed" ) ) ;
4112+ multi_span
4113+ . push_span_label ( item_span, format ! ( "the method is available for `{rcvr_ty}` here" ) ) ;
4114+ for ( def_id, import_def_id) in candidates {
4115+ if let Some ( import_def_id) = import_def_id {
4116+ multi_span. push_span_label (
4117+ self . tcx . def_span ( import_def_id) ,
4118+ format ! (
4119+ "`{name}` imported here doesn't correspond to the right version of crate \
4120+ `{krate}`",
4121+ ) ,
4122+ ) ;
41304123 }
4124+ multi_span. push_span_label (
4125+ self . tcx . def_span ( def_id) ,
4126+ format ! ( "this is the trait that was imported" ) ,
4127+ ) ;
41314128 }
4132- false
4129+ err. span_note ( multi_span, msg) ;
4130+ true
41334131 }
41344132
41354133 /// issue #102320, for `unwrap_or` with closure as argument, suggest `unwrap_or_else`
0 commit comments