mirror of
https://github.com/rust-lang/rust-clippy
synced 2024-11-27 15:11:30 +00:00
Merge pull request #2056 from topecongiro/issue-1851
Add suggestion to needless_borrow
This commit is contained in:
commit
013b1f5923
3 changed files with 26 additions and 11 deletions
|
@ -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);
|
||||
}
|
||||
}
|
||||
)
|
||||
}}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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`
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
Loading…
Reference in a new issue