@@ -13,6 +13,7 @@ use hir_def::{
1313} ;
1414use hir_expand:: name:: Name ;
1515use rustc_hash:: { FxHashMap , FxHashSet } ;
16+ use stdx:: never;
1617
1718use crate :: {
1819 autoderef,
@@ -322,7 +323,7 @@ pub fn def_crates(
322323 } } ;
323324 }
324325
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 ( ) ) ;
326327
327328 let lang_item_targets = match ty. kind ( & Interner ) {
328329 TyKind :: Adt ( AdtId ( def_id) , _) => {
@@ -521,9 +522,16 @@ fn iterate_method_candidates_with_autoref(
521522 name : Option < & Name > ,
522523 mut callback : & mut dyn FnMut ( & Canonical < Ty > , AssocItemId ) -> ControlFlow < ( ) > ,
523524) -> 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+ } ;
524532 iterate_method_candidates_by_receiver (
525- & deref_chain [ 0 ] ,
526- & deref_chain [ 1 .. ] ,
533+ & receiver_ty ,
534+ & rest ,
527535 db,
528536 env. clone ( ) ,
529537 krate,
@@ -534,8 +542,8 @@ fn iterate_method_candidates_with_autoref(
534542 ) ?;
535543
536544 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 ( ) )
539547 . intern ( & Interner ) ,
540548 } ;
541549
@@ -552,9 +560,8 @@ fn iterate_method_candidates_with_autoref(
552560 ) ?;
553561
554562 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 ) ,
558565 } ;
559566
560567 iterate_method_candidates_by_receiver (
@@ -584,7 +591,7 @@ fn iterate_method_candidates_by_receiver(
584591 // We're looking for methods with *receiver* type receiver_ty. These could
585592 // be found in any of the derefs of receiver_ty, so we have to go through
586593 // 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) {
588595 iterate_inherent_methods (
589596 self_ty,
590597 db,
@@ -597,7 +604,7 @@ fn iterate_method_candidates_by_receiver(
597604 ) ?
598605 }
599606
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) {
601608 iterate_trait_method_candidates (
602609 self_ty,
603610 db,
@@ -659,8 +666,7 @@ fn iterate_trait_method_candidates(
659666 }
660667 _ => Vec :: new ( ) ,
661668 } ;
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 ( ) ) ;
664670
665671 ' traits: for t in traits {
666672 let data = db. trait_data ( t) ;
@@ -750,7 +756,7 @@ fn iterate_inherent_methods(
750756 let impls_for_self_ty = filter_inherent_impls_for_self_ty ( & impls, & self_ty. value ) ;
751757
752758 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 {
754760 if !is_valid_candidate (
755761 db,
756762 env. clone ( ) ,
0 commit comments