@@ -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,
@@ -334,7 +335,7 @@ pub fn def_crates(
334335 } } ;
335336 }
336337
337- let mod_to_crate_ids = |module : ModuleId | Some ( std :: iter:: once ( module. krate ( ) ) . collect ( ) ) ;
338+ let mod_to_crate_ids = |module : ModuleId | Some ( iter:: once ( module. krate ( ) ) . collect ( ) ) ;
338339
339340 let lang_item_targets = match ty. kind ( & Interner ) {
340341 TyKind :: Adt ( AdtId ( def_id) , _) => {
@@ -533,9 +534,16 @@ fn iterate_method_candidates_with_autoref(
533534 name : Option < & Name > ,
534535 mut callback : & mut dyn FnMut ( & Canonical < Ty > , AssocItemId ) -> ControlFlow < ( ) > ,
535536) -> ControlFlow < ( ) > {
537+ let ( receiver_ty, rest) = match deref_chain. split_first ( ) {
538+ Some ( ( rec, rest) ) => ( rec. clone ( ) , rest) ,
539+ None => {
540+ never ! ( "received empty deref-chain" ) ;
541+ return ControlFlow :: Break ( ( ) ) ;
542+ }
543+ } ;
536544 iterate_method_candidates_by_receiver (
537- & deref_chain [ 0 ] ,
538- & deref_chain [ 1 .. ] ,
545+ & receiver_ty ,
546+ & rest ,
539547 db,
540548 env. clone ( ) ,
541549 krate,
@@ -546,8 +554,8 @@ fn iterate_method_candidates_with_autoref(
546554 ) ?;
547555
548556 let refed = Canonical {
549- binders : deref_chain [ 0 ] . binders . clone ( ) ,
550- value : TyKind :: Ref ( Mutability :: Not , static_lifetime ( ) , deref_chain [ 0 ] . value . clone ( ) )
557+ binders : receiver_ty . binders . clone ( ) ,
558+ value : TyKind :: Ref ( Mutability :: Not , static_lifetime ( ) , receiver_ty . value . clone ( ) )
551559 . intern ( & Interner ) ,
552560 } ;
553561
@@ -564,9 +572,8 @@ fn iterate_method_candidates_with_autoref(
564572 ) ?;
565573
566574 let ref_muted = Canonical {
567- binders : deref_chain[ 0 ] . binders . clone ( ) ,
568- value : TyKind :: Ref ( Mutability :: Mut , static_lifetime ( ) , deref_chain[ 0 ] . value . clone ( ) )
569- . intern ( & Interner ) ,
575+ binders : receiver_ty. binders ,
576+ value : TyKind :: Ref ( Mutability :: Mut , static_lifetime ( ) , receiver_ty. value ) . intern ( & Interner ) ,
570577 } ;
571578
572579 iterate_method_candidates_by_receiver (
@@ -596,7 +603,7 @@ fn iterate_method_candidates_by_receiver(
596603 // We're looking for methods with *receiver* type receiver_ty. These could
597604 // be found in any of the derefs of receiver_ty, so we have to go through
598605 // that.
599- for self_ty in std :: iter:: once ( receiver_ty) . chain ( rest_of_deref_chain) {
606+ for self_ty in iter:: once ( receiver_ty) . chain ( rest_of_deref_chain) {
600607 iterate_inherent_methods (
601608 self_ty,
602609 db,
@@ -609,7 +616,7 @@ fn iterate_method_candidates_by_receiver(
609616 ) ?
610617 }
611618
612- for self_ty in std :: iter:: once ( receiver_ty) . chain ( rest_of_deref_chain) {
619+ for self_ty in iter:: once ( receiver_ty) . chain ( rest_of_deref_chain) {
613620 iterate_trait_method_candidates (
614621 self_ty,
615622 db,
@@ -671,8 +678,7 @@ fn iterate_trait_method_candidates(
671678 }
672679 _ => Vec :: new ( ) ,
673680 } ;
674- let traits =
675- inherent_trait. chain ( env_traits. into_iter ( ) ) . chain ( traits_in_scope. iter ( ) . copied ( ) ) ;
681+ let traits = inherent_trait. chain ( env_traits) . chain ( traits_in_scope. iter ( ) . copied ( ) ) ;
676682
677683 ' traits: for t in traits {
678684 let data = db. trait_data ( t) ;
@@ -800,7 +806,7 @@ fn iterate_inherent_methods(
800806 ) -> ControlFlow < ( ) > {
801807 let impls_for_self_ty = filter_inherent_impls_for_self_ty ( impls, & self_ty. value ) ;
802808 for & impl_def in impls_for_self_ty {
803- for & item in db. impl_data ( impl_def) . items . iter ( ) {
809+ for & item in & db. impl_data ( impl_def) . items {
804810 if !is_valid_candidate (
805811 db,
806812 env. clone ( ) ,
0 commit comments