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