Skip to content

Commit d65c459

Browse files
committed
Auto merge of rust-lang#11360 - lengyijun:any_all, r=blyxyas
[`iter_overeager_cloned`]: detect .cloned().all() and .cloned().any() changelog: [`iter_overeager_cloned`] r? `@blyxyas`
2 parents 080b587 + fb6fad2 commit d65c459

File tree

5 files changed

+36
-14
lines changed

5 files changed

+36
-14
lines changed

clippy_lints/src/methods/iter_overeager_cloned.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ pub(super) enum Op<'a> {
2121
RmCloned,
2222

2323
// rm `.cloned()`
24-
// e.g. `map` `for_each`
24+
// e.g. `map` `for_each` `all` `any`
2525
NeedlessMove(&'a str, &'a Expr<'a>),
2626

2727
// later `.cloned()`

clippy_lints/src/methods/mod.rs

+16-6
Original file line numberDiff line numberDiff line change
@@ -3873,19 +3873,29 @@ impl Methods {
38733873
("add" | "offset" | "sub" | "wrapping_offset" | "wrapping_add" | "wrapping_sub", [_arg]) => {
38743874
zst_offset::check(cx, expr, recv);
38753875
},
3876+
("all", [arg]) => {
3877+
if let Some(("cloned", recv2, [], _, _)) = method_call(recv) {
3878+
iter_overeager_cloned::check(cx, expr, recv, recv2,
3879+
iter_overeager_cloned::Op::NeedlessMove(name, arg), false);
3880+
}
3881+
}
38763882
("and_then", [arg]) => {
38773883
let biom_option_linted = bind_instead_of_map::OptionAndThenSome::check(cx, expr, recv, arg);
38783884
let biom_result_linted = bind_instead_of_map::ResultAndThenOk::check(cx, expr, recv, arg);
38793885
if !biom_option_linted && !biom_result_linted {
38803886
unnecessary_lazy_eval::check(cx, expr, recv, arg, "and");
38813887
}
38823888
},
3883-
("any", [arg]) if let ExprKind::Closure(arg) = arg.kind
3884-
&& let body = cx.tcx.hir().body(arg.body)
3885-
&& let [param] = body.params
3886-
&& let Some(("chars", recv, _, _, _)) = method_call(recv) =>
3887-
{
3888-
string_lit_chars_any::check(cx, expr, recv, param, peel_blocks(body.value), &self.msrv);
3889+
("any", [arg]) => {
3890+
match method_call(recv) {
3891+
Some(("cloned", recv2, [], _, _)) => iter_overeager_cloned::check(cx, expr, recv, recv2, iter_overeager_cloned::Op::NeedlessMove(name, arg), false),
3892+
Some(("chars", recv, _, _, _)) if let ExprKind::Closure(arg) = arg.kind
3893+
&& let body = cx.tcx.hir().body(arg.body)
3894+
&& let [param] = body.params => {
3895+
string_lit_chars_any::check(cx, expr, recv, param, peel_blocks(body.value), &self.msrv);
3896+
}
3897+
_ => {}
3898+
}
38893899
}
38903900
("arg", [arg]) => {
38913901
suspicious_command_arg_space::check(cx, recv, arg, span);

tests/ui/iter_overeager_cloned.fixed

+2-4
Original file line numberDiff line numberDiff line change
@@ -63,11 +63,9 @@ fn main() {
6363

6464
let _ = vec.iter().for_each(|x| assert!(!x.is_empty()));
6565

66-
// Not implemented yet
67-
let _ = vec.iter().cloned().all(|x| x.len() == 1);
66+
let _ = vec.iter().all(|x| x.len() == 1);
6867

69-
// Not implemented yet
70-
let _ = vec.iter().cloned().any(|x| x.len() == 1);
68+
let _ = vec.iter().any(|x| x.len() == 1);
7169

7270
// Should probably stay as it is.
7371
let _ = [0, 1, 2, 3, 4].iter().cloned().take(10);

tests/ui/iter_overeager_cloned.rs

-2
Original file line numberDiff line numberDiff line change
@@ -64,10 +64,8 @@ fn main() {
6464

6565
let _ = vec.iter().cloned().for_each(|x| assert!(!x.is_empty()));
6666

67-
// Not implemented yet
6867
let _ = vec.iter().cloned().all(|x| x.len() == 1);
6968

70-
// Not implemented yet
7169
let _ = vec.iter().cloned().any(|x| x.len() == 1);
7270

7371
// Should probably stay as it is.

tests/ui/iter_overeager_cloned.stderr

+17-1
Original file line numberDiff line numberDiff line change
@@ -146,5 +146,21 @@ LL | let _ = vec.iter().cloned().for_each(|x| assert!(!x.is_empty()));
146146
| |
147147
| help: try: `.for_each(|x| assert!(!x.is_empty()))`
148148

149-
error: aborting due to 17 previous errors
149+
error: unneeded cloning of iterator items
150+
--> $DIR/iter_overeager_cloned.rs:67:13
151+
|
152+
LL | let _ = vec.iter().cloned().all(|x| x.len() == 1);
153+
| ^^^^^^^^^^-------------------------------
154+
| |
155+
| help: try: `.all(|x| x.len() == 1)`
156+
157+
error: unneeded cloning of iterator items
158+
--> $DIR/iter_overeager_cloned.rs:69:13
159+
|
160+
LL | let _ = vec.iter().cloned().any(|x| x.len() == 1);
161+
| ^^^^^^^^^^-------------------------------
162+
| |
163+
| help: try: `.any(|x| x.len() == 1)`
164+
165+
error: aborting due to 19 previous errors
150166

0 commit comments

Comments
 (0)