@@ -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,
@@ -334,7 +335,7 @@ pub fn def_crates(
334
335
} } ;
335
336
}
336
337
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 ( ) ) ;
338
339
339
340
let lang_item_targets = match ty. kind ( & Interner ) {
340
341
TyKind :: Adt ( AdtId ( def_id) , _) => {
@@ -533,9 +534,16 @@ fn iterate_method_candidates_with_autoref(
533
534
name : Option < & Name > ,
534
535
mut callback : & mut dyn FnMut ( & Canonical < Ty > , AssocItemId ) -> ControlFlow < ( ) > ,
535
536
) -> 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
+ } ;
536
544
iterate_method_candidates_by_receiver (
537
- & deref_chain [ 0 ] ,
538
- & deref_chain [ 1 .. ] ,
545
+ & receiver_ty ,
546
+ & rest ,
539
547
db,
540
548
env. clone ( ) ,
541
549
krate,
@@ -546,8 +554,8 @@ fn iterate_method_candidates_with_autoref(
546
554
) ?;
547
555
548
556
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 ( ) )
551
559
. intern ( & Interner ) ,
552
560
} ;
553
561
@@ -564,9 +572,8 @@ fn iterate_method_candidates_with_autoref(
564
572
) ?;
565
573
566
574
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 ) ,
570
577
} ;
571
578
572
579
iterate_method_candidates_by_receiver (
@@ -596,7 +603,7 @@ fn iterate_method_candidates_by_receiver(
596
603
// We're looking for methods with *receiver* type receiver_ty. These could
597
604
// be found in any of the derefs of receiver_ty, so we have to go through
598
605
// 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) {
600
607
iterate_inherent_methods (
601
608
self_ty,
602
609
db,
@@ -609,7 +616,7 @@ fn iterate_method_candidates_by_receiver(
609
616
) ?
610
617
}
611
618
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) {
613
620
iterate_trait_method_candidates (
614
621
self_ty,
615
622
db,
@@ -671,8 +678,7 @@ fn iterate_trait_method_candidates(
671
678
}
672
679
_ => Vec :: new ( ) ,
673
680
} ;
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 ( ) ) ;
676
682
677
683
' traits: for t in traits {
678
684
let data = db. trait_data ( t) ;
@@ -800,7 +806,7 @@ fn iterate_inherent_methods(
800
806
) -> ControlFlow < ( ) > {
801
807
let impls_for_self_ty = filter_inherent_impls_for_self_ty ( impls, & self_ty. value ) ;
802
808
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 {
804
810
if !is_valid_candidate (
805
811
db,
806
812
env. clone ( ) ,
0 commit comments