about summary refs log tree commit diff
diff options
context:
space:
mode:
authortimvisee <tim@visee.me>2023-04-17 20:25:42 +0200
committertimvisee <tim@visee.me>2023-04-17 20:31:25 +0200
commit503fd56a423c8da7958aa3fc611b623270d02fde (patch)
tree77e12436c90ce6246c27c19e90cc0e1ece2ad198
parente57deaace54648bf4e35bf121f23f92df4e6e0c6 (diff)
downloadrust-503fd56a423c8da7958aa3fc611b623270d02fde.tar.gz
rust-503fd56a423c8da7958aa3fc611b623270d02fde.zip
Suggest applicable expression for manual slice size calculation lint
-rw-r--r--clippy_lints/src/manual_slice_size_calculation.rs22
-rw-r--r--tests/ui/manual_slice_size_calculation.stderr23
2 files changed, 21 insertions, 24 deletions
diff --git a/clippy_lints/src/manual_slice_size_calculation.rs b/clippy_lints/src/manual_slice_size_calculation.rs
index ba01fd08530..cef5b8361a4 100644
--- a/clippy_lints/src/manual_slice_size_calculation.rs
+++ b/clippy_lints/src/manual_slice_size_calculation.rs
@@ -1,5 +1,7 @@
-use clippy_utils::diagnostics::span_lint_and_help;
+use clippy_utils::diagnostics::span_lint_and_sugg;
+use clippy_utils::source::snippet_with_context;
 use clippy_utils::{expr_or_init, in_constant};
+use rustc_errors::Applicability;
 use rustc_hir::{BinOpKind, Expr, ExprKind};
 use rustc_lint::{LateContext, LateLintPass};
 use rustc_middle::ty;
@@ -42,15 +44,21 @@ impl<'tcx> LateLintPass<'tcx> for ManualSliceSizeCalculation {
         if !in_constant(cx, expr.hir_id)
             && let ExprKind::Binary(ref op, left, right) = expr.kind
             && BinOpKind::Mul == op.node
-            && let Some(_receiver) = simplify(cx, left, right)
+            && let Some(receiver) = simplify(cx, left, right)
         {
-            span_lint_and_help(
+            let ctxt = expr.span.ctxt();
+            let mut app = Applicability::MachineApplicable;
+            let val_name = snippet_with_context(cx, receiver.span, ctxt, "slice", &mut app).0;
+
+            span_lint_and_sugg(
                 cx,
                 MANUAL_SLICE_SIZE_CALCULATION,
-                expr.span,
-                "manual slice size calculation",
-                None,
-                "consider using std::mem::size_of_val instead");
+                    expr.span,
+                    "manual slice size calculation",
+                    "try",
+                    format!("std::mem::size_of_val({val_name})"),
+                    Applicability::MachineApplicable,
+                );
         }
     }
 }
diff --git a/tests/ui/manual_slice_size_calculation.stderr b/tests/ui/manual_slice_size_calculation.stderr
index 7698d9782f0..b88f523ddcf 100644
--- a/tests/ui/manual_slice_size_calculation.stderr
+++ b/tests/ui/manual_slice_size_calculation.stderr
@@ -2,50 +2,39 @@ error: manual slice size calculation
   --> $DIR/manual_slice_size_calculation.rs:11:13
    |
 LL |     let _ = s_i32.len() * size_of::<i32>(); // WARNING
-   |             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+   |             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `std::mem::size_of_val(s_i32)`
    |
-   = help: consider using std::mem::size_of_val instead
    = note: `-D clippy::manual-slice-size-calculation` implied by `-D warnings`
 
 error: manual slice size calculation
   --> $DIR/manual_slice_size_calculation.rs:12:13
    |
 LL |     let _ = size_of::<i32>() * s_i32.len(); // WARNING
-   |             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-   |
-   = help: consider using std::mem::size_of_val instead
+   |             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `std::mem::size_of_val(s_i32)`
 
 error: manual slice size calculation
   --> $DIR/manual_slice_size_calculation.rs:13:13
    |
 LL |     let _ = size_of::<i32>() * s_i32.len() * 5; // WARNING
-   |             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-   |
-   = help: consider using std::mem::size_of_val instead
+   |             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `std::mem::size_of_val(s_i32)`
 
 error: manual slice size calculation
   --> $DIR/manual_slice_size_calculation.rs:17:13
    |
 LL |     let _ = len * size_of::<i32>(); // WARNING
-   |             ^^^^^^^^^^^^^^^^^^^^^^
-   |
-   = help: consider using std::mem::size_of_val instead
+   |             ^^^^^^^^^^^^^^^^^^^^^^ help: try: `std::mem::size_of_val(s_i32)`
 
 error: manual slice size calculation
   --> $DIR/manual_slice_size_calculation.rs:18:13
    |
 LL |     let _ = s_i32.len() * size; // WARNING
-   |             ^^^^^^^^^^^^^^^^^^
-   |
-   = help: consider using std::mem::size_of_val instead
+   |             ^^^^^^^^^^^^^^^^^^ help: try: `std::mem::size_of_val(s_i32)`
 
 error: manual slice size calculation
   --> $DIR/manual_slice_size_calculation.rs:19:13
    |
 LL |     let _ = len * size; // WARNING
-   |             ^^^^^^^^^^
-   |
-   = help: consider using std::mem::size_of_val instead
+   |             ^^^^^^^^^^ help: try: `std::mem::size_of_val(s_i32)`
 
 error: aborting due to 6 previous errors