@@ -821,9 +821,9 @@ pub fn iterate_method_candidates_dyn(
821821
822822 let mut table = InferenceTable :: new ( db, env. clone ( ) ) ;
823823 let ty = table. instantiate_canonical ( ty. clone ( ) ) ;
824- let ( deref_chain, adj ) = autoderef_method_receiver ( & mut table, ty) ;
824+ let deref_chain = autoderef_method_receiver ( & mut table, ty) ;
825825
826- let result = deref_chain. into_iter ( ) . zip ( adj ) . try_for_each ( |( receiver_ty, adj) | {
826+ let result = deref_chain. into_iter ( ) . try_for_each ( |( receiver_ty, adj) | {
827827 iterate_method_candidates_with_autoref (
828828 & receiver_ty,
829829 adj,
@@ -867,33 +867,28 @@ fn iterate_method_candidates_with_autoref(
867867 return ControlFlow :: Continue ( ( ) ) ;
868868 }
869869
870- iterate_method_candidates_by_receiver (
871- receiver_ty,
872- first_adjustment. clone ( ) ,
873- db,
874- env. clone ( ) ,
875- traits_in_scope,
876- visible_from_module,
877- name,
878- & mut callback,
879- ) ?;
870+ let mut iterate_method_candidates_by_receiver = move |receiver_ty, first_adjustment| {
871+ iterate_method_candidates_by_receiver (
872+ receiver_ty,
873+ first_adjustment,
874+ db,
875+ env. clone ( ) ,
876+ traits_in_scope,
877+ visible_from_module,
878+ name,
879+ & mut callback,
880+ )
881+ } ;
882+
883+ iterate_method_candidates_by_receiver ( receiver_ty, first_adjustment. clone ( ) ) ?;
880884
881885 let refed = Canonical {
882886 value : TyKind :: Ref ( Mutability :: Not , static_lifetime ( ) , receiver_ty. value . clone ( ) )
883887 . intern ( Interner ) ,
884888 binders : receiver_ty. binders . clone ( ) ,
885889 } ;
886890
887- iterate_method_candidates_by_receiver (
888- & refed,
889- first_adjustment. with_autoref ( Mutability :: Not ) ,
890- db,
891- env. clone ( ) ,
892- traits_in_scope,
893- visible_from_module,
894- name,
895- & mut callback,
896- ) ?;
891+ iterate_method_candidates_by_receiver ( & refed, first_adjustment. with_autoref ( Mutability :: Not ) ) ?;
897892
898893 let ref_muted = Canonical {
899894 value : TyKind :: Ref ( Mutability :: Mut , static_lifetime ( ) , receiver_ty. value . clone ( ) )
@@ -904,12 +899,6 @@ fn iterate_method_candidates_with_autoref(
904899 iterate_method_candidates_by_receiver (
905900 & ref_muted,
906901 first_adjustment. with_autoref ( Mutability :: Mut ) ,
907- db,
908- env,
909- traits_in_scope,
910- visible_from_module,
911- name,
912- & mut callback,
913902 )
914903}
915904
@@ -1210,8 +1199,8 @@ pub fn resolve_indexing_op(
12101199) -> Option < ReceiverAdjustments > {
12111200 let mut table = InferenceTable :: new ( db, env. clone ( ) ) ;
12121201 let ty = table. instantiate_canonical ( ty) ;
1213- let ( deref_chain, adj ) = autoderef_method_receiver ( & mut table, ty) ;
1214- for ( ty, adj) in deref_chain. into_iter ( ) . zip ( adj ) {
1202+ let deref_chain = autoderef_method_receiver ( & mut table, ty) ;
1203+ for ( ty, adj) in deref_chain {
12151204 let goal = generic_implements_goal ( db, env. clone ( ) , index_trait, & ty) ;
12161205 if db. trait_solve ( env. krate , goal. cast ( Interner ) ) . is_some ( ) {
12171206 return Some ( adj) ;
@@ -1421,25 +1410,24 @@ fn generic_implements_goal(
14211410fn autoderef_method_receiver (
14221411 table : & mut InferenceTable < ' _ > ,
14231412 ty : Ty ,
1424- ) -> ( Vec < Canonical < Ty > > , Vec < ReceiverAdjustments > ) {
1425- let ( mut deref_chain, mut adjustments ) : ( Vec < _ > , Vec < _ > ) = ( Vec :: new ( ) , Vec :: new ( ) ) ;
1413+ ) -> Vec < ( Canonical < Ty > , ReceiverAdjustments ) > {
1414+ let mut deref_chain: Vec < _ > = Vec :: new ( ) ;
14261415 let mut autoderef = autoderef:: Autoderef :: new ( table, ty) ;
14271416 while let Some ( ( ty, derefs) ) = autoderef. next ( ) {
1428- deref_chain. push ( autoderef. table . canonicalize ( ty) . value ) ;
1429- adjustments. push ( ReceiverAdjustments {
1430- autoref : None ,
1431- autoderefs : derefs,
1432- unsize_array : false ,
1433- } ) ;
1417+ deref_chain. push ( (
1418+ autoderef. table . canonicalize ( ty) . value ,
1419+ ReceiverAdjustments { autoref : None , autoderefs : derefs, unsize_array : false } ,
1420+ ) ) ;
14341421 }
14351422 // As a last step, we can do array unsizing (that's the only unsizing that rustc does for method receivers!)
1436- if let ( Some ( ( TyKind :: Array ( parameters, _) , binders) ) , Some ( adj) ) = (
1437- deref_chain. last ( ) . map ( |ty| ( ty. value . kind ( Interner ) , ty. binders . clone ( ) ) ) ,
1438- adjustments. last ( ) . cloned ( ) ,
1439- ) {
1423+ if let Some ( ( TyKind :: Array ( parameters, _) , binders, adj) ) =
1424+ deref_chain. last ( ) . map ( |( ty, adj) | ( ty. value . kind ( Interner ) , ty. binders . clone ( ) , adj) )
1425+ {
14401426 let unsized_ty = TyKind :: Slice ( parameters. clone ( ) ) . intern ( Interner ) ;
1441- deref_chain. push ( Canonical { value : unsized_ty, binders } ) ;
1442- adjustments. push ( ReceiverAdjustments { unsize_array : true , ..adj } ) ;
1427+ deref_chain. push ( (
1428+ Canonical { value : unsized_ty, binders } ,
1429+ ReceiverAdjustments { unsize_array : true , ..adj. clone ( ) } ,
1430+ ) ) ;
14431431 }
1444- ( deref_chain, adjustments )
1432+ deref_chain
14451433}
0 commit comments