Skip to content

Commit

Permalink
Move transmutes_expressible_as_ptr_casts to its own module
Browse files Browse the repository at this point in the history
  • Loading branch information
magurotuna authored and flip1995 committed Mar 2, 2021
1 parent c57a826 commit 25c221e
Show file tree
Hide file tree
Showing 2 changed files with 42 additions and 21 deletions.
25 changes: 4 additions & 21 deletions clippy_lints/src/transmute/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ mod transmute_int_to_float;
mod transmute_ptr_to_ptr;
mod transmute_ptr_to_ref;
mod transmute_ref_to_ref;
mod transmutes_expressible_as_ptr_casts;
mod unsound_collection_transmute;
mod useless_transmute;
mod utils;
Expand Down Expand Up @@ -389,27 +390,9 @@ impl<'tcx> LateLintPass<'tcx> for Transmute {
if triggered {
return;
}

match (&from_ty.kind(), &to_ty.kind()) {
(_, _) if can_be_expressed_as_pointer_cast(cx, e, from_ty, to_ty) => span_lint_and_then(
cx,
TRANSMUTES_EXPRESSIBLE_AS_PTR_CASTS,
e.span,
&format!(
"transmute from `{}` to `{}` which could be expressed as a pointer cast instead",
from_ty,
to_ty
),
|diag| {
if let Some(arg) = sugg::Sugg::hir_opt(cx, &args[0]) {
let sugg = arg.as_ty(&to_ty.to_string()).to_string();
diag.span_suggestion(e.span, "try", sugg, Applicability::MachineApplicable);
}
}
),
_ => {
return;
},
let triggered = transmutes_expressible_as_ptr_casts::check(cx, e, from_ty, to_ty, args);
if triggered {
return;
}
}
}
Expand Down
38 changes: 38 additions & 0 deletions clippy_lints/src/transmute/transmutes_expressible_as_ptr_casts.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
use super::utils::can_be_expressed_as_pointer_cast;
use super::TRANSMUTES_EXPRESSIBLE_AS_PTR_CASTS;
use crate::utils::{span_lint_and_then, sugg};
use rustc_errors::Applicability;
use rustc_hir::Expr;
use rustc_lint::LateContext;
use rustc_middle::ty::Ty;

/// Checks for `transmutes_expressible_as_ptr_casts` lint.
/// Returns `true` if it's triggered, otherwise returns `false`.
pub(super) fn check<'tcx>(
cx: &LateContext<'tcx>,
e: &'tcx Expr<'_>,
from_ty: Ty<'tcx>,
to_ty: Ty<'tcx>,
args: &'tcx [Expr<'_>],
) -> bool {
if can_be_expressed_as_pointer_cast(cx, e, from_ty, to_ty) {
span_lint_and_then(
cx,
TRANSMUTES_EXPRESSIBLE_AS_PTR_CASTS,
e.span,
&format!(
"transmute from `{}` to `{}` which could be expressed as a pointer cast instead",
from_ty, to_ty
),
|diag| {
if let Some(arg) = sugg::Sugg::hir_opt(cx, &args[0]) {
let sugg = arg.as_ty(&to_ty.to_string()).to_string();
diag.span_suggestion(e.span, "try", sugg, Applicability::MachineApplicable);
}
},
);
true
} else {
false
}
}

0 comments on commit 25c221e

Please sign in to comment.