@@ -1141,11 +1141,31 @@ 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_chain ! {
1149
+ if let Res :: Local ( hir_id) = qpath_res( cx, qpath, pushed_item. hir_id) ;
1150
+ let node = cx. tcx. hir( ) . get( hir_id) ;
1151
+ if let Node :: Binding ( pat) = node;
1152
+ if let PatKind :: Binding ( bind_ann, ..) = pat. kind;
1153
+ if !matches!( bind_ann, BindingAnnotation :: RefMut | BindingAnnotation :: Mutable ) ;
1154
+ then {
1155
+ span_lint_and_help(
1156
+ cx,
1157
+ SAME_ITEM_PUSH ,
1158
+ vec. span,
1159
+ "it looks like the same item is being pushed into this Vec" ,
1160
+ None ,
1161
+ & format!(
1162
+ "try using vec![{};SIZE] or {}.resize(NEW_SIZE, {})" ,
1163
+ item_str, vec_str, item_str
1164
+ ) ,
1165
+ )
1166
+ }
1167
+ }
1168
+ } else if mutated_variables ( pushed_item, cx) . map_or ( false , |mutvars| mutvars. is_empty ( ) ) {
1149
1169
span_lint_and_help (
1150
1170
cx,
1151
1171
SAME_ITEM_PUSH ,
0 commit comments