@@ -1075,56 +1075,57 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for Methods {
1075
1075
if let hir:: ImplItemKind :: Method ( ref sig, id) = impl_item. node;
1076
1076
if let Some ( first_arg) = iter_input_pats( & sig. decl, cx. tcx. hir( ) . body( id) ) . next( ) ;
1077
1077
if let hir:: ItemKind :: Impl ( _, _, _, _, None , _, _) = item. node;
1078
+
1079
+ let method_def_id = cx. tcx. hir( ) . local_def_id( impl_item. hir_id) ;
1080
+ let method_sig = cx. tcx. fn_sig( method_def_id) ;
1081
+ let method_sig = cx. tcx. erase_late_bound_regions( & method_sig) ;
1082
+
1083
+ let first_arg_ty = & method_sig. inputs( ) . iter( ) . next( ) ;
1084
+
1085
+ // check conventions w.r.t. conversion method names and predicates
1086
+ if let Some ( first_arg_ty) = first_arg_ty;
1087
+
1078
1088
then {
1079
- let method_def_id = cx. tcx. hir( ) . local_def_id( impl_item. hir_id) ;
1080
- let method_sig = cx. tcx. fn_sig( method_def_id) ;
1081
- let method_sig = cx. tcx. erase_late_bound_regions( & method_sig) ;
1082
-
1083
- let first_arg_ty = & method_sig. inputs( ) . iter( ) . next( ) ;
1084
-
1085
- // check conventions w.r.t. conversion method names and predicates
1086
- if let Some ( first_arg_ty) = first_arg_ty {
1087
-
1088
- if cx. access_levels. is_exported( impl_item. hir_id) {
1089
- // check missing trait implementations
1090
- for & ( method_name, n_args, self_kind, out_type, trait_name) in & TRAIT_METHODS {
1091
- if name == method_name &&
1092
- sig. decl. inputs. len( ) == n_args &&
1093
- out_type. matches( cx, & sig. decl. output) &&
1094
- self_kind. matches( cx, ty, first_arg_ty) {
1095
- span_lint( cx, SHOULD_IMPLEMENT_TRAIT , impl_item. span, & format!(
1096
- "defining a method called `{}` on this type; consider implementing \
1097
- the `{}` trait or choosing a less ambiguous name", name, trait_name) ) ;
1098
- }
1089
+ if cx. access_levels. is_exported( impl_item. hir_id) {
1090
+ // check missing trait implementations
1091
+ for & ( method_name, n_args, self_kind, out_type, trait_name) in & TRAIT_METHODS {
1092
+ if name == method_name &&
1093
+ sig. decl. inputs. len( ) == n_args &&
1094
+ out_type. matches( cx, & sig. decl. output) &&
1095
+ self_kind. matches( cx, ty, first_arg_ty) {
1096
+ span_lint( cx, SHOULD_IMPLEMENT_TRAIT , impl_item. span, & format!(
1097
+ "defining a method called `{}` on this type; consider implementing \
1098
+ the `{}` trait or choosing a less ambiguous name", name, trait_name) ) ;
1099
1099
}
1100
1100
}
1101
+ }
1101
1102
1102
- for & ( ref conv, self_kinds) in & CONVENTIONS {
1103
- if conv. check( & name) {
1104
- if !self_kinds
1105
- . iter( )
1106
- . any( |k| k. matches( cx, ty, first_arg_ty) ) {
1107
- let lint = if item. vis. node. is_pub( ) {
1108
- WRONG_PUB_SELF_CONVENTION
1109
- } else {
1110
- WRONG_SELF_CONVENTION
1111
- } ;
1112
- span_lint( cx,
1113
- lint,
1114
- first_arg. pat. span,
1115
- & format!( "methods called `{}` usually take {}; consider choosing a less \
1116
- ambiguous name",
1117
- conv,
1118
- & self_kinds. iter( )
1119
- . map( |k| k. description( ) )
1120
- . collect:: <Vec <_>>( )
1121
- . join( " or " ) ) ) ;
1122
- }
1103
+ if let Some ( ( ref conv, self_kinds) ) = & CONVENTIONS
1104
+ . iter( )
1105
+ . find( |( ref conv, _) | conv. check( & name) )
1106
+ {
1107
+ if !self_kinds. iter( ) . any( |k| k. matches( cx, ty, first_arg_ty) ) {
1108
+ let lint = if item. vis. node. is_pub( ) {
1109
+ WRONG_PUB_SELF_CONVENTION
1110
+ } else {
1111
+ WRONG_SELF_CONVENTION
1112
+ } ;
1123
1113
1124
- // Only check the first convention to match (CONVENTIONS should be listed from most to least
1125
- // specific)
1126
- break ;
1127
- }
1114
+ span_lint(
1115
+ cx,
1116
+ lint,
1117
+ first_arg. pat. span,
1118
+ & format!(
1119
+ "methods called `{}` usually take {}; consider choosing a less \
1120
+ ambiguous name",
1121
+ conv,
1122
+ & self_kinds
1123
+ . iter( )
1124
+ . map( |k| k. description( ) )
1125
+ . collect:: <Vec <_>>( )
1126
+ . join( " or " )
1127
+ ) ,
1128
+ ) ;
1128
1129
}
1129
1130
}
1130
1131
}
@@ -1134,10 +1135,8 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for Methods {
1134
1135
let ret_ty = return_ty ( cx, impl_item. hir_id ) ;
1135
1136
1136
1137
// walk the return type and check for Self (this does not check associated types)
1137
- for inner_type in ret_ty. walk ( ) {
1138
- if same_tys ( cx, ty, inner_type) {
1139
- return ;
1140
- }
1138
+ if ret_ty. walk ( ) . any ( |inner_type| same_tys ( cx, ty, inner_type) ) {
1139
+ return ;
1141
1140
}
1142
1141
1143
1142
// if return type is impl trait, check the associated types
0 commit comments