@@ -1141,11 +1141,36 @@ fn detect_same_item_push<'tcx>(
11411141 if same_item_push_visitor. should_lint {
11421142 if let Some ( ( vec, pushed_item) ) = same_item_push_visitor. vec_push {
11431143 // 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 ( ) ) {
11491174 span_lint_and_help (
11501175 cx,
11511176 SAME_ITEM_PUSH ,
0 commit comments