Skip to content

Commit 6ec7759

Browse files
committed
[unnecessary_lazy_eval] Do not lint in external macros
1 parent e43f5a1 commit 6ec7759

File tree

4 files changed

+59
-35
lines changed

4 files changed

+59
-35
lines changed

clippy_lints/src/methods/unnecessary_lazy_eval.rs

+5-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use clippy_utils::diagnostics::span_lint_and_then;
22
use clippy_utils::source::snippet;
33
use clippy_utils::ty::is_type_diagnostic_item;
4-
use clippy_utils::{eager_or_lazy, usage};
4+
use clippy_utils::{eager_or_lazy, is_from_proc_macro, usage};
55
use rustc_errors::Applicability;
66
use rustc_hir as hir;
77
use rustc_lint::LateContext;
@@ -18,6 +18,10 @@ pub(super) fn check<'tcx>(
1818
arg: &'tcx hir::Expr<'_>,
1919
simplify_using: &str,
2020
) {
21+
if is_from_proc_macro(cx, expr) {
22+
return;
23+
}
24+
2125
let is_option = is_type_diagnostic_item(cx, cx.typeck_results().expr_ty(recv), sym::Option);
2226
let is_result = is_type_diagnostic_item(cx, cx.typeck_results().expr_ty(recv), sym::Result);
2327
let is_bool = cx.typeck_results().expr_ty(recv).is_bool();

tests/ui/unnecessary_lazy_eval.fixed

+10
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,13 @@
11
// run-rustfix
2+
// aux-build: proc_macro_with_span.rs
23
#![warn(clippy::unnecessary_lazy_evaluations)]
34
#![allow(clippy::redundant_closure)]
45
#![allow(clippy::bind_instead_of_map)]
56
#![allow(clippy::map_identity)]
67

8+
extern crate proc_macro_with_span;
9+
use proc_macro_with_span::with_span;
10+
711
struct Deep(Option<usize>);
812

913
#[derive(Copy, Clone)]
@@ -141,3 +145,9 @@ fn main() {
141145
let _: Result<usize, usize> = res.and_then(|x| Err(x));
142146
let _: Result<usize, usize> = res.or_else(|err| Ok(err));
143147
}
148+
149+
#[allow(unused)]
150+
fn issue9485() {
151+
// should not lint, is in proc macro
152+
with_span!(span Some(42).unwrap_or_else(|| 2););
153+
}

tests/ui/unnecessary_lazy_eval.rs

+10
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,13 @@
11
// run-rustfix
2+
// aux-build: proc_macro_with_span.rs
23
#![warn(clippy::unnecessary_lazy_evaluations)]
34
#![allow(clippy::redundant_closure)]
45
#![allow(clippy::bind_instead_of_map)]
56
#![allow(clippy::map_identity)]
67

8+
extern crate proc_macro_with_span;
9+
use proc_macro_with_span::with_span;
10+
711
struct Deep(Option<usize>);
812

913
#[derive(Copy, Clone)]
@@ -141,3 +145,9 @@ fn main() {
141145
let _: Result<usize, usize> = res.and_then(|x| Err(x));
142146
let _: Result<usize, usize> = res.or_else(|err| Ok(err));
143147
}
148+
149+
#[allow(unused)]
150+
fn issue9485() {
151+
// should not lint, is in proc macro
152+
with_span!(span Some(42).unwrap_or_else(|| 2););
153+
}

tests/ui/unnecessary_lazy_eval.stderr

+34-34
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:44:13
2+
--> $DIR/unnecessary_lazy_eval.rs:48:13
33
|
44
LL | let _ = opt.unwrap_or_else(|| 2);
55
| ^^^^--------------------
@@ -9,263 +9,263 @@ 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:45:13
12+
--> $DIR/unnecessary_lazy_eval.rs:49: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:46:13
20+
--> $DIR/unnecessary_lazy_eval.rs:50: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:48:13
28+
--> $DIR/unnecessary_lazy_eval.rs:52: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:49:13
36+
--> $DIR/unnecessary_lazy_eval.rs:53: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:50:13
44+
--> $DIR/unnecessary_lazy_eval.rs:54: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:51:13
52+
--> $DIR/unnecessary_lazy_eval.rs:55: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:52:13
60+
--> $DIR/unnecessary_lazy_eval.rs:56: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:53:13
68+
--> $DIR/unnecessary_lazy_eval.rs:57: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 with `bool::then`
76-
--> $DIR/unnecessary_lazy_eval.rs:54:13
76+
--> $DIR/unnecessary_lazy_eval.rs:58:13
7777
|
7878
LL | let _ = cond.then(|| astronomers_pi);
7979
| ^^^^^-----------------------
8080
| |
8181
| help: use `then_some(..)` instead: `then_some(astronomers_pi)`
8282

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

9191
error: unnecessary closure used to substitute value for `Option::None`
92-
--> $DIR/unnecessary_lazy_eval.rs:58:13
92+
--> $DIR/unnecessary_lazy_eval.rs:62:13
9393
|
9494
LL | let _ = Some(10).and_then(|_| ext_opt);
9595
| ^^^^^^^^^---------------------
9696
| |
9797
| help: use `and(..)` instead: `and(ext_opt)`
9898

9999
error: unnecessary closure used to substitute value for `Option::None`
100-
--> $DIR/unnecessary_lazy_eval.rs:59:28
100+
--> $DIR/unnecessary_lazy_eval.rs:63:28
101101
|
102102
LL | let _: Option<usize> = None.or_else(|| ext_opt);
103103
| ^^^^^-------------------
104104
| |
105105
| help: use `or(..)` instead: `or(ext_opt)`
106106

107107
error: unnecessary closure used to substitute value for `Option::None`
108-
--> $DIR/unnecessary_lazy_eval.rs:60:13
108+
--> $DIR/unnecessary_lazy_eval.rs:64:13
109109
|
110110
LL | let _ = None.get_or_insert_with(|| 2);
111111
| ^^^^^------------------------
112112
| |
113113
| help: use `get_or_insert(..)` instead: `get_or_insert(2)`
114114

115115
error: unnecessary closure used to substitute value for `Option::None`
116-
--> $DIR/unnecessary_lazy_eval.rs:61:35
116+
--> $DIR/unnecessary_lazy_eval.rs:65:35
117117
|
118118
LL | let _: Result<usize, usize> = None.ok_or_else(|| 2);
119119
| ^^^^^----------------
120120
| |
121121
| help: use `ok_or(..)` instead: `ok_or(2)`
122122

123123
error: unnecessary closure used to substitute value for `Option::None`
124-
--> $DIR/unnecessary_lazy_eval.rs:62:28
124+
--> $DIR/unnecessary_lazy_eval.rs:66:28
125125
|
126126
LL | let _: Option<usize> = None.or_else(|| None);
127127
| ^^^^^----------------
128128
| |
129129
| help: use `or(..)` instead: `or(None)`
130130

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

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

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

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

163163
error: unnecessary closure used to substitute value for `Option::None`
164-
--> $DIR/unnecessary_lazy_eval.rs:69:13
164+
--> $DIR/unnecessary_lazy_eval.rs:73:13
165165
|
166166
LL | let _ = deep.0.ok_or_else(|| 2);
167167
| ^^^^^^^----------------
168168
| |
169169
| help: use `ok_or(..)` instead: `ok_or(2)`
170170

171171
error: unnecessary closure used to substitute value for `Option::None`
172-
--> $DIR/unnecessary_lazy_eval.rs:92:28
172+
--> $DIR/unnecessary_lazy_eval.rs:96:28
173173
|
174174
LL | let _: Option<usize> = None.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:93:13
180+
--> $DIR/unnecessary_lazy_eval.rs:97:13
181181
|
182182
LL | let _ = deep.0.or_else(|| Some(3));
183183
| ^^^^^^^-------------------
184184
| |
185185
| help: use `or(..)` instead: `or(Some(3))`
186186

187187
error: unnecessary closure used to substitute value for `Option::None`
188-
--> $DIR/unnecessary_lazy_eval.rs:94:13
188+
--> $DIR/unnecessary_lazy_eval.rs:98:13
189189
|
190190
LL | let _ = opt.or_else(|| Some(3));
191191
| ^^^^-------------------
192192
| |
193193
| help: use `or(..)` instead: `or(Some(3))`
194194

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

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

211211
error: unnecessary closure used to substitute value for `Result::Err`
212-
--> $DIR/unnecessary_lazy_eval.rs:102:13
212+
--> $DIR/unnecessary_lazy_eval.rs:106:13
213213
|
214214
LL | let _ = res2.unwrap_or_else(|_| ext_str.some_field);
215215
| ^^^^^--------------------------------------
216216
| |
217217
| help: use `unwrap_or(..)` instead: `unwrap_or(ext_str.some_field)`
218218

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

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

235235
error: unnecessary closure used to substitute value for `Result::Err`
236-
--> $DIR/unnecessary_lazy_eval.rs:126:35
236+
--> $DIR/unnecessary_lazy_eval.rs:130:35
237237
|
238238
LL | let _: Result<usize, usize> = res.and_then(|_| Err(ext_str.some_field));
239239
| ^^^^-------------------------------------
240240
| |
241241
| help: use `and(..)` instead: `and(Err(ext_str.some_field))`
242242

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

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

259259
error: unnecessary closure used to substitute value for `Result::Err`
260-
--> $DIR/unnecessary_lazy_eval.rs:130:35
260+
--> $DIR/unnecessary_lazy_eval.rs:134:35
261261
|
262262
LL | let _: Result<usize, usize> = res.or_else(|_| Ok(ext_str.some_field));
263263
| ^^^^-----------------------------------
264264
| |
265265
| help: use `or(..)` instead: `or(Ok(ext_str.some_field))`
266266

267267
error: unnecessary closure used to substitute value for `Result::Err`
268-
--> $DIR/unnecessary_lazy_eval.rs:131:35
268+
--> $DIR/unnecessary_lazy_eval.rs:135:35
269269
|
270270
LL | let _: Result<usize, usize> = res.
271271
| ___________________________________^

0 commit comments

Comments
 (0)