Skip to content

Commit 12eb1d3

Browse files
committed
Extend unnecessary_lazy_eval to cover bool::then -> bool::then_some
1 parent 8c341d6 commit 12eb1d3

File tree

5 files changed

+43
-35
lines changed

5 files changed

+43
-35
lines changed

clippy_lints/src/methods/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2737,6 +2737,7 @@ impl Methods {
27372737
}
27382738
},
27392739
("take", []) => needless_option_take::check(cx, expr, recv),
2740+
("then", [arg]) => unnecessary_lazy_eval::check(cx, expr, recv, arg, "then_some"),
27402741
("to_os_string" | "to_owned" | "to_path_buf" | "to_vec", []) => {
27412742
implicit_clone::check(cx, name, expr, recv);
27422743
},

clippy_lints/src/methods/unnecessary_lazy_eval.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,9 @@ pub(super) fn check<'tcx>(
2020
) {
2121
let is_option = is_type_diagnostic_item(cx, cx.typeck_results().expr_ty(recv), sym::Option);
2222
let is_result = is_type_diagnostic_item(cx, cx.typeck_results().expr_ty(recv), sym::Result);
23+
let is_bool = is_type_diagnostic_item(cx, cx.typeck_results().expr_ty(recv), sym::bool);
2324

24-
if is_option || is_result {
25+
if is_option || is_result || is_bool {
2526
if let hir::ExprKind::Closure { body, .. } = arg.kind {
2627
let body = cx.tcx.hir().body(body);
2728
let body_expr = &body.value;
@@ -33,8 +34,10 @@ pub(super) fn check<'tcx>(
3334
if eager_or_lazy::switch_to_eager_eval(cx, body_expr) {
3435
let msg = if is_option {
3536
"unnecessary closure used to substitute value for `Option::None`"
36-
} else {
37+
} else if is_result {
3738
"unnecessary closure used to substitute value for `Result::Err`"
39+
} else {
40+
"unnecessary closure used with `bool::then`"
3841
};
3942
let applicability = if body
4043
.params

tests/ui/unnecessary_lazy_eval.fixed

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ fn main() {
3030
let ext_opt = Some(42);
3131
let nested_opt = Some(Some(42));
3232
let nested_tuple_opt = Some(Some((42, 43)));
33+
let cond = true;
3334

3435
// Should lint - Option
3536
let _ = opt.unwrap_or(2);
@@ -42,6 +43,7 @@ fn main() {
4243
let _ = opt.get_or_insert(2);
4344
let _ = opt.ok_or(2);
4445
let _ = nested_tuple_opt.unwrap_or(Some((1, 2)));
46+
let _ = cond.then(|| astronomers_pi);
4547

4648
// Cases when unwrap is not called on a simple variable
4749
let _ = Some(10).unwrap_or(2);

tests/ui/unnecessary_lazy_eval.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ fn main() {
3030
let ext_opt = Some(42);
3131
let nested_opt = Some(Some(42));
3232
let nested_tuple_opt = Some(Some((42, 43)));
33+
let cond = true;
3334

3435
// Should lint - Option
3536
let _ = opt.unwrap_or_else(|| 2);
@@ -42,6 +43,7 @@ fn main() {
4243
let _ = opt.get_or_insert_with(|| 2);
4344
let _ = opt.ok_or_else(|| 2);
4445
let _ = nested_tuple_opt.unwrap_or_else(|| Some((1, 2)));
46+
let _ = cond.then(|| astronomers_pi);
4547

4648
// Cases when unwrap is not called on a simple variable
4749
let _ = Some(10).unwrap_or_else(|| 2);

tests/ui/unnecessary_lazy_eval.stderr

Lines changed: 33 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
error: unnecessary closure used to substitute value for `Option::None`
2-
--> $DIR/unnecessary_lazy_eval.rs:35:13
2+
--> $DIR/unnecessary_lazy_eval.rs:36:13
33
|
44
LL | let _ = opt.unwrap_or_else(|| 2);
55
| ^^^^--------------------
@@ -9,255 +9,255 @@ LL | let _ = opt.unwrap_or_else(|| 2);
99
= note: `-D clippy::unnecessary-lazy-evaluations` implied by `-D warnings`
1010

1111
error: unnecessary closure used to substitute value for `Option::None`
12-
--> $DIR/unnecessary_lazy_eval.rs:36:13
12+
--> $DIR/unnecessary_lazy_eval.rs:37:13
1313
|
1414
LL | let _ = opt.unwrap_or_else(|| astronomers_pi);
1515
| ^^^^---------------------------------
1616
| |
1717
| help: use `unwrap_or(..)` instead: `unwrap_or(astronomers_pi)`
1818

1919
error: unnecessary closure used to substitute value for `Option::None`
20-
--> $DIR/unnecessary_lazy_eval.rs:37:13
20+
--> $DIR/unnecessary_lazy_eval.rs:38:13
2121
|
2222
LL | let _ = opt.unwrap_or_else(|| ext_str.some_field);
2323
| ^^^^-------------------------------------
2424
| |
2525
| help: use `unwrap_or(..)` instead: `unwrap_or(ext_str.some_field)`
2626

2727
error: unnecessary closure used to substitute value for `Option::None`
28-
--> $DIR/unnecessary_lazy_eval.rs:39:13
28+
--> $DIR/unnecessary_lazy_eval.rs:40:13
2929
|
3030
LL | let _ = opt.and_then(|_| ext_opt);
3131
| ^^^^---------------------
3232
| |
3333
| help: use `and(..)` instead: `and(ext_opt)`
3434

3535
error: unnecessary closure used to substitute value for `Option::None`
36-
--> $DIR/unnecessary_lazy_eval.rs:40:13
36+
--> $DIR/unnecessary_lazy_eval.rs:41:13
3737
|
3838
LL | let _ = opt.or_else(|| ext_opt);
3939
| ^^^^-------------------
4040
| |
4141
| help: use `or(..)` instead: `or(ext_opt)`
4242

4343
error: unnecessary closure used to substitute value for `Option::None`
44-
--> $DIR/unnecessary_lazy_eval.rs:41:13
44+
--> $DIR/unnecessary_lazy_eval.rs:42:13
4545
|
4646
LL | let _ = opt.or_else(|| None);
4747
| ^^^^----------------
4848
| |
4949
| help: use `or(..)` instead: `or(None)`
5050

5151
error: unnecessary closure used to substitute value for `Option::None`
52-
--> $DIR/unnecessary_lazy_eval.rs:42:13
52+
--> $DIR/unnecessary_lazy_eval.rs:43:13
5353
|
5454
LL | let _ = opt.get_or_insert_with(|| 2);
5555
| ^^^^------------------------
5656
| |
5757
| help: use `get_or_insert(..)` instead: `get_or_insert(2)`
5858

5959
error: unnecessary closure used to substitute value for `Option::None`
60-
--> $DIR/unnecessary_lazy_eval.rs:43:13
60+
--> $DIR/unnecessary_lazy_eval.rs:44:13
6161
|
6262
LL | let _ = opt.ok_or_else(|| 2);
6363
| ^^^^----------------
6464
| |
6565
| help: use `ok_or(..)` instead: `ok_or(2)`
6666

6767
error: unnecessary closure used to substitute value for `Option::None`
68-
--> $DIR/unnecessary_lazy_eval.rs:44:13
68+
--> $DIR/unnecessary_lazy_eval.rs:45:13
6969
|
7070
LL | let _ = nested_tuple_opt.unwrap_or_else(|| Some((1, 2)));
7171
| ^^^^^^^^^^^^^^^^^-------------------------------
7272
| |
7373
| help: use `unwrap_or(..)` instead: `unwrap_or(Some((1, 2)))`
7474

7575
error: unnecessary closure used to substitute value for `Option::None`
76-
--> $DIR/unnecessary_lazy_eval.rs:47:13
76+
--> $DIR/unnecessary_lazy_eval.rs:49:13
7777
|
7878
LL | let _ = Some(10).unwrap_or_else(|| 2);
7979
| ^^^^^^^^^--------------------
8080
| |
8181
| help: use `unwrap_or(..)` instead: `unwrap_or(2)`
8282

8383
error: unnecessary closure used to substitute value for `Option::None`
84-
--> $DIR/unnecessary_lazy_eval.rs:48:13
84+
--> $DIR/unnecessary_lazy_eval.rs:50:13
8585
|
8686
LL | let _ = Some(10).and_then(|_| ext_opt);
8787
| ^^^^^^^^^---------------------
8888
| |
8989
| help: use `and(..)` instead: `and(ext_opt)`
9090

9191
error: unnecessary closure used to substitute value for `Option::None`
92-
--> $DIR/unnecessary_lazy_eval.rs:49:28
92+
--> $DIR/unnecessary_lazy_eval.rs:51:28
9393
|
9494
LL | let _: Option<usize> = None.or_else(|| ext_opt);
9595
| ^^^^^-------------------
9696
| |
9797
| help: use `or(..)` instead: `or(ext_opt)`
9898

9999
error: unnecessary closure used to substitute value for `Option::None`
100-
--> $DIR/unnecessary_lazy_eval.rs:50:13
100+
--> $DIR/unnecessary_lazy_eval.rs:52:13
101101
|
102102
LL | let _ = None.get_or_insert_with(|| 2);
103103
| ^^^^^------------------------
104104
| |
105105
| help: use `get_or_insert(..)` instead: `get_or_insert(2)`
106106

107107
error: unnecessary closure used to substitute value for `Option::None`
108-
--> $DIR/unnecessary_lazy_eval.rs:51:35
108+
--> $DIR/unnecessary_lazy_eval.rs:53:35
109109
|
110110
LL | let _: Result<usize, usize> = None.ok_or_else(|| 2);
111111
| ^^^^^----------------
112112
| |
113113
| help: use `ok_or(..)` instead: `ok_or(2)`
114114

115115
error: unnecessary closure used to substitute value for `Option::None`
116-
--> $DIR/unnecessary_lazy_eval.rs:52:28
116+
--> $DIR/unnecessary_lazy_eval.rs:54:28
117117
|
118118
LL | let _: Option<usize> = None.or_else(|| None);
119119
| ^^^^^----------------
120120
| |
121121
| help: use `or(..)` instead: `or(None)`
122122

123123
error: unnecessary closure used to substitute value for `Option::None`
124-
--> $DIR/unnecessary_lazy_eval.rs:55:13
124+
--> $DIR/unnecessary_lazy_eval.rs:57:13
125125
|
126126
LL | let _ = deep.0.unwrap_or_else(|| 2);
127127
| ^^^^^^^--------------------
128128
| |
129129
| help: use `unwrap_or(..)` instead: `unwrap_or(2)`
130130

131131
error: unnecessary closure used to substitute value for `Option::None`
132-
--> $DIR/unnecessary_lazy_eval.rs:56:13
132+
--> $DIR/unnecessary_lazy_eval.rs:58:13
133133
|
134134
LL | let _ = deep.0.and_then(|_| ext_opt);
135135
| ^^^^^^^---------------------
136136
| |
137137
| help: use `and(..)` instead: `and(ext_opt)`
138138

139139
error: unnecessary closure used to substitute value for `Option::None`
140-
--> $DIR/unnecessary_lazy_eval.rs:57:13
140+
--> $DIR/unnecessary_lazy_eval.rs:59:13
141141
|
142142
LL | let _ = deep.0.or_else(|| None);
143143
| ^^^^^^^----------------
144144
| |
145145
| help: use `or(..)` instead: `or(None)`
146146

147147
error: unnecessary closure used to substitute value for `Option::None`
148-
--> $DIR/unnecessary_lazy_eval.rs:58:13
148+
--> $DIR/unnecessary_lazy_eval.rs:60:13
149149
|
150150
LL | let _ = deep.0.get_or_insert_with(|| 2);
151151
| ^^^^^^^------------------------
152152
| |
153153
| help: use `get_or_insert(..)` instead: `get_or_insert(2)`
154154

155155
error: unnecessary closure used to substitute value for `Option::None`
156-
--> $DIR/unnecessary_lazy_eval.rs:59:13
156+
--> $DIR/unnecessary_lazy_eval.rs:61:13
157157
|
158158
LL | let _ = deep.0.ok_or_else(|| 2);
159159
| ^^^^^^^----------------
160160
| |
161161
| help: use `ok_or(..)` instead: `ok_or(2)`
162162

163163
error: unnecessary closure used to substitute value for `Option::None`
164-
--> $DIR/unnecessary_lazy_eval.rs:79:28
164+
--> $DIR/unnecessary_lazy_eval.rs:81:28
165165
|
166166
LL | let _: Option<usize> = None.or_else(|| Some(3));
167167
| ^^^^^-------------------
168168
| |
169169
| help: use `or(..)` instead: `or(Some(3))`
170170

171171
error: unnecessary closure used to substitute value for `Option::None`
172-
--> $DIR/unnecessary_lazy_eval.rs:80:13
172+
--> $DIR/unnecessary_lazy_eval.rs:82:13
173173
|
174174
LL | let _ = deep.0.or_else(|| Some(3));
175175
| ^^^^^^^-------------------
176176
| |
177177
| help: use `or(..)` instead: `or(Some(3))`
178178

179179
error: unnecessary closure used to substitute value for `Option::None`
180-
--> $DIR/unnecessary_lazy_eval.rs:81:13
180+
--> $DIR/unnecessary_lazy_eval.rs:83:13
181181
|
182182
LL | let _ = opt.or_else(|| Some(3));
183183
| ^^^^-------------------
184184
| |
185185
| help: use `or(..)` instead: `or(Some(3))`
186186

187187
error: unnecessary closure used to substitute value for `Result::Err`
188-
--> $DIR/unnecessary_lazy_eval.rs:87:13
188+
--> $DIR/unnecessary_lazy_eval.rs:89:13
189189
|
190190
LL | let _ = res2.unwrap_or_else(|_| 2);
191191
| ^^^^^---------------------
192192
| |
193193
| help: use `unwrap_or(..)` instead: `unwrap_or(2)`
194194

195195
error: unnecessary closure used to substitute value for `Result::Err`
196-
--> $DIR/unnecessary_lazy_eval.rs:88:13
196+
--> $DIR/unnecessary_lazy_eval.rs:90:13
197197
|
198198
LL | let _ = res2.unwrap_or_else(|_| astronomers_pi);
199199
| ^^^^^----------------------------------
200200
| |
201201
| help: use `unwrap_or(..)` instead: `unwrap_or(astronomers_pi)`
202202

203203
error: unnecessary closure used to substitute value for `Result::Err`
204-
--> $DIR/unnecessary_lazy_eval.rs:89:13
204+
--> $DIR/unnecessary_lazy_eval.rs:91:13
205205
|
206206
LL | let _ = res2.unwrap_or_else(|_| ext_str.some_field);
207207
| ^^^^^--------------------------------------
208208
| |
209209
| help: use `unwrap_or(..)` instead: `unwrap_or(ext_str.some_field)`
210210

211211
error: unnecessary closure used to substitute value for `Result::Err`
212-
--> $DIR/unnecessary_lazy_eval.rs:111:35
212+
--> $DIR/unnecessary_lazy_eval.rs:113:35
213213
|
214214
LL | let _: Result<usize, usize> = res.and_then(|_| Err(2));
215215
| ^^^^--------------------
216216
| |
217217
| help: use `and(..)` instead: `and(Err(2))`
218218

219219
error: unnecessary closure used to substitute value for `Result::Err`
220-
--> $DIR/unnecessary_lazy_eval.rs:112:35
220+
--> $DIR/unnecessary_lazy_eval.rs:114:35
221221
|
222222
LL | let _: Result<usize, usize> = res.and_then(|_| Err(astronomers_pi));
223223
| ^^^^---------------------------------
224224
| |
225225
| help: use `and(..)` instead: `and(Err(astronomers_pi))`
226226

227227
error: unnecessary closure used to substitute value for `Result::Err`
228-
--> $DIR/unnecessary_lazy_eval.rs:113:35
228+
--> $DIR/unnecessary_lazy_eval.rs:115:35
229229
|
230230
LL | let _: Result<usize, usize> = res.and_then(|_| Err(ext_str.some_field));
231231
| ^^^^-------------------------------------
232232
| |
233233
| help: use `and(..)` instead: `and(Err(ext_str.some_field))`
234234

235235
error: unnecessary closure used to substitute value for `Result::Err`
236-
--> $DIR/unnecessary_lazy_eval.rs:115:35
236+
--> $DIR/unnecessary_lazy_eval.rs:117:35
237237
|
238238
LL | let _: Result<usize, usize> = res.or_else(|_| Ok(2));
239239
| ^^^^------------------
240240
| |
241241
| help: use `or(..)` instead: `or(Ok(2))`
242242

243243
error: unnecessary closure used to substitute value for `Result::Err`
244-
--> $DIR/unnecessary_lazy_eval.rs:116:35
244+
--> $DIR/unnecessary_lazy_eval.rs:118:35
245245
|
246246
LL | let _: Result<usize, usize> = res.or_else(|_| Ok(astronomers_pi));
247247
| ^^^^-------------------------------
248248
| |
249249
| help: use `or(..)` instead: `or(Ok(astronomers_pi))`
250250

251251
error: unnecessary closure used to substitute value for `Result::Err`
252-
--> $DIR/unnecessary_lazy_eval.rs:117:35
252+
--> $DIR/unnecessary_lazy_eval.rs:119:35
253253
|
254254
LL | let _: Result<usize, usize> = res.or_else(|_| Ok(ext_str.some_field));
255255
| ^^^^-----------------------------------
256256
| |
257257
| help: use `or(..)` instead: `or(Ok(ext_str.some_field))`
258258

259259
error: unnecessary closure used to substitute value for `Result::Err`
260-
--> $DIR/unnecessary_lazy_eval.rs:118:35
260+
--> $DIR/unnecessary_lazy_eval.rs:120:35
261261
|
262262
LL | let _: Result<usize, usize> = res.
263263
| ___________________________________^

0 commit comments

Comments
 (0)