Skip to content

Commit 503fd56

Browse files
committed
Suggest applicable expression for manual slice size calculation lint
1 parent e57deaa commit 503fd56

File tree

2 files changed

+21
-24
lines changed

2 files changed

+21
-24
lines changed

clippy_lints/src/manual_slice_size_calculation.rs

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
1-
use clippy_utils::diagnostics::span_lint_and_help;
1+
use clippy_utils::diagnostics::span_lint_and_sugg;
2+
use clippy_utils::source::snippet_with_context;
23
use clippy_utils::{expr_or_init, in_constant};
4+
use rustc_errors::Applicability;
35
use rustc_hir::{BinOpKind, Expr, ExprKind};
46
use rustc_lint::{LateContext, LateLintPass};
57
use rustc_middle::ty;
@@ -42,15 +44,21 @@ impl<'tcx> LateLintPass<'tcx> for ManualSliceSizeCalculation {
4244
if !in_constant(cx, expr.hir_id)
4345
&& let ExprKind::Binary(ref op, left, right) = expr.kind
4446
&& BinOpKind::Mul == op.node
45-
&& let Some(_receiver) = simplify(cx, left, right)
47+
&& let Some(receiver) = simplify(cx, left, right)
4648
{
47-
span_lint_and_help(
49+
let ctxt = expr.span.ctxt();
50+
let mut app = Applicability::MachineApplicable;
51+
let val_name = snippet_with_context(cx, receiver.span, ctxt, "slice", &mut app).0;
52+
53+
span_lint_and_sugg(
4854
cx,
4955
MANUAL_SLICE_SIZE_CALCULATION,
50-
expr.span,
51-
"manual slice size calculation",
52-
None,
53-
"consider using std::mem::size_of_val instead");
56+
expr.span,
57+
"manual slice size calculation",
58+
"try",
59+
format!("std::mem::size_of_val({val_name})"),
60+
Applicability::MachineApplicable,
61+
);
5462
}
5563
}
5664
}

tests/ui/manual_slice_size_calculation.stderr

Lines changed: 6 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2,50 +2,39 @@ error: manual slice size calculation
22
--> $DIR/manual_slice_size_calculation.rs:11:13
33
|
44
LL | let _ = s_i32.len() * size_of::<i32>(); // WARNING
5-
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
5+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `std::mem::size_of_val(s_i32)`
66
|
7-
= help: consider using std::mem::size_of_val instead
87
= note: `-D clippy::manual-slice-size-calculation` implied by `-D warnings`
98

109
error: manual slice size calculation
1110
--> $DIR/manual_slice_size_calculation.rs:12:13
1211
|
1312
LL | let _ = size_of::<i32>() * s_i32.len(); // WARNING
14-
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
15-
|
16-
= help: consider using std::mem::size_of_val instead
13+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `std::mem::size_of_val(s_i32)`
1714

1815
error: manual slice size calculation
1916
--> $DIR/manual_slice_size_calculation.rs:13:13
2017
|
2118
LL | let _ = size_of::<i32>() * s_i32.len() * 5; // WARNING
22-
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
23-
|
24-
= help: consider using std::mem::size_of_val instead
19+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `std::mem::size_of_val(s_i32)`
2520

2621
error: manual slice size calculation
2722
--> $DIR/manual_slice_size_calculation.rs:17:13
2823
|
2924
LL | let _ = len * size_of::<i32>(); // WARNING
30-
| ^^^^^^^^^^^^^^^^^^^^^^
31-
|
32-
= help: consider using std::mem::size_of_val instead
25+
| ^^^^^^^^^^^^^^^^^^^^^^ help: try: `std::mem::size_of_val(s_i32)`
3326

3427
error: manual slice size calculation
3528
--> $DIR/manual_slice_size_calculation.rs:18:13
3629
|
3730
LL | let _ = s_i32.len() * size; // WARNING
38-
| ^^^^^^^^^^^^^^^^^^
39-
|
40-
= help: consider using std::mem::size_of_val instead
31+
| ^^^^^^^^^^^^^^^^^^ help: try: `std::mem::size_of_val(s_i32)`
4132

4233
error: manual slice size calculation
4334
--> $DIR/manual_slice_size_calculation.rs:19:13
4435
|
4536
LL | let _ = len * size; // WARNING
46-
| ^^^^^^^^^^
47-
|
48-
= help: consider using std::mem::size_of_val instead
37+
| ^^^^^^^^^^ help: try: `std::mem::size_of_val(s_i32)`
4938

5039
error: aborting due to 6 previous errors
5140

0 commit comments

Comments
 (0)