Skip to content

Commit 990f8bf

Browse files
committed
refactor: Add some methods
1 parent 007fae1 commit 990f8bf

7 files changed

+185
-9
lines changed

clippy_lints/src/methods/filter_map.rs

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use if_chain::if_chain;
66
use rustc_errors::Applicability;
77
use rustc_hir as hir;
88
use rustc_hir::def::Res;
9-
use rustc_hir::{Expr, ExprKind, PatKind, QPath, UnOp};
9+
use rustc_hir::{Expr, ExprKind, PatKind, PathSegment, QPath, UnOp};
1010
use rustc_lint::LateContext;
1111
use rustc_span::source_map::Span;
1212
use rustc_span::symbol::{sym, Symbol};
@@ -157,8 +157,8 @@ pub(super) fn check<'tcx>(
157157
};
158158

159159
if match map_arg.kind {
160-
ExprKind::MethodCall(clone, [original_arg], _) => {
161-
clone.ident.name == sym::clone
160+
ExprKind::MethodCall(method, [original_arg], _) => {
161+
acceptable_methods(method)
162162
&& SpanlessEq::new(cx).expr_fallback(eq_fallback).eq_expr(filter_arg, original_arg)
163163
},
164164
_ => SpanlessEq::new(cx).expr_fallback(eq_fallback).eq_expr(filter_arg, map_arg)
@@ -179,3 +179,16 @@ pub(super) fn check<'tcx>(
179179
}
180180
}
181181
}
182+
183+
fn acceptable_methods(method: &PathSegment<'_>) -> bool {
184+
let methods: [Symbol; 6] = [
185+
sym::clone,
186+
sym::as_ref,
187+
sym!(as_deref),
188+
sym!(as_mut),
189+
sym!(as_deref_mut),
190+
sym!(to_owned),
191+
];
192+
193+
methods.contains(&method.ident.name)
194+
}

tests/ui/manual_filter_map.fixed

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,8 +52,28 @@ fn issue_8920() {
5252
.iter()
5353
.filter_map(|f| f.field.clone());
5454

55-
let vec = vec![ResultFoo {
55+
let mut vec = vec![ResultFoo {
5656
field: Ok(String::from("str")),
5757
}];
5858
let _ = vec.iter().filter_map(|f| f.field.clone().ok());
59+
60+
let _ = vec
61+
.iter()
62+
.filter_map(|f| f.field.as_ref().ok());
63+
64+
let _ = vec
65+
.iter()
66+
.filter_map(|f| f.field.as_deref().ok());
67+
68+
let _ = vec
69+
.iter_mut()
70+
.filter_map(|f| f.field.as_mut().ok());
71+
72+
let _ = vec
73+
.iter_mut()
74+
.filter_map(|f| f.field.as_deref_mut().ok());
75+
76+
let _ = vec
77+
.iter()
78+
.filter_map(|f| f.field.to_owned().ok());
5979
}

tests/ui/manual_filter_map.rs

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,33 @@ fn issue_8920() {
5353
.filter(|f| f.field.is_some())
5454
.map(|f| f.field.clone().unwrap());
5555

56-
let vec = vec![ResultFoo {
56+
let mut vec = vec![ResultFoo {
5757
field: Ok(String::from("str")),
5858
}];
5959
let _ = vec.iter().filter(|f| f.field.is_ok()).map(|f| f.field.clone().unwrap());
60+
61+
let _ = vec
62+
.iter()
63+
.filter(|f| f.field.is_ok())
64+
.map(|f| f.field.as_ref().unwrap());
65+
66+
let _ = vec
67+
.iter()
68+
.filter(|f| f.field.is_ok())
69+
.map(|f| f.field.as_deref().unwrap());
70+
71+
let _ = vec
72+
.iter_mut()
73+
.filter(|f| f.field.is_ok())
74+
.map(|f| f.field.as_mut().unwrap());
75+
76+
let _ = vec
77+
.iter_mut()
78+
.filter(|f| f.field.is_ok())
79+
.map(|f| f.field.as_deref_mut().unwrap());
80+
81+
let _ = vec
82+
.iter()
83+
.filter(|f| f.field.is_ok())
84+
.map(|f| f.field.to_owned().unwrap());
6085
}

tests/ui/manual_filter_map.stderr

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,5 +32,45 @@ error: `filter(..).map(..)` can be simplified as `filter_map(..)`
3232
LL | let _ = vec.iter().filter(|f| f.field.is_ok()).map(|f| f.field.clone().unwrap());
3333
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `filter_map(|f| f.field.clone().ok())`
3434

35-
error: aborting due to 5 previous errors
35+
error: `filter(..).map(..)` can be simplified as `filter_map(..)`
36+
--> $DIR/manual_filter_map.rs:63:10
37+
|
38+
LL | .filter(|f| f.field.is_ok())
39+
| __________^
40+
LL | | .map(|f| f.field.as_ref().unwrap());
41+
| |___________________________________________^ help: try: `filter_map(|f| f.field.as_ref().ok())`
42+
43+
error: `filter(..).map(..)` can be simplified as `filter_map(..)`
44+
--> $DIR/manual_filter_map.rs:68:10
45+
|
46+
LL | .filter(|f| f.field.is_ok())
47+
| __________^
48+
LL | | .map(|f| f.field.as_deref().unwrap());
49+
| |_____________________________________________^ help: try: `filter_map(|f| f.field.as_deref().ok())`
50+
51+
error: `filter(..).map(..)` can be simplified as `filter_map(..)`
52+
--> $DIR/manual_filter_map.rs:73:10
53+
|
54+
LL | .filter(|f| f.field.is_ok())
55+
| __________^
56+
LL | | .map(|f| f.field.as_mut().unwrap());
57+
| |___________________________________________^ help: try: `filter_map(|f| f.field.as_mut().ok())`
58+
59+
error: `filter(..).map(..)` can be simplified as `filter_map(..)`
60+
--> $DIR/manual_filter_map.rs:78:10
61+
|
62+
LL | .filter(|f| f.field.is_ok())
63+
| __________^
64+
LL | | .map(|f| f.field.as_deref_mut().unwrap());
65+
| |_________________________________________________^ help: try: `filter_map(|f| f.field.as_deref_mut().ok())`
66+
67+
error: `filter(..).map(..)` can be simplified as `filter_map(..)`
68+
--> $DIR/manual_filter_map.rs:83:10
69+
|
70+
LL | .filter(|f| f.field.is_ok())
71+
| __________^
72+
LL | | .map(|f| f.field.to_owned().unwrap());
73+
| |_____________________________________________^ help: try: `filter_map(|f| f.field.to_owned().ok())`
74+
75+
error: aborting due to 10 previous errors
3676

tests/ui/manual_find_map.fixed

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,26 @@ fn issue_8920() {
5050
}];
5151
let _ = vec.iter().find_map(|f| f.field.clone());
5252

53-
let vec = vec![ResultFoo {
53+
let mut vec = vec![ResultFoo {
5454
field: Ok(String::from("str")),
5555
}];
5656
let _ = vec.iter().find_map(|f| f.field.clone().ok());
57+
58+
let _ = vec.iter().find_map(|f| f.field.as_ref().ok());
59+
60+
let _ = vec
61+
.iter()
62+
.find_map(|f| f.field.as_deref().ok());
63+
64+
let _ = vec
65+
.iter_mut()
66+
.find_map(|f| f.field.as_mut().ok());
67+
68+
let _ = vec
69+
.iter_mut()
70+
.find_map(|f| f.field.as_deref_mut().ok());
71+
72+
let _ = vec
73+
.iter()
74+
.find_map(|f| f.field.to_owned().ok());
5775
}

tests/ui/manual_find_map.rs

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,30 @@ fn issue_8920() {
5050
}];
5151
let _ = vec.iter().find(|f| f.field.is_some()).map(|f| f.field.clone().unwrap());
5252

53-
let vec = vec![ResultFoo {
53+
let mut vec = vec![ResultFoo {
5454
field: Ok(String::from("str")),
5555
}];
5656
let _ = vec.iter().find(|f| f.field.is_ok()).map(|f| f.field.clone().unwrap());
57+
58+
let _ = vec.iter().find(|f| f.field.is_ok()).map(|f| f.field.as_ref().unwrap());
59+
60+
let _ = vec
61+
.iter()
62+
.find(|f| f.field.is_ok())
63+
.map(|f| f.field.as_deref().unwrap());
64+
65+
let _ = vec
66+
.iter_mut()
67+
.find(|f| f.field.is_ok())
68+
.map(|f| f.field.as_mut().unwrap());
69+
70+
let _ = vec
71+
.iter_mut()
72+
.find(|f| f.field.is_ok())
73+
.map(|f| f.field.as_deref_mut().unwrap());
74+
75+
let _ = vec
76+
.iter()
77+
.find(|f| f.field.is_ok())
78+
.map(|f| f.field.to_owned().unwrap());
5779
}

tests/ui/manual_find_map.stderr

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,5 +30,43 @@ error: `find(..).map(..)` can be simplified as `find_map(..)`
3030
LL | let _ = vec.iter().find(|f| f.field.is_ok()).map(|f| f.field.clone().unwrap());
3131
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `find_map(|f| f.field.clone().ok())`
3232

33-
error: aborting due to 5 previous errors
33+
error: `find(..).map(..)` can be simplified as `find_map(..)`
34+
--> $DIR/manual_find_map.rs:58:24
35+
|
36+
LL | let _ = vec.iter().find(|f| f.field.is_ok()).map(|f| f.field.as_ref().unwrap());
37+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `find_map(|f| f.field.as_ref().ok())`
38+
39+
error: `find(..).map(..)` can be simplified as `find_map(..)`
40+
--> $DIR/manual_find_map.rs:62:10
41+
|
42+
LL | .find(|f| f.field.is_ok())
43+
| __________^
44+
LL | | .map(|f| f.field.as_deref().unwrap());
45+
| |_____________________________________________^ help: try: `find_map(|f| f.field.as_deref().ok())`
46+
47+
error: `find(..).map(..)` can be simplified as `find_map(..)`
48+
--> $DIR/manual_find_map.rs:67:10
49+
|
50+
LL | .find(|f| f.field.is_ok())
51+
| __________^
52+
LL | | .map(|f| f.field.as_mut().unwrap());
53+
| |___________________________________________^ help: try: `find_map(|f| f.field.as_mut().ok())`
54+
55+
error: `find(..).map(..)` can be simplified as `find_map(..)`
56+
--> $DIR/manual_find_map.rs:72:10
57+
|
58+
LL | .find(|f| f.field.is_ok())
59+
| __________^
60+
LL | | .map(|f| f.field.as_deref_mut().unwrap());
61+
| |_________________________________________________^ help: try: `find_map(|f| f.field.as_deref_mut().ok())`
62+
63+
error: `find(..).map(..)` can be simplified as `find_map(..)`
64+
--> $DIR/manual_find_map.rs:77:10
65+
|
66+
LL | .find(|f| f.field.is_ok())
67+
| __________^
68+
LL | | .map(|f| f.field.to_owned().unwrap());
69+
| |_____________________________________________^ help: try: `find_map(|f| f.field.to_owned().ok())`
70+
71+
error: aborting due to 10 previous errors
3472

0 commit comments

Comments
 (0)