From 197664e98990d378b1de634d37dd878783ae8103 Mon Sep 17 00:00:00 2001 From: topecongiro Date: Sat, 16 Sep 2017 11:27:24 +0900 Subject: [PATCH 1/2] Add suggestion to needless_borrow --- clippy_lints/src/needless_borrow.rs | 27 +++++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/clippy_lints/src/needless_borrow.rs b/clippy_lints/src/needless_borrow.rs index 7dd42bca3..d8f892d40 100644 --- a/clippy_lints/src/needless_borrow.rs +++ b/clippy_lints/src/needless_borrow.rs @@ -6,7 +6,7 @@ use rustc::lint::*; use rustc::hir::{BindingAnnotation, Expr, ExprAddrOf, MutImmutable, Pat, PatKind}; use rustc::ty; use rustc::ty::adjustment::{Adjust, Adjustment}; -use utils::{in_macro, span_lint}; +use utils::{in_macro, snippet_opt, span_lint_and_then}; /// **What it does:** Checks for address of operations (`&`) that are going to /// be dereferenced immediately by the compiler. @@ -54,12 +54,17 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for NeedlessBorrow { .. }] = *adj3 { - span_lint( + span_lint_and_then( cx, NEEDLESS_BORROW, e.span, - "this expression borrows a reference that is immediately dereferenced by the \ - compiler", + "this expression borrows a reference that is immediately dereferenced \ + by the compiler", + |db| { + if let Some(snippet) = snippet_opt(cx, inner.span) { + db.span_suggestion(e.span, "change this to", snippet); + } + } ); } } @@ -71,14 +76,24 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for NeedlessBorrow { return; } if_let_chain! {[ - let PatKind::Binding(BindingAnnotation::Ref, _, _, _) = pat.node, + let PatKind::Binding(BindingAnnotation::Ref, _, name, _) = pat.node, let ty::TyRef(_, ref tam) = cx.tables.pat_ty(pat).sty, tam.mutbl == MutImmutable, let ty::TyRef(_, ref tam) = tam.ty.sty, // only lint immutable refs, because borrowed `&mut T` cannot be moved out tam.mutbl == MutImmutable, ], { - span_lint(cx, NEEDLESS_BORROW, pat.span, "this pattern creates a reference to a reference") + span_lint_and_then( + cx, + NEEDLESS_BORROW, + pat.span, + "this pattern creates a reference to a reference", + |db| { + if let Some(snippet) = snippet_opt(cx, name.span) { + db.span_suggestion(pat.span, "change this to", snippet); + } + } + ) }} } } From d8afe2ccbcab2248be6eedf7cf5f2cc77a4e8230 Mon Sep 17 00:00:00 2001 From: topecongiro Date: Sat, 16 Sep 2017 11:27:46 +0900 Subject: [PATCH 2/2] Update tests --- tests/ui/eta.stderr | 2 +- tests/ui/needless_borrow.stderr | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/tests/ui/eta.stderr b/tests/ui/eta.stderr index 88abbaa73..5dca265c2 100644 --- a/tests/ui/eta.stderr +++ b/tests/ui/eta.stderr @@ -22,7 +22,7 @@ error: this expression borrows a reference that is immediately dereferenced by t --> $DIR/eta.rs:11:21 | 11 | all(&[1, 2, 3], &&2, |x, y| below(x, y)); //is adjusted - | ^^^ + | ^^^ help: change this to: `&2` | = note: `-D needless-borrow` implied by `-D warnings` diff --git a/tests/ui/needless_borrow.stderr b/tests/ui/needless_borrow.stderr index d90c39664..fde38508b 100644 --- a/tests/ui/needless_borrow.stderr +++ b/tests/ui/needless_borrow.stderr @@ -2,7 +2,7 @@ error: this expression borrows a reference that is immediately dereferenced by t --> $DIR/needless_borrow.rs:13:15 | 13 | let c = x(&&a); - | ^^^ + | ^^^ help: change this to: `&a` | = note: `-D needless-borrow` implied by `-D warnings` @@ -10,13 +10,13 @@ error: this pattern creates a reference to a reference --> $DIR/needless_borrow.rs:20:17 | 20 | if let Some(ref cake) = Some(&5) {} - | ^^^^^^^^ + | ^^^^^^^^ help: change this to: `cake` error: this expression borrows a reference that is immediately dereferenced by the compiler --> $DIR/needless_borrow.rs:27:15 | 27 | 46 => &&a, - | ^^^ + | ^^^ help: change this to: `&a` error: this pattern takes a reference on something that is being de-referenced --> $DIR/needless_borrow.rs:49:34 @@ -36,7 +36,7 @@ error: this pattern creates a reference to a reference --> $DIR/needless_borrow.rs:50:31 | 50 | let _ = v.iter().filter(|&ref a| a.is_empty()); - | ^^^^^ + | ^^^^^ help: change this to: `a` error: aborting due to 6 previous errors