@@ -1141,11 +1141,36 @@ fn detect_same_item_push<'tcx>(
1141
1141
if same_item_push_visitor. should_lint {
1142
1142
if let Some ( ( vec, pushed_item) ) = same_item_push_visitor. vec_push {
1143
1143
// Make sure that the push does not involve possibly mutating values
1144
- if mutated_variables ( pushed_item, cx) . map_or ( false , |mutvars| mutvars. is_empty ( ) ) {
1145
- if let PatKind :: Wild = pat. kind {
1146
- let vec_str = snippet_with_macro_callsite ( cx, vec. span , "" ) ;
1147
- let item_str = snippet_with_macro_callsite ( cx, pushed_item. span , "" ) ;
1148
-
1144
+ if let PatKind :: Wild = pat. kind {
1145
+ let vec_str = snippet_with_macro_callsite ( cx, vec. span , "" ) ;
1146
+ let item_str = snippet_with_macro_callsite ( cx, pushed_item. span , "" ) ;
1147
+ if let ExprKind :: Path ( ref qpath) = pushed_item. kind {
1148
+ if let Res :: Local ( hir_id) = qpath_res ( cx, qpath, pushed_item. hir_id ) {
1149
+ let node = cx. tcx . hir ( ) . get ( hir_id) ;
1150
+ if_chain ! {
1151
+ if let Node :: Binding ( pat) = node;
1152
+ if let PatKind :: Binding ( bind_ann, ..) = pat. kind;
1153
+ then {
1154
+ match bind_ann {
1155
+ BindingAnnotation :: RefMut | BindingAnnotation :: Mutable => { } ,
1156
+ _ => {
1157
+ span_lint_and_help(
1158
+ cx,
1159
+ SAME_ITEM_PUSH ,
1160
+ vec. span,
1161
+ "it looks like the same item is being pushed into this Vec" ,
1162
+ None ,
1163
+ & format!(
1164
+ "try using vec![{};SIZE] or {}.resize(NEW_SIZE, {})" ,
1165
+ item_str, vec_str, item_str
1166
+ ) ,
1167
+ )
1168
+ }
1169
+ }
1170
+ }
1171
+ }
1172
+ }
1173
+ } else if mutated_variables ( pushed_item, cx) . map_or ( false , |mutvars| mutvars. is_empty ( ) ) {
1149
1174
span_lint_and_help (
1150
1175
cx,
1151
1176
SAME_ITEM_PUSH ,
0 commit comments