Skip to content

Commit 42cf985

Browse files
committed
refactor: check copied and cloned
1 parent 990f8bf commit 42cf985

7 files changed

+227
-137
lines changed

clippy_lints/src/methods/filter_map.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -181,9 +181,11 @@ pub(super) fn check<'tcx>(
181181
}
182182

183183
fn acceptable_methods(method: &PathSegment<'_>) -> bool {
184-
let methods: [Symbol; 6] = [
184+
let methods: [Symbol; 8] = [
185185
sym::clone,
186186
sym::as_ref,
187+
sym!(copied),
188+
sym!(cloned),
187189
sym!(as_deref),
188190
sym!(as_mut),
189191
sym!(as_deref_mut),

tests/ui/manual_filter_map.fixed

Lines changed: 26 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -36,44 +36,52 @@ fn to_res<T>(_: T) -> Result<T, ()> {
3636
unimplemented!()
3737
}
3838

39-
struct OptionFoo {
40-
field: Option<String>,
41-
}
42-
43-
struct ResultFoo {
44-
field: Result<String, ()>,
39+
struct Issue8920<'a> {
40+
option_field: Option<String>,
41+
result_field: Result<String, ()>,
42+
ref_field: Option<&'a usize>,
4543
}
4644

4745
fn issue_8920() {
48-
let vec = vec![OptionFoo {
49-
field: Some(String::from("str")),
46+
let mut vec = vec![Issue8920 {
47+
option_field: Some(String::from("str")),
48+
result_field: Ok(String::from("str")),
49+
ref_field: Some(&1),
5050
}];
51+
5152
let _ = vec
5253
.iter()
53-
.filter_map(|f| f.field.clone());
54+
.filter_map(|f| f.option_field.clone());
5455

55-
let mut vec = vec![ResultFoo {
56-
field: Ok(String::from("str")),
57-
}];
58-
let _ = vec.iter().filter_map(|f| f.field.clone().ok());
56+
let _ = vec
57+
.iter()
58+
.filter_map(|f| f.ref_field.cloned());
59+
60+
let _ = vec
61+
.iter()
62+
.filter_map(|f| f.ref_field.copied());
63+
64+
let _ = vec
65+
.iter()
66+
.filter_map(|f| f.result_field.clone().ok());
5967

6068
let _ = vec
6169
.iter()
62-
.filter_map(|f| f.field.as_ref().ok());
70+
.filter_map(|f| f.result_field.as_ref().ok());
6371

6472
let _ = vec
6573
.iter()
66-
.filter_map(|f| f.field.as_deref().ok());
74+
.filter_map(|f| f.result_field.as_deref().ok());
6775

6876
let _ = vec
6977
.iter_mut()
70-
.filter_map(|f| f.field.as_mut().ok());
78+
.filter_map(|f| f.result_field.as_mut().ok());
7179

7280
let _ = vec
7381
.iter_mut()
74-
.filter_map(|f| f.field.as_deref_mut().ok());
82+
.filter_map(|f| f.result_field.as_deref_mut().ok());
7583

7684
let _ = vec
7785
.iter()
78-
.filter_map(|f| f.field.to_owned().ok());
86+
.filter_map(|f| f.result_field.to_owned().ok());
7987
}

tests/ui/manual_filter_map.rs

Lines changed: 35 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -36,50 +36,61 @@ fn to_res<T>(_: T) -> Result<T, ()> {
3636
unimplemented!()
3737
}
3838

39-
struct OptionFoo {
40-
field: Option<String>,
41-
}
42-
43-
struct ResultFoo {
44-
field: Result<String, ()>,
39+
struct Issue8920<'a> {
40+
option_field: Option<String>,
41+
result_field: Result<String, ()>,
42+
ref_field: Option<&'a usize>,
4543
}
4644

4745
fn issue_8920() {
48-
let vec = vec![OptionFoo {
49-
field: Some(String::from("str")),
46+
let mut vec = vec![Issue8920 {
47+
option_field: Some(String::from("str")),
48+
result_field: Ok(String::from("str")),
49+
ref_field: Some(&1),
5050
}];
51+
5152
let _ = vec
5253
.iter()
53-
.filter(|f| f.field.is_some())
54-
.map(|f| f.field.clone().unwrap());
54+
.filter(|f| f.option_field.is_some())
55+
.map(|f| f.option_field.clone().unwrap());
5556

56-
let mut vec = vec![ResultFoo {
57-
field: Ok(String::from("str")),
58-
}];
59-
let _ = vec.iter().filter(|f| f.field.is_ok()).map(|f| f.field.clone().unwrap());
57+
let _ = vec
58+
.iter()
59+
.filter(|f| f.ref_field.is_some())
60+
.map(|f| f.ref_field.cloned().unwrap());
61+
62+
let _ = vec
63+
.iter()
64+
.filter(|f| f.ref_field.is_some())
65+
.map(|f| f.ref_field.copied().unwrap());
66+
67+
let _ = vec
68+
.iter()
69+
.filter(|f| f.result_field.is_ok())
70+
.map(|f| f.result_field.clone().unwrap());
6071

6172
let _ = vec
6273
.iter()
63-
.filter(|f| f.field.is_ok())
64-
.map(|f| f.field.as_ref().unwrap());
74+
.filter(|f| f.result_field.is_ok())
75+
.map(|f| f.result_field.as_ref().unwrap());
6576

6677
let _ = vec
6778
.iter()
68-
.filter(|f| f.field.is_ok())
69-
.map(|f| f.field.as_deref().unwrap());
79+
.filter(|f| f.result_field.is_ok())
80+
.map(|f| f.result_field.as_deref().unwrap());
7081

7182
let _ = vec
7283
.iter_mut()
73-
.filter(|f| f.field.is_ok())
74-
.map(|f| f.field.as_mut().unwrap());
84+
.filter(|f| f.result_field.is_ok())
85+
.map(|f| f.result_field.as_mut().unwrap());
7586

7687
let _ = vec
7788
.iter_mut()
78-
.filter(|f| f.field.is_ok())
79-
.map(|f| f.field.as_deref_mut().unwrap());
89+
.filter(|f| f.result_field.is_ok())
90+
.map(|f| f.result_field.as_deref_mut().unwrap());
8091

8192
let _ = vec
8293
.iter()
83-
.filter(|f| f.field.is_ok())
84-
.map(|f| f.field.to_owned().unwrap());
94+
.filter(|f| f.result_field.is_ok())
95+
.map(|f| f.result_field.to_owned().unwrap());
8596
}

tests/ui/manual_filter_map.stderr

Lines changed: 46 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -19,58 +19,76 @@ LL | let _ = (0..).filter(|&n| to_res(n).is_ok()).map(|a| to_res(a).unwrap_o
1919
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `filter_map(|a| to_res(a).ok())`
2020

2121
error: `filter(..).map(..)` can be simplified as `filter_map(..)`
22-
--> $DIR/manual_filter_map.rs:53:10
22+
--> $DIR/manual_filter_map.rs:54:10
2323
|
24-
LL | .filter(|f| f.field.is_some())
24+
LL | .filter(|f| f.option_field.is_some())
2525
| __________^
26-
LL | | .map(|f| f.field.clone().unwrap());
27-
| |__________________________________________^ help: try: `filter_map(|f| f.field.clone())`
26+
LL | | .map(|f| f.option_field.clone().unwrap());
27+
| |_________________________________________________^ help: try: `filter_map(|f| f.option_field.clone())`
2828

2929
error: `filter(..).map(..)` can be simplified as `filter_map(..)`
30-
--> $DIR/manual_filter_map.rs:59:24
30+
--> $DIR/manual_filter_map.rs:59:10
3131
|
32-
LL | let _ = vec.iter().filter(|f| f.field.is_ok()).map(|f| f.field.clone().unwrap());
33-
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `filter_map(|f| f.field.clone().ok())`
32+
LL | .filter(|f| f.ref_field.is_some())
33+
| __________^
34+
LL | | .map(|f| f.ref_field.cloned().unwrap());
35+
| |_______________________________________________^ help: try: `filter_map(|f| f.ref_field.cloned())`
36+
37+
error: `filter(..).map(..)` can be simplified as `filter_map(..)`
38+
--> $DIR/manual_filter_map.rs:64:10
39+
|
40+
LL | .filter(|f| f.ref_field.is_some())
41+
| __________^
42+
LL | | .map(|f| f.ref_field.copied().unwrap());
43+
| |_______________________________________________^ help: try: `filter_map(|f| f.ref_field.copied())`
44+
45+
error: `filter(..).map(..)` can be simplified as `filter_map(..)`
46+
--> $DIR/manual_filter_map.rs:69:10
47+
|
48+
LL | .filter(|f| f.result_field.is_ok())
49+
| __________^
50+
LL | | .map(|f| f.result_field.clone().unwrap());
51+
| |_________________________________________________^ help: try: `filter_map(|f| f.result_field.clone().ok())`
3452

3553
error: `filter(..).map(..)` can be simplified as `filter_map(..)`
36-
--> $DIR/manual_filter_map.rs:63:10
54+
--> $DIR/manual_filter_map.rs:74:10
3755
|
38-
LL | .filter(|f| f.field.is_ok())
56+
LL | .filter(|f| f.result_field.is_ok())
3957
| __________^
40-
LL | | .map(|f| f.field.as_ref().unwrap());
41-
| |___________________________________________^ help: try: `filter_map(|f| f.field.as_ref().ok())`
58+
LL | | .map(|f| f.result_field.as_ref().unwrap());
59+
| |__________________________________________________^ help: try: `filter_map(|f| f.result_field.as_ref().ok())`
4260

4361
error: `filter(..).map(..)` can be simplified as `filter_map(..)`
44-
--> $DIR/manual_filter_map.rs:68:10
62+
--> $DIR/manual_filter_map.rs:79:10
4563
|
46-
LL | .filter(|f| f.field.is_ok())
64+
LL | .filter(|f| f.result_field.is_ok())
4765
| __________^
48-
LL | | .map(|f| f.field.as_deref().unwrap());
49-
| |_____________________________________________^ help: try: `filter_map(|f| f.field.as_deref().ok())`
66+
LL | | .map(|f| f.result_field.as_deref().unwrap());
67+
| |____________________________________________________^ help: try: `filter_map(|f| f.result_field.as_deref().ok())`
5068

5169
error: `filter(..).map(..)` can be simplified as `filter_map(..)`
52-
--> $DIR/manual_filter_map.rs:73:10
70+
--> $DIR/manual_filter_map.rs:84:10
5371
|
54-
LL | .filter(|f| f.field.is_ok())
72+
LL | .filter(|f| f.result_field.is_ok())
5573
| __________^
56-
LL | | .map(|f| f.field.as_mut().unwrap());
57-
| |___________________________________________^ help: try: `filter_map(|f| f.field.as_mut().ok())`
74+
LL | | .map(|f| f.result_field.as_mut().unwrap());
75+
| |__________________________________________________^ help: try: `filter_map(|f| f.result_field.as_mut().ok())`
5876

5977
error: `filter(..).map(..)` can be simplified as `filter_map(..)`
60-
--> $DIR/manual_filter_map.rs:78:10
78+
--> $DIR/manual_filter_map.rs:89:10
6179
|
62-
LL | .filter(|f| f.field.is_ok())
80+
LL | .filter(|f| f.result_field.is_ok())
6381
| __________^
64-
LL | | .map(|f| f.field.as_deref_mut().unwrap());
65-
| |_________________________________________________^ help: try: `filter_map(|f| f.field.as_deref_mut().ok())`
82+
LL | | .map(|f| f.result_field.as_deref_mut().unwrap());
83+
| |________________________________________________________^ help: try: `filter_map(|f| f.result_field.as_deref_mut().ok())`
6684

6785
error: `filter(..).map(..)` can be simplified as `filter_map(..)`
68-
--> $DIR/manual_filter_map.rs:83:10
86+
--> $DIR/manual_filter_map.rs:94:10
6987
|
70-
LL | .filter(|f| f.field.is_ok())
88+
LL | .filter(|f| f.result_field.is_ok())
7189
| __________^
72-
LL | | .map(|f| f.field.to_owned().unwrap());
73-
| |_____________________________________________^ help: try: `filter_map(|f| f.field.to_owned().ok())`
90+
LL | | .map(|f| f.result_field.to_owned().unwrap());
91+
| |____________________________________________________^ help: try: `filter_map(|f| f.result_field.to_owned().ok())`
7492

75-
error: aborting due to 10 previous errors
93+
error: aborting due to 12 previous errors
7694

tests/ui/manual_find_map.fixed

Lines changed: 30 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -36,40 +36,52 @@ fn to_res<T>(_: T) -> Result<T, ()> {
3636
unimplemented!()
3737
}
3838

39-
struct OptionFoo {
40-
field: Option<String>,
41-
}
42-
43-
struct ResultFoo {
44-
field: Result<String, ()>,
39+
struct Issue8920<'a> {
40+
option_field: Option<String>,
41+
result_field: Result<String, ()>,
42+
ref_field: Option<&'a usize>,
4543
}
4644

4745
fn issue_8920() {
48-
let vec = vec![OptionFoo {
49-
field: Some(String::from("str")),
46+
let mut vec = vec![Issue8920 {
47+
option_field: Some(String::from("str")),
48+
result_field: Ok(String::from("str")),
49+
ref_field: Some(&1),
5050
}];
51-
let _ = vec.iter().find_map(|f| f.field.clone());
5251

53-
let mut vec = vec![ResultFoo {
54-
field: Ok(String::from("str")),
55-
}];
56-
let _ = vec.iter().find_map(|f| f.field.clone().ok());
52+
let _ = vec
53+
.iter()
54+
.find_map(|f| f.option_field.clone());
55+
56+
let _ = vec
57+
.iter()
58+
.find_map(|f| f.ref_field.cloned());
5759

58-
let _ = vec.iter().find_map(|f| f.field.as_ref().ok());
60+
let _ = vec
61+
.iter()
62+
.find_map(|f| f.ref_field.copied());
63+
64+
let _ = vec
65+
.iter()
66+
.find_map(|f| f.result_field.clone().ok());
67+
68+
let _ = vec
69+
.iter()
70+
.find_map(|f| f.result_field.as_ref().ok());
5971

6072
let _ = vec
6173
.iter()
62-
.find_map(|f| f.field.as_deref().ok());
74+
.find_map(|f| f.result_field.as_deref().ok());
6375

6476
let _ = vec
6577
.iter_mut()
66-
.find_map(|f| f.field.as_mut().ok());
78+
.find_map(|f| f.result_field.as_mut().ok());
6779

6880
let _ = vec
6981
.iter_mut()
70-
.find_map(|f| f.field.as_deref_mut().ok());
82+
.find_map(|f| f.result_field.as_deref_mut().ok());
7183

7284
let _ = vec
7385
.iter()
74-
.find_map(|f| f.field.to_owned().ok());
86+
.find_map(|f| f.result_field.to_owned().ok());
7587
}

0 commit comments

Comments
 (0)