Fix suggestion for multiple derefs

This commit is contained in:
HMPerson1 2018-10-19 14:51:25 -04:00
parent a2be050965
commit 2a9dec681f
No known key found for this signature in database
GPG Key ID: 1FB477DDD27821CE
3 changed files with 52 additions and 3 deletions

View File

@ -1250,7 +1250,7 @@ fn lint_clone_on_copy(cx: &LateContext<'_, '_>, expr: &hir::Expr, arg: &hir::Exp
if is_copy(cx, ty) {
let snip;
if let Some(snippet) = sugg::Sugg::hir_opt(cx, arg) {
// x.clone() might have dereferenced x, possibly through a Deref impl
// x.clone() might have dereferenced x, possibly through Deref impls
if cx.tables.expr_ty(arg) != ty {
let parent = cx.tcx.hir.get_parent_node(expr.id);
match cx.tcx.hir.get(parent) {
@ -1273,7 +1273,18 @@ fn lint_clone_on_copy(cx: &LateContext<'_, '_>, expr: &hir::Expr, arg: &hir::Exp
},
_ => {},
}
snip = Some(("try dereferencing it", format!("{}", snippet.deref())));
let deref_count = cx.tables.expr_adjustments(arg).iter()
.filter(|adj| {
if let ty::adjustment::Adjust::Deref(_) = adj.kind {
true
} else {
false
}
})
.count();
let derefs: String = iter::repeat('*').take(deref_count).collect();
snip = Some(("try dereferencing it", format!("{}{}", derefs, snippet)));
} else {
snip = Some(("try removing the `clone` call", format!("{}", snippet)));
}

View File

@ -79,3 +79,35 @@ fn iter_clone_collect() {
let v3 : HashSet<isize> = v.iter().cloned().collect();
let v4 : VecDeque<isize> = v.iter().cloned().collect();
}
mod many_derefs {
struct A;
struct B;
struct C;
struct D;
#[derive(Copy, Clone)]
struct E;
macro_rules! impl_deref {
($src:ident, $dst:ident) => {
impl std::ops::Deref for $src {
type Target = $dst;
fn deref(&self) -> &Self::Target { &$dst }
}
}
}
impl_deref!(A, B);
impl_deref!(B, C);
impl_deref!(C, D);
impl std::ops::Deref for D {
type Target = &'static E;
fn deref(&self) -> &Self::Target { &&E }
}
fn go1() {
let a = A;
let _: E = a.clone();
let _: E = *****a;
}
}

View File

@ -86,5 +86,11 @@ error: called `cloned().collect()` on a slice to create a `Vec`. Calling `to_vec
|
= note: `-D clippy::iter-cloned-collect` implied by `-D warnings`
error: aborting due to 12 previous errors
error: using `clone` on a `Copy` type
--> $DIR/unnecessary_clone.rs:110:20
|
110 | let _: E = a.clone();
| ^^^^^^^^^ help: try dereferencing it: `*****a`
error: aborting due to 13 previous errors