]> git.lizzy.rs Git - rust.git/blob - tests/ui/manual_filter_map.fixed
refactor: Add some methods
[rust.git] / tests / ui / manual_filter_map.fixed
1 // run-rustfix
2 #![allow(dead_code)]
3 #![warn(clippy::manual_filter_map)]
4 #![allow(clippy::redundant_closure)] // FIXME suggestion may have redundant closure
5
6 fn main() {
7     // is_some(), unwrap()
8     let _ = (0..).filter_map(|a| to_opt(a));
9
10     // ref pattern, expect()
11     let _ = (0..).filter_map(|a| to_opt(a));
12
13     // is_ok(), unwrap_or()
14     let _ = (0..).filter_map(|a| to_res(a).ok());
15 }
16
17 fn no_lint() {
18     // no shared code
19     let _ = (0..).filter(|n| *n > 1).map(|n| n + 1);
20
21     // very close but different since filter() provides a reference
22     let _ = (0..).filter(|n| to_opt(n).is_some()).map(|a| to_opt(a).unwrap());
23
24     // similar but different
25     let _ = (0..).filter(|n| to_opt(n).is_some()).map(|n| to_res(n).unwrap());
26     let _ = (0..)
27         .filter(|n| to_opt(n).map(|n| n + 1).is_some())
28         .map(|a| to_opt(a).unwrap());
29 }
30
31 fn to_opt<T>(_: T) -> Option<T> {
32     unimplemented!()
33 }
34
35 fn to_res<T>(_: T) -> Result<T, ()> {
36     unimplemented!()
37 }
38
39 struct OptionFoo {
40     field: Option<String>,
41 }
42
43 struct ResultFoo {
44     field: Result<String, ()>,
45 }
46
47 fn issue_8920() {
48     let vec = vec![OptionFoo {
49         field: Some(String::from("str")),
50     }];
51     let _ = vec
52         .iter()
53         .filter_map(|f| f.field.clone());
54
55     let mut vec = vec![ResultFoo {
56         field: Ok(String::from("str")),
57     }];
58     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());
79 }