@@ -914,7 +914,7 @@ pub fn iterate_path_candidates(
914
914
traits_in_scope : & FxHashSet < TraitId > ,
915
915
visible_from_module : VisibleFromModule ,
916
916
name : Option < & Name > ,
917
- callback : & mut dyn FnMut ( AssocItemId ) -> ControlFlow < ( ) > ,
917
+ callback : & mut dyn MethodCandidateCallback ,
918
918
) -> ControlFlow < ( ) > {
919
919
iterate_method_candidates_dyn (
920
920
ty,
@@ -925,7 +925,7 @@ pub fn iterate_path_candidates(
925
925
name,
926
926
LookupMode :: Path ,
927
927
// the adjustments are not relevant for path lookup
928
- & mut |_ , id , _| callback ( id ) ,
928
+ callback,
929
929
)
930
930
}
931
931
@@ -937,7 +937,7 @@ pub fn iterate_method_candidates_dyn(
937
937
visible_from_module : VisibleFromModule ,
938
938
name : Option < & Name > ,
939
939
mode : LookupMode ,
940
- callback : & mut dyn FnMut ( ReceiverAdjustments , AssocItemId , bool ) -> ControlFlow < ( ) > ,
940
+ callback : & mut dyn MethodCandidateCallback ,
941
941
) -> ControlFlow < ( ) > {
942
942
let _p = tracing:: info_span!(
943
943
"iterate_method_candidates_dyn" ,
@@ -1007,7 +1007,7 @@ fn iterate_method_candidates_with_autoref(
1007
1007
traits_in_scope : & FxHashSet < TraitId > ,
1008
1008
visible_from_module : VisibleFromModule ,
1009
1009
name : Option < & Name > ,
1010
- mut callback : & mut dyn FnMut ( ReceiverAdjustments , AssocItemId , bool ) -> ControlFlow < ( ) > ,
1010
+ callback : & mut dyn MethodCandidateCallback ,
1011
1011
) -> ControlFlow < ( ) > {
1012
1012
if receiver_ty. value . is_general_var ( Interner , & receiver_ty. binders ) {
1013
1013
// don't try to resolve methods on unknown types
@@ -1022,7 +1022,7 @@ fn iterate_method_candidates_with_autoref(
1022
1022
traits_in_scope,
1023
1023
visible_from_module,
1024
1024
name,
1025
- & mut callback,
1025
+ callback,
1026
1026
)
1027
1027
} ;
1028
1028
@@ -1052,6 +1052,45 @@ fn iterate_method_candidates_with_autoref(
1052
1052
iterate_method_candidates_by_receiver ( ref_muted, first_adjustment. with_autoref ( Mutability :: Mut ) )
1053
1053
}
1054
1054
1055
+ pub trait MethodCandidateCallback {
1056
+ fn on_inherent_method (
1057
+ & mut self ,
1058
+ adjustments : ReceiverAdjustments ,
1059
+ item : AssocItemId ,
1060
+ is_visible : bool ,
1061
+ ) -> ControlFlow < ( ) > ;
1062
+
1063
+ fn on_trait_method (
1064
+ & mut self ,
1065
+ adjustments : ReceiverAdjustments ,
1066
+ item : AssocItemId ,
1067
+ is_visible : bool ,
1068
+ ) -> ControlFlow < ( ) > ;
1069
+ }
1070
+
1071
+ impl < F > MethodCandidateCallback for F
1072
+ where
1073
+ F : FnMut ( ReceiverAdjustments , AssocItemId , bool ) -> ControlFlow < ( ) > ,
1074
+ {
1075
+ fn on_inherent_method (
1076
+ & mut self ,
1077
+ adjustments : ReceiverAdjustments ,
1078
+ item : AssocItemId ,
1079
+ is_visible : bool ,
1080
+ ) -> ControlFlow < ( ) > {
1081
+ self ( adjustments, item, is_visible)
1082
+ }
1083
+
1084
+ fn on_trait_method (
1085
+ & mut self ,
1086
+ adjustments : ReceiverAdjustments ,
1087
+ item : AssocItemId ,
1088
+ is_visible : bool ,
1089
+ ) -> ControlFlow < ( ) > {
1090
+ self ( adjustments, item, is_visible)
1091
+ }
1092
+ }
1093
+
1055
1094
#[ tracing:: instrument( skip_all, fields( name = ?name) ) ]
1056
1095
fn iterate_method_candidates_by_receiver (
1057
1096
table : & mut InferenceTable < ' _ > ,
@@ -1060,7 +1099,7 @@ fn iterate_method_candidates_by_receiver(
1060
1099
traits_in_scope : & FxHashSet < TraitId > ,
1061
1100
visible_from_module : VisibleFromModule ,
1062
1101
name : Option < & Name > ,
1063
- mut callback : & mut dyn FnMut ( ReceiverAdjustments , AssocItemId , bool ) -> ControlFlow < ( ) > ,
1102
+ callback : & mut dyn MethodCandidateCallback ,
1064
1103
) -> ControlFlow < ( ) > {
1065
1104
let receiver_ty = table. instantiate_canonical ( receiver_ty) ;
1066
1105
// We're looking for methods with *receiver* type receiver_ty. These could
@@ -1076,7 +1115,9 @@ fn iterate_method_candidates_by_receiver(
1076
1115
Some ( & receiver_ty) ,
1077
1116
Some ( receiver_adjustments. clone ( ) ) ,
1078
1117
visible_from_module,
1079
- & mut callback,
1118
+ & mut |adjustments, item, is_visible| {
1119
+ callback. on_inherent_method ( adjustments, item, is_visible)
1120
+ } ,
1080
1121
) ?
1081
1122
}
1082
1123
ControlFlow :: Continue ( ( ) )
@@ -1096,7 +1137,9 @@ fn iterate_method_candidates_by_receiver(
1096
1137
name,
1097
1138
Some ( & receiver_ty) ,
1098
1139
Some ( receiver_adjustments. clone ( ) ) ,
1099
- & mut callback,
1140
+ & mut |adjustments, item, is_visible| {
1141
+ callback. on_trait_method ( adjustments, item, is_visible)
1142
+ } ,
1100
1143
) ?
1101
1144
}
1102
1145
ControlFlow :: Continue ( ( ) )
@@ -1111,7 +1154,7 @@ fn iterate_method_candidates_for_self_ty(
1111
1154
traits_in_scope : & FxHashSet < TraitId > ,
1112
1155
visible_from_module : VisibleFromModule ,
1113
1156
name : Option < & Name > ,
1114
- mut callback : & mut dyn FnMut ( ReceiverAdjustments , AssocItemId , bool ) -> ControlFlow < ( ) > ,
1157
+ callback : & mut dyn MethodCandidateCallback ,
1115
1158
) -> ControlFlow < ( ) > {
1116
1159
let mut table = InferenceTable :: new ( db, env) ;
1117
1160
let self_ty = table. instantiate_canonical ( self_ty. clone ( ) ) ;
@@ -1122,7 +1165,9 @@ fn iterate_method_candidates_for_self_ty(
1122
1165
None ,
1123
1166
None ,
1124
1167
visible_from_module,
1125
- & mut callback,
1168
+ & mut |adjustments, item, is_visible| {
1169
+ callback. on_inherent_method ( adjustments, item, is_visible)
1170
+ } ,
1126
1171
) ?;
1127
1172
iterate_trait_method_candidates (
1128
1173
& self_ty,
@@ -1131,7 +1176,9 @@ fn iterate_method_candidates_for_self_ty(
1131
1176
name,
1132
1177
None ,
1133
1178
None ,
1134
- callback,
1179
+ & mut |adjustments, item, is_visible| {
1180
+ callback. on_trait_method ( adjustments, item, is_visible)
1181
+ } ,
1135
1182
)
1136
1183
}
1137
1184
0 commit comments