@@ -13,6 +13,7 @@ use hir_def::{
13
13
} ;
14
14
use hir_expand:: name:: Name ;
15
15
use rustc_hash:: { FxHashMap , FxHashSet } ;
16
+ use stdx:: never;
16
17
17
18
use crate :: {
18
19
autoderef,
@@ -322,7 +323,7 @@ pub fn def_crates(
322
323
} } ;
323
324
}
324
325
325
- let mod_to_crate_ids = |module : ModuleId | Some ( std :: iter:: once ( module. krate ( ) ) . collect ( ) ) ;
326
+ let mod_to_crate_ids = |module : ModuleId | Some ( iter:: once ( module. krate ( ) ) . collect ( ) ) ;
326
327
327
328
let lang_item_targets = match ty. kind ( & Interner ) {
328
329
TyKind :: Adt ( AdtId ( def_id) , _) => {
@@ -521,9 +522,16 @@ fn iterate_method_candidates_with_autoref(
521
522
name : Option < & Name > ,
522
523
mut callback : & mut dyn FnMut ( & Canonical < Ty > , AssocItemId ) -> ControlFlow < ( ) > ,
523
524
) -> ControlFlow < ( ) > {
525
+ let ( receiver_ty, rest) = match deref_chain. split_first ( ) {
526
+ Some ( ( rec, rest) ) => ( rec. clone ( ) , rest) ,
527
+ None => {
528
+ never ! ( "received empty deref-chain" ) ;
529
+ return ControlFlow :: Break ( ( ) ) ;
530
+ }
531
+ } ;
524
532
iterate_method_candidates_by_receiver (
525
- & deref_chain [ 0 ] ,
526
- & deref_chain [ 1 .. ] ,
533
+ & receiver_ty ,
534
+ & rest ,
527
535
db,
528
536
env. clone ( ) ,
529
537
krate,
@@ -534,8 +542,8 @@ fn iterate_method_candidates_with_autoref(
534
542
) ?;
535
543
536
544
let refed = Canonical {
537
- binders : deref_chain [ 0 ] . binders . clone ( ) ,
538
- value : TyKind :: Ref ( Mutability :: Not , static_lifetime ( ) , deref_chain [ 0 ] . value . clone ( ) )
545
+ binders : receiver_ty . binders . clone ( ) ,
546
+ value : TyKind :: Ref ( Mutability :: Not , static_lifetime ( ) , receiver_ty . value . clone ( ) )
539
547
. intern ( & Interner ) ,
540
548
} ;
541
549
@@ -552,9 +560,8 @@ fn iterate_method_candidates_with_autoref(
552
560
) ?;
553
561
554
562
let ref_muted = Canonical {
555
- binders : deref_chain[ 0 ] . binders . clone ( ) ,
556
- value : TyKind :: Ref ( Mutability :: Mut , static_lifetime ( ) , deref_chain[ 0 ] . value . clone ( ) )
557
- . intern ( & Interner ) ,
563
+ binders : receiver_ty. binders ,
564
+ value : TyKind :: Ref ( Mutability :: Mut , static_lifetime ( ) , receiver_ty. value ) . intern ( & Interner ) ,
558
565
} ;
559
566
560
567
iterate_method_candidates_by_receiver (
@@ -584,7 +591,7 @@ fn iterate_method_candidates_by_receiver(
584
591
// We're looking for methods with *receiver* type receiver_ty. These could
585
592
// be found in any of the derefs of receiver_ty, so we have to go through
586
593
// that.
587
- for self_ty in std :: iter:: once ( receiver_ty) . chain ( rest_of_deref_chain) {
594
+ for self_ty in iter:: once ( receiver_ty) . chain ( rest_of_deref_chain) {
588
595
iterate_inherent_methods (
589
596
self_ty,
590
597
db,
@@ -597,7 +604,7 @@ fn iterate_method_candidates_by_receiver(
597
604
) ?
598
605
}
599
606
600
- for self_ty in std :: iter:: once ( receiver_ty) . chain ( rest_of_deref_chain) {
607
+ for self_ty in iter:: once ( receiver_ty) . chain ( rest_of_deref_chain) {
601
608
iterate_trait_method_candidates (
602
609
self_ty,
603
610
db,
@@ -659,8 +666,7 @@ fn iterate_trait_method_candidates(
659
666
}
660
667
_ => Vec :: new ( ) ,
661
668
} ;
662
- let traits =
663
- inherent_trait. chain ( env_traits. into_iter ( ) ) . chain ( traits_in_scope. iter ( ) . copied ( ) ) ;
669
+ let traits = inherent_trait. chain ( env_traits) . chain ( traits_in_scope. iter ( ) . copied ( ) ) ;
664
670
665
671
' traits: for t in traits {
666
672
let data = db. trait_data ( t) ;
@@ -750,7 +756,7 @@ fn iterate_inherent_methods(
750
756
let impls_for_self_ty = filter_inherent_impls_for_self_ty ( & impls, & self_ty. value ) ;
751
757
752
758
for & impl_def in impls_for_self_ty {
753
- for & item in db. impl_data ( impl_def) . items . iter ( ) {
759
+ for & item in & db. impl_data ( impl_def) . items {
754
760
if !is_valid_candidate (
755
761
db,
756
762
env. clone ( ) ,
0 commit comments