@@ -972,10 +972,9 @@ pub fn iterate_method_candidates_dyn(
972972
973973 deref_chain. into_iter ( ) . try_for_each ( |( receiver_ty, adj) | {
974974 iterate_method_candidates_with_autoref (
975+ & mut table,
975976 & receiver_ty,
976977 adj,
977- db,
978- env. clone ( ) ,
979978 traits_in_scope,
980979 visible_from_module,
981980 name,
@@ -1000,10 +999,9 @@ pub fn iterate_method_candidates_dyn(
1000999
10011000#[ tracing:: instrument( skip_all, fields( name = ?name) ) ]
10021001fn iterate_method_candidates_with_autoref (
1002+ table : & mut InferenceTable < ' _ > ,
10031003 receiver_ty : & Canonical < Ty > ,
10041004 first_adjustment : ReceiverAdjustments ,
1005- db : & dyn HirDatabase ,
1006- env : Arc < TraitEnvironment > ,
10071005 traits_in_scope : & FxHashSet < TraitId > ,
10081006 visible_from_module : VisibleFromModule ,
10091007 name : Option < & Name > ,
@@ -1016,10 +1014,9 @@ fn iterate_method_candidates_with_autoref(
10161014
10171015 let mut iterate_method_candidates_by_receiver = move |receiver_ty, first_adjustment| {
10181016 iterate_method_candidates_by_receiver (
1017+ table,
10191018 receiver_ty,
10201019 first_adjustment,
1021- db,
1022- env. clone ( ) ,
10231020 traits_in_scope,
10241021 visible_from_module,
10251022 name,
@@ -1058,50 +1055,49 @@ fn iterate_method_candidates_with_autoref(
10581055
10591056#[ tracing:: instrument( skip_all, fields( name = ?name) ) ]
10601057fn iterate_method_candidates_by_receiver (
1058+ table : & mut InferenceTable < ' _ > ,
10611059 receiver_ty : & Canonical < Ty > ,
10621060 receiver_adjustments : ReceiverAdjustments ,
1063- db : & dyn HirDatabase ,
1064- env : Arc < TraitEnvironment > ,
10651061 traits_in_scope : & FxHashSet < TraitId > ,
10661062 visible_from_module : VisibleFromModule ,
10671063 name : Option < & Name > ,
10681064 mut callback : & mut dyn FnMut ( ReceiverAdjustments , AssocItemId , bool ) -> ControlFlow < ( ) > ,
10691065) -> ControlFlow < ( ) > {
1070- let mut table = InferenceTable :: new ( db, env) ;
1071- let receiver_ty = table. instantiate_canonical ( receiver_ty. clone ( ) ) ;
1072- let snapshot = table. snapshot ( ) ;
1073- // We're looking for methods with *receiver* type receiver_ty. These could
1074- // be found in any of the derefs of receiver_ty, so we have to go through
1075- // that, including raw derefs.
1076- let mut autoderef = autoderef:: Autoderef :: new ( & mut table, receiver_ty. clone ( ) , true ) ;
1077- while let Some ( ( self_ty, _) ) = autoderef. next ( ) {
1078- iterate_inherent_methods (
1079- & self_ty,
1080- autoderef. table ,
1081- name,
1082- Some ( & receiver_ty) ,
1083- Some ( receiver_adjustments. clone ( ) ) ,
1084- visible_from_module,
1085- & mut callback,
1086- ) ?
1087- }
1088-
1089- table. rollback_to ( snapshot) ;
1090-
1091- let mut autoderef = autoderef:: Autoderef :: new ( & mut table, receiver_ty. clone ( ) , true ) ;
1092- while let Some ( ( self_ty, _) ) = autoderef. next ( ) {
1093- iterate_trait_method_candidates (
1094- & self_ty,
1095- autoderef. table ,
1096- traits_in_scope,
1097- name,
1098- Some ( & receiver_ty) ,
1099- Some ( receiver_adjustments. clone ( ) ) ,
1100- & mut callback,
1101- ) ?
1102- }
1066+ table. run_in_snapshot ( |table| {
1067+ let receiver_ty = table. instantiate_canonical ( receiver_ty. clone ( ) ) ;
1068+ // We're looking for methods with *receiver* type receiver_ty. These could
1069+ // be found in any of the derefs of receiver_ty, so we have to go through
1070+ // that, including raw derefs.
1071+ table. run_in_snapshot ( |table| {
1072+ let mut autoderef = autoderef:: Autoderef :: new ( table, receiver_ty. clone ( ) , true ) ;
1073+ while let Some ( ( self_ty, _) ) = autoderef. next ( ) {
1074+ iterate_inherent_methods (
1075+ & self_ty,
1076+ autoderef. table ,
1077+ name,
1078+ Some ( & receiver_ty) ,
1079+ Some ( receiver_adjustments. clone ( ) ) ,
1080+ visible_from_module,
1081+ & mut callback,
1082+ ) ?
1083+ }
1084+ ControlFlow :: Continue ( ( ) )
1085+ } ) ?;
11031086
1104- ControlFlow :: Continue ( ( ) )
1087+ let mut autoderef = autoderef:: Autoderef :: new ( table, receiver_ty. clone ( ) , true ) ;
1088+ while let Some ( ( self_ty, _) ) = autoderef. next ( ) {
1089+ iterate_trait_method_candidates (
1090+ & self_ty,
1091+ autoderef. table ,
1092+ traits_in_scope,
1093+ name,
1094+ Some ( & receiver_ty) ,
1095+ Some ( receiver_adjustments. clone ( ) ) ,
1096+ & mut callback,
1097+ ) ?
1098+ }
1099+ ControlFlow :: Continue ( ( ) )
1100+ } )
11051101}
11061102
11071103#[ tracing:: instrument( skip_all, fields( name = ?name) ) ]
0 commit comments