Skip to content

Commit 9fd3c2d

Browse files
committed
Auto merge of rust-lang#8543 - dswij:8393, r=giraffate
`unnecessary_lazy_eval` show suggestions on multiline lint Closes rust-lang#8393 changelog: [`unnecessary_lazy_eval`] now shows suggestions for long-line lints
2 parents 8d5c0ea + bd888d4 commit 9fd3c2d

5 files changed

+151
-51
lines changed

clippy_lints/src/methods/unnecessary_lazy_eval.rs

Lines changed: 14 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use clippy_utils::diagnostics::span_lint_and_sugg;
1+
use clippy_utils::diagnostics::span_lint_and_then;
22
use clippy_utils::source::snippet;
33
use clippy_utils::ty::is_type_diagnostic_item;
44
use clippy_utils::{eager_or_lazy, usage};
@@ -48,20 +48,19 @@ pub(super) fn check<'tcx>(
4848
Applicability::MaybeIncorrect
4949
};
5050

51-
span_lint_and_sugg(
52-
cx,
53-
UNNECESSARY_LAZY_EVALUATIONS,
54-
expr.span,
55-
msg,
56-
&format!("use `{}` instead", simplify_using),
57-
format!(
58-
"{0}.{1}({2})",
59-
snippet(cx, recv.span, ".."),
60-
simplify_using,
61-
snippet(cx, body_expr.span, ".."),
62-
),
63-
applicability,
64-
);
51+
// This is a duplicate of what's happening in clippy_lints::methods::method_call,
52+
// which isn't ideal, We want to get the method call span,
53+
// but prefer to avoid changing the signature of the function itself.
54+
if let hir::ExprKind::MethodCall(_, _, span) = expr.kind {
55+
span_lint_and_then(cx, UNNECESSARY_LAZY_EVALUATIONS, expr.span, msg, |diag| {
56+
diag.span_suggestion(
57+
span,
58+
&format!("use `{}(..)` instead", simplify_using),
59+
format!("{}({})", simplify_using, snippet(cx, body_expr.span, "..")),
60+
applicability,
61+
);
62+
});
63+
}
6564
}
6665
}
6766
}

tests/ui/unnecessary_lazy_eval.fixed

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,14 @@ fn main() {
115115
let _: Result<usize, usize> = res.or(Ok(2));
116116
let _: Result<usize, usize> = res.or(Ok(astronomers_pi));
117117
let _: Result<usize, usize> = res.or(Ok(ext_str.some_field));
118+
let _: Result<usize, usize> = res.
119+
// some lines
120+
// some lines
121+
// some lines
122+
// some lines
123+
// some lines
124+
// some lines
125+
or(Ok(ext_str.some_field));
118126

119127
// neither bind_instead_of_map nor unnecessary_lazy_eval applies here
120128
let _: Result<usize, usize> = res.and_then(|x| Err(x));

tests/ui/unnecessary_lazy_eval.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,14 @@ fn main() {
115115
let _: Result<usize, usize> = res.or_else(|_| Ok(2));
116116
let _: Result<usize, usize> = res.or_else(|_| Ok(astronomers_pi));
117117
let _: Result<usize, usize> = res.or_else(|_| Ok(ext_str.some_field));
118+
let _: Result<usize, usize> = res.
119+
// some lines
120+
// some lines
121+
// some lines
122+
// some lines
123+
// some lines
124+
// some lines
125+
or_else(|_| Ok(ext_str.some_field));
118126

119127
// neither bind_instead_of_map nor unnecessary_lazy_eval applies here
120128
let _: Result<usize, usize> = res.and_then(|x| Err(x));

tests/ui/unnecessary_lazy_eval.stderr

Lines changed: 112 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -2,195 +2,274 @@ error: unnecessary closure used to substitute value for `Option::None`
22
--> $DIR/unnecessary_lazy_eval.rs:35:13
33
|
44
LL | let _ = opt.unwrap_or_else(|| 2);
5-
| ^^^^^^^^^^^^^^^^^^^^^^^^ help: use `unwrap_or` instead: `opt.unwrap_or(2)`
5+
| ^^^^--------------------
6+
| |
7+
| help: use `unwrap_or(..)` instead: `unwrap_or(2)`
68
|
79
= note: `-D clippy::unnecessary-lazy-evaluations` implied by `-D warnings`
810

911
error: unnecessary closure used to substitute value for `Option::None`
1012
--> $DIR/unnecessary_lazy_eval.rs:36:13
1113
|
1214
LL | let _ = opt.unwrap_or_else(|| astronomers_pi);
13-
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use `unwrap_or` instead: `opt.unwrap_or(astronomers_pi)`
15+
| ^^^^---------------------------------
16+
| |
17+
| help: use `unwrap_or(..)` instead: `unwrap_or(astronomers_pi)`
1418

1519
error: unnecessary closure used to substitute value for `Option::None`
1620
--> $DIR/unnecessary_lazy_eval.rs:37:13
1721
|
1822
LL | let _ = opt.unwrap_or_else(|| ext_str.some_field);
19-
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use `unwrap_or` instead: `opt.unwrap_or(ext_str.some_field)`
23+
| ^^^^-------------------------------------
24+
| |
25+
| help: use `unwrap_or(..)` instead: `unwrap_or(ext_str.some_field)`
2026

2127
error: unnecessary closure used to substitute value for `Option::None`
2228
--> $DIR/unnecessary_lazy_eval.rs:39:13
2329
|
2430
LL | let _ = opt.and_then(|_| ext_opt);
25-
| ^^^^^^^^^^^^^^^^^^^^^^^^^ help: use `and` instead: `opt.and(ext_opt)`
31+
| ^^^^---------------------
32+
| |
33+
| help: use `and(..)` instead: `and(ext_opt)`
2634

2735
error: unnecessary closure used to substitute value for `Option::None`
2836
--> $DIR/unnecessary_lazy_eval.rs:40:13
2937
|
3038
LL | let _ = opt.or_else(|| ext_opt);
31-
| ^^^^^^^^^^^^^^^^^^^^^^^ help: use `or` instead: `opt.or(ext_opt)`
39+
| ^^^^-------------------
40+
| |
41+
| help: use `or(..)` instead: `or(ext_opt)`
3242

3343
error: unnecessary closure used to substitute value for `Option::None`
3444
--> $DIR/unnecessary_lazy_eval.rs:41:13
3545
|
3646
LL | let _ = opt.or_else(|| None);
37-
| ^^^^^^^^^^^^^^^^^^^^ help: use `or` instead: `opt.or(None)`
47+
| ^^^^----------------
48+
| |
49+
| help: use `or(..)` instead: `or(None)`
3850

3951
error: unnecessary closure used to substitute value for `Option::None`
4052
--> $DIR/unnecessary_lazy_eval.rs:42:13
4153
|
4254
LL | let _ = opt.get_or_insert_with(|| 2);
43-
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use `get_or_insert` instead: `opt.get_or_insert(2)`
55+
| ^^^^------------------------
56+
| |
57+
| help: use `get_or_insert(..)` instead: `get_or_insert(2)`
4458

4559
error: unnecessary closure used to substitute value for `Option::None`
4660
--> $DIR/unnecessary_lazy_eval.rs:43:13
4761
|
4862
LL | let _ = opt.ok_or_else(|| 2);
49-
| ^^^^^^^^^^^^^^^^^^^^ help: use `ok_or` instead: `opt.ok_or(2)`
63+
| ^^^^----------------
64+
| |
65+
| help: use `ok_or(..)` instead: `ok_or(2)`
5066

5167
error: unnecessary closure used to substitute value for `Option::None`
5268
--> $DIR/unnecessary_lazy_eval.rs:44:13
5369
|
5470
LL | let _ = nested_tuple_opt.unwrap_or_else(|| Some((1, 2)));
55-
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use `unwrap_or` instead: `nested_tuple_opt.unwrap_or(Some((1, 2)))`
71+
| ^^^^^^^^^^^^^^^^^-------------------------------
72+
| |
73+
| help: use `unwrap_or(..)` instead: `unwrap_or(Some((1, 2)))`
5674

5775
error: unnecessary closure used to substitute value for `Option::None`
5876
--> $DIR/unnecessary_lazy_eval.rs:47:13
5977
|
6078
LL | let _ = Some(10).unwrap_or_else(|| 2);
61-
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use `unwrap_or` instead: `Some(10).unwrap_or(2)`
79+
| ^^^^^^^^^--------------------
80+
| |
81+
| help: use `unwrap_or(..)` instead: `unwrap_or(2)`
6282

6383
error: unnecessary closure used to substitute value for `Option::None`
6484
--> $DIR/unnecessary_lazy_eval.rs:48:13
6585
|
6686
LL | let _ = Some(10).and_then(|_| ext_opt);
67-
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use `and` instead: `Some(10).and(ext_opt)`
87+
| ^^^^^^^^^---------------------
88+
| |
89+
| help: use `and(..)` instead: `and(ext_opt)`
6890

6991
error: unnecessary closure used to substitute value for `Option::None`
7092
--> $DIR/unnecessary_lazy_eval.rs:49:28
7193
|
7294
LL | let _: Option<usize> = None.or_else(|| ext_opt);
73-
| ^^^^^^^^^^^^^^^^^^^^^^^^ help: use `or` instead: `None.or(ext_opt)`
95+
| ^^^^^-------------------
96+
| |
97+
| help: use `or(..)` instead: `or(ext_opt)`
7498

7599
error: unnecessary closure used to substitute value for `Option::None`
76100
--> $DIR/unnecessary_lazy_eval.rs:50:13
77101
|
78102
LL | let _ = None.get_or_insert_with(|| 2);
79-
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use `get_or_insert` instead: `None.get_or_insert(2)`
103+
| ^^^^^------------------------
104+
| |
105+
| help: use `get_or_insert(..)` instead: `get_or_insert(2)`
80106

81107
error: unnecessary closure used to substitute value for `Option::None`
82108
--> $DIR/unnecessary_lazy_eval.rs:51:35
83109
|
84110
LL | let _: Result<usize, usize> = None.ok_or_else(|| 2);
85-
| ^^^^^^^^^^^^^^^^^^^^^ help: use `ok_or` instead: `None.ok_or(2)`
111+
| ^^^^^----------------
112+
| |
113+
| help: use `ok_or(..)` instead: `ok_or(2)`
86114

87115
error: unnecessary closure used to substitute value for `Option::None`
88116
--> $DIR/unnecessary_lazy_eval.rs:52:28
89117
|
90118
LL | let _: Option<usize> = None.or_else(|| None);
91-
| ^^^^^^^^^^^^^^^^^^^^^ help: use `or` instead: `None.or(None)`
119+
| ^^^^^----------------
120+
| |
121+
| help: use `or(..)` instead: `or(None)`
92122

93123
error: unnecessary closure used to substitute value for `Option::None`
94124
--> $DIR/unnecessary_lazy_eval.rs:55:13
95125
|
96126
LL | let _ = deep.0.unwrap_or_else(|| 2);
97-
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use `unwrap_or` instead: `deep.0.unwrap_or(2)`
127+
| ^^^^^^^--------------------
128+
| |
129+
| help: use `unwrap_or(..)` instead: `unwrap_or(2)`
98130

99131
error: unnecessary closure used to substitute value for `Option::None`
100132
--> $DIR/unnecessary_lazy_eval.rs:56:13
101133
|
102134
LL | let _ = deep.0.and_then(|_| ext_opt);
103-
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use `and` instead: `deep.0.and(ext_opt)`
135+
| ^^^^^^^---------------------
136+
| |
137+
| help: use `and(..)` instead: `and(ext_opt)`
104138

105139
error: unnecessary closure used to substitute value for `Option::None`
106140
--> $DIR/unnecessary_lazy_eval.rs:57:13
107141
|
108142
LL | let _ = deep.0.or_else(|| None);
109-
| ^^^^^^^^^^^^^^^^^^^^^^^ help: use `or` instead: `deep.0.or(None)`
143+
| ^^^^^^^----------------
144+
| |
145+
| help: use `or(..)` instead: `or(None)`
110146

111147
error: unnecessary closure used to substitute value for `Option::None`
112148
--> $DIR/unnecessary_lazy_eval.rs:58:13
113149
|
114150
LL | let _ = deep.0.get_or_insert_with(|| 2);
115-
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use `get_or_insert` instead: `deep.0.get_or_insert(2)`
151+
| ^^^^^^^------------------------
152+
| |
153+
| help: use `get_or_insert(..)` instead: `get_or_insert(2)`
116154

117155
error: unnecessary closure used to substitute value for `Option::None`
118156
--> $DIR/unnecessary_lazy_eval.rs:59:13
119157
|
120158
LL | let _ = deep.0.ok_or_else(|| 2);
121-
| ^^^^^^^^^^^^^^^^^^^^^^^ help: use `ok_or` instead: `deep.0.ok_or(2)`
159+
| ^^^^^^^----------------
160+
| |
161+
| help: use `ok_or(..)` instead: `ok_or(2)`
122162

123163
error: unnecessary closure used to substitute value for `Option::None`
124164
--> $DIR/unnecessary_lazy_eval.rs:79:28
125165
|
126166
LL | let _: Option<usize> = None.or_else(|| Some(3));
127-
| ^^^^^^^^^^^^^^^^^^^^^^^^ help: use `or` instead: `None.or(Some(3))`
167+
| ^^^^^-------------------
168+
| |
169+
| help: use `or(..)` instead: `or(Some(3))`
128170

129171
error: unnecessary closure used to substitute value for `Option::None`
130172
--> $DIR/unnecessary_lazy_eval.rs:80:13
131173
|
132174
LL | let _ = deep.0.or_else(|| Some(3));
133-
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use `or` instead: `deep.0.or(Some(3))`
175+
| ^^^^^^^-------------------
176+
| |
177+
| help: use `or(..)` instead: `or(Some(3))`
134178

135179
error: unnecessary closure used to substitute value for `Option::None`
136180
--> $DIR/unnecessary_lazy_eval.rs:81:13
137181
|
138182
LL | let _ = opt.or_else(|| Some(3));
139-
| ^^^^^^^^^^^^^^^^^^^^^^^ help: use `or` instead: `opt.or(Some(3))`
183+
| ^^^^-------------------
184+
| |
185+
| help: use `or(..)` instead: `or(Some(3))`
140186

141187
error: unnecessary closure used to substitute value for `Result::Err`
142188
--> $DIR/unnecessary_lazy_eval.rs:87:13
143189
|
144190
LL | let _ = res2.unwrap_or_else(|_| 2);
145-
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use `unwrap_or` instead: `res2.unwrap_or(2)`
191+
| ^^^^^---------------------
192+
| |
193+
| help: use `unwrap_or(..)` instead: `unwrap_or(2)`
146194

147195
error: unnecessary closure used to substitute value for `Result::Err`
148196
--> $DIR/unnecessary_lazy_eval.rs:88:13
149197
|
150198
LL | let _ = res2.unwrap_or_else(|_| astronomers_pi);
151-
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use `unwrap_or` instead: `res2.unwrap_or(astronomers_pi)`
199+
| ^^^^^----------------------------------
200+
| |
201+
| help: use `unwrap_or(..)` instead: `unwrap_or(astronomers_pi)`
152202

153203
error: unnecessary closure used to substitute value for `Result::Err`
154204
--> $DIR/unnecessary_lazy_eval.rs:89:13
155205
|
156206
LL | let _ = res2.unwrap_or_else(|_| ext_str.some_field);
157-
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use `unwrap_or` instead: `res2.unwrap_or(ext_str.some_field)`
207+
| ^^^^^--------------------------------------
208+
| |
209+
| help: use `unwrap_or(..)` instead: `unwrap_or(ext_str.some_field)`
158210

159211
error: unnecessary closure used to substitute value for `Result::Err`
160212
--> $DIR/unnecessary_lazy_eval.rs:111:35
161213
|
162214
LL | let _: Result<usize, usize> = res.and_then(|_| Err(2));
163-
| ^^^^^^^^^^^^^^^^^^^^^^^^ help: use `and` instead: `res.and(Err(2))`
215+
| ^^^^--------------------
216+
| |
217+
| help: use `and(..)` instead: `and(Err(2))`
164218

165219
error: unnecessary closure used to substitute value for `Result::Err`
166220
--> $DIR/unnecessary_lazy_eval.rs:112:35
167221
|
168222
LL | let _: Result<usize, usize> = res.and_then(|_| Err(astronomers_pi));
169-
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use `and` instead: `res.and(Err(astronomers_pi))`
223+
| ^^^^---------------------------------
224+
| |
225+
| help: use `and(..)` instead: `and(Err(astronomers_pi))`
170226

171227
error: unnecessary closure used to substitute value for `Result::Err`
172228
--> $DIR/unnecessary_lazy_eval.rs:113:35
173229
|
174230
LL | let _: Result<usize, usize> = res.and_then(|_| Err(ext_str.some_field));
175-
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use `and` instead: `res.and(Err(ext_str.some_field))`
231+
| ^^^^-------------------------------------
232+
| |
233+
| help: use `and(..)` instead: `and(Err(ext_str.some_field))`
176234

177235
error: unnecessary closure used to substitute value for `Result::Err`
178236
--> $DIR/unnecessary_lazy_eval.rs:115:35
179237
|
180238
LL | let _: Result<usize, usize> = res.or_else(|_| Ok(2));
181-
| ^^^^^^^^^^^^^^^^^^^^^^ help: use `or` instead: `res.or(Ok(2))`
239+
| ^^^^------------------
240+
| |
241+
| help: use `or(..)` instead: `or(Ok(2))`
182242

183243
error: unnecessary closure used to substitute value for `Result::Err`
184244
--> $DIR/unnecessary_lazy_eval.rs:116:35
185245
|
186246
LL | let _: Result<usize, usize> = res.or_else(|_| Ok(astronomers_pi));
187-
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use `or` instead: `res.or(Ok(astronomers_pi))`
247+
| ^^^^-------------------------------
248+
| |
249+
| help: use `or(..)` instead: `or(Ok(astronomers_pi))`
188250

189251
error: unnecessary closure used to substitute value for `Result::Err`
190252
--> $DIR/unnecessary_lazy_eval.rs:117:35
191253
|
192254
LL | let _: Result<usize, usize> = res.or_else(|_| Ok(ext_str.some_field));
193-
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use `or` instead: `res.or(Ok(ext_str.some_field))`
255+
| ^^^^-----------------------------------
256+
| |
257+
| help: use `or(..)` instead: `or(Ok(ext_str.some_field))`
194258

195-
error: aborting due to 32 previous errors
259+
error: unnecessary closure used to substitute value for `Result::Err`
260+
--> $DIR/unnecessary_lazy_eval.rs:118:35
261+
|
262+
LL | let _: Result<usize, usize> = res.
263+
| ___________________________________^
264+
LL | | // some lines
265+
LL | | // some lines
266+
LL | | // some lines
267+
... |
268+
LL | | // some lines
269+
LL | | or_else(|_| Ok(ext_str.some_field));
270+
| |_________----------------------------------^
271+
| |
272+
| help: use `or(..)` instead: `or(Ok(ext_str.some_field))`
273+
274+
error: aborting due to 33 previous errors
196275

0 commit comments

Comments
 (0)