Skip to content

Commit f05a150

Browse files
committed
hotfix: replace check_block with check_expr
1 parent 51f4f4a commit f05a150

File tree

2 files changed

+100
-66
lines changed

2 files changed

+100
-66
lines changed

clippy_lints/src/unnecessary_reserve.rs

+8-26
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
use clippy_utils::diagnostics::span_lint_and_then;
22
use clippy_utils::msrvs::{self, Msrv};
3-
use clippy_utils::{match_def_path, paths, visitors::for_each_expr, SpanlessEq};
3+
use clippy_utils::{get_enclosing_block, match_def_path, paths, visitors::for_each_expr, SpanlessEq};
44
use core::ops::ControlFlow;
55
use rustc_errors::Applicability;
6-
use rustc_hir::{Block, ExprKind, PathSegment, StmtKind};
6+
use rustc_hir::{Block, Expr, ExprKind, PathSegment};
77
use rustc_lint::{LateContext, LateLintPass};
88
use rustc_middle::ty;
99
use rustc_session::{declare_tool_lint, impl_lint_pass};
@@ -47,17 +47,16 @@ impl UnnecessaryReserve {
4747
}
4848

4949
impl<'tcx> LateLintPass<'tcx> for UnnecessaryReserve {
50-
fn check_block(&mut self, cx: &LateContext<'tcx>, block: &Block<'tcx>) {
50+
fn check_expr(&mut self, cx: &LateContext<'tcx>, expr: &Expr<'tcx>) {
5151
if !self.msrv.meets(msrvs::CHECK_UNNECESSARY_RESERVE) {
5252
return;
5353
}
5454

55-
for (idx, stmt) in block.stmts.iter().enumerate() {
56-
if let StmtKind::Semi(semi_expr) = stmt.kind
57-
&& let ExprKind::MethodCall(PathSegment { ident: method, .. }, struct_calling_on, _, _) = semi_expr.kind
55+
if let ExprKind::MethodCall(PathSegment { ident: method, .. }, struct_calling_on, _, _) = expr.kind
5856
&& method.name.as_str() == "reserve"
5957
&& acceptable_type(cx, struct_calling_on)
60-
&& let Some(next_stmt_span) = check_extend_method(cx, block, idx, struct_calling_on)
58+
&& let Some(block) = get_enclosing_block(cx, expr.hir_id)
59+
&& let Some(next_stmt_span) = check_extend_method(cx, block, struct_calling_on)
6160
&& !next_stmt_span.from_expansion()
6261
{
6362
span_lint_and_then(
@@ -67,15 +66,14 @@ impl<'tcx> LateLintPass<'tcx> for UnnecessaryReserve {
6766
"unnecessary call to `reserve`",
6867
|diag| {
6968
diag.span_suggestion(
70-
semi_expr.span,
69+
expr.span,
7170
"remove this line",
7271
String::new(),
7372
Applicability::MaybeIncorrect,
7473
);
7574
}
7675
);
7776
}
78-
}
7977
}
8078

8179
extract_msrv_attr!(LateContext);
@@ -96,7 +94,6 @@ fn acceptable_type(cx: &LateContext<'_>, struct_calling_on: &rustc_hir::Expr<'_>
9694
fn check_extend_method(
9795
cx: &LateContext<'_>,
9896
block: &Block<'_>,
99-
idx: usize,
10097
struct_expr: &rustc_hir::Expr<'_>,
10198
) -> Option<rustc_span::Span> {
10299
let mut read_found = false;
@@ -116,20 +113,5 @@ fn check_extend_method(
116113
ControlFlow::Continue(())
117114
});
118115

119-
let next_stmt_span: rustc_span::Span = if idx == block.stmts.len() - 1 {
120-
if let Some(e) = block.expr {
121-
e.span
122-
} else {
123-
return None;
124-
}
125-
} else {
126-
let next_stmt = &block.stmts[idx + 1];
127-
return Some(next_stmt.span);
128-
};
129-
130-
if read_found {
131-
return Some(next_stmt_span);
132-
}
133-
134-
None
116+
if read_found { Some(block.span) } else { None }
135117
}

tests/ui/unnecessary_reserve.stderr

+92-40
Original file line numberDiff line numberDiff line change
@@ -1,68 +1,120 @@
11
error: unnecessary call to `reserve`
2-
--> $DIR/unnecessary_reserve.rs:20:5
2+
--> $DIR/unnecessary_reserve.rs:14:18
33
|
4-
LL | vec.reserve(1);
5-
| -------------- help: remove this line
6-
LL | vec.extend([1]);
7-
| ^^^^^^^^^^^^^^^^
4+
LL | fn vec_reserve() {
5+
| __________________^
6+
LL | | let mut vec: Vec<usize> = vec![];
7+
LL | | let array: &[usize] = &[1, 2];
8+
LL | |
9+
LL | | // do not lint
10+
LL | | vec.reserve(1);
11+
| | -------------- help: remove this line
12+
... |
13+
LL | | vec.extend([1])
14+
LL | | }
15+
| |_^
816
|
917
= note: `-D clippy::unnecessary-reserve` implied by `-D warnings`
1018

1119
error: unnecessary call to `reserve`
12-
--> $DIR/unnecessary_reserve.rs:24:5
20+
--> $DIR/unnecessary_reserve.rs:14:18
1321
|
14-
LL | vec.reserve(array.len());
15-
| ------------------------ help: remove this line
16-
LL | vec.extend(array);
17-
| ^^^^^^^^^^^^^^^^^^
22+
LL | fn vec_reserve() {
23+
| __________________^
24+
LL | | let mut vec: Vec<usize> = vec![];
25+
LL | | let array: &[usize] = &[1, 2];
26+
LL | |
27+
... |
28+
LL | | vec.reserve(array.len());
29+
| | ------------------------ help: remove this line
30+
... |
31+
LL | | vec.extend([1])
32+
LL | | }
33+
| |_^
1834

1935
error: unnecessary call to `reserve`
20-
--> $DIR/unnecessary_reserve.rs:34:5
36+
--> $DIR/unnecessary_reserve.rs:27:5
2137
|
22-
LL | vec.reserve(array.len());
23-
| ------------------------ help: remove this line
24-
LL | vec.push(1);
25-
| ^^^^^^^^^^^^
38+
LL | / {
39+
LL | | vec.reserve(array.len());
40+
| | ------------------------ help: remove this line
41+
LL | | vec.extend(array)
42+
LL | | };
43+
| |_____^
2644

2745
error: unnecessary call to `reserve`
28-
--> $DIR/unnecessary_reserve.rs:29:9
46+
--> $DIR/unnecessary_reserve.rs:14:18
2947
|
30-
LL | vec.reserve(array.len());
31-
| ------------------------ help: remove this line
32-
LL | vec.extend(array)
33-
| ^^^^^^^^^^^^^^^^^
48+
LL | fn vec_reserve() {
49+
| __________________^
50+
LL | | let mut vec: Vec<usize> = vec![];
51+
LL | | let array: &[usize] = &[1, 2];
52+
LL | |
53+
... |
54+
LL | | vec.reserve(array.len());
55+
| | ------------------------ help: remove this line
56+
... |
57+
LL | | vec.extend([1])
58+
LL | | }
59+
| |_^
3460

3561
error: unnecessary call to `reserve`
36-
--> $DIR/unnecessary_reserve.rs:49:5
62+
--> $DIR/unnecessary_reserve.rs:43:24
3763
|
38-
LL | vec_deque.reserve(1);
39-
| -------------------- help: remove this line
40-
LL | vec_deque.extend([1]);
41-
| ^^^^^^^^^^^^^^^^^^^^^^
64+
LL | fn vec_deque_reserve() {
65+
| ________________________^
66+
LL | | let mut vec_deque: VecDeque<usize> = [1].into();
67+
LL | | let array: &[usize] = &[1, 2];
68+
LL | |
69+
LL | | // do not lint
70+
LL | | vec_deque.reserve(1);
71+
| | -------------------- help: remove this line
72+
... |
73+
LL | | vec_deque.extend([1])
74+
LL | | }
75+
| |_^
4276

4377
error: unnecessary call to `reserve`
44-
--> $DIR/unnecessary_reserve.rs:53:5
78+
--> $DIR/unnecessary_reserve.rs:43:24
4579
|
46-
LL | vec_deque.reserve(array.len());
47-
| ------------------------------ help: remove this line
48-
LL | vec_deque.extend(array);
49-
| ^^^^^^^^^^^^^^^^^^^^^^^^
80+
LL | fn vec_deque_reserve() {
81+
| ________________________^
82+
LL | | let mut vec_deque: VecDeque<usize> = [1].into();
83+
LL | | let array: &[usize] = &[1, 2];
84+
LL | |
85+
... |
86+
LL | | vec_deque.reserve(array.len());
87+
| | ------------------------------ help: remove this line
88+
... |
89+
LL | | vec_deque.extend([1])
90+
LL | | }
91+
| |_^
5092

5193
error: unnecessary call to `reserve`
52-
--> $DIR/unnecessary_reserve.rs:63:5
94+
--> $DIR/unnecessary_reserve.rs:56:5
5395
|
54-
LL | vec_deque.reserve(array.len() + 1);
55-
| ---------------------------------- help: remove this line
56-
LL | vec_deque.push_back(1);
57-
| ^^^^^^^^^^^^^^^^^^^^^^^
96+
LL | / {
97+
LL | | vec_deque.reserve(1);
98+
| | -------------------- help: remove this line
99+
LL | | vec_deque.extend([1])
100+
LL | | };
101+
| |_____^
58102

59103
error: unnecessary call to `reserve`
60-
--> $DIR/unnecessary_reserve.rs:58:9
104+
--> $DIR/unnecessary_reserve.rs:43:24
61105
|
62-
LL | vec_deque.reserve(1);
63-
| -------------------- help: remove this line
64-
LL | vec_deque.extend([1])
65-
| ^^^^^^^^^^^^^^^^^^^^^
106+
LL | fn vec_deque_reserve() {
107+
| ________________________^
108+
LL | | let mut vec_deque: VecDeque<usize> = [1].into();
109+
LL | | let array: &[usize] = &[1, 2];
110+
LL | |
111+
... |
112+
LL | | vec_deque.reserve(array.len() + 1);
113+
| | ---------------------------------- help: remove this line
114+
... |
115+
LL | | vec_deque.extend([1])
116+
LL | | }
117+
| |_^
66118

67119
error: aborting due to 8 previous errors
68120

0 commit comments

Comments
 (0)