@@ -3497,8 +3497,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
3497
3497
. detect_and_explain_multiple_crate_versions (
3498
3498
err,
3499
3499
pick. item . def_id ,
3500
- pick. item . ident ( self . tcx ) . span ,
3501
- rcvr. hir_id . owner ,
3500
+ rcvr. hir_id ,
3502
3501
* rcvr_ty,
3503
3502
) ;
3504
3503
if pick. autoderefs == 0 && !trait_in_other_version_found {
@@ -3705,8 +3704,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
3705
3704
trait_in_other_version_found = self . detect_and_explain_multiple_crate_versions (
3706
3705
err,
3707
3706
assoc. def_id ,
3708
- self . tcx . def_span ( assoc. def_id ) ,
3709
- ty. hir_id . owner ,
3707
+ ty. hir_id ,
3710
3708
rcvr_ty,
3711
3709
) ;
3712
3710
}
@@ -4081,55 +4079,55 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
4081
4079
& self ,
4082
4080
err : & mut Diag < ' _ > ,
4083
4081
item_def_id : DefId ,
4084
- item_span : Span ,
4085
- owner : hir:: OwnerId ,
4082
+ hir_id : hir:: HirId ,
4086
4083
rcvr_ty : Ty < ' _ > ,
4087
4084
) -> 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
+ ) ;
4130
4123
}
4124
+ multi_span. push_span_label (
4125
+ self . tcx . def_span ( def_id) ,
4126
+ format ! ( "this is the trait that was imported" ) ,
4127
+ ) ;
4131
4128
}
4132
- false
4129
+ err. span_note ( multi_span, msg) ;
4130
+ true
4133
4131
}
4134
4132
4135
4133
/// issue #102320, for `unwrap_or` with closure as argument, suggest `unwrap_or_else`
0 commit comments