use rustc::hir::*;
use rustc::lint::*;
use rustc::ty;
-use utils::{differing_macro_contexts, match_type, paths, snippet, span_lint_and_then, walk_ptrs_ty, SpanlessEq};
-use utils::sugg::Sugg;
+use crate::utils::{differing_macro_contexts, match_type, paths, snippet, span_lint_and_then, walk_ptrs_ty, SpanlessEq};
+use crate::utils::sugg::Sugg;
/// **What it does:** Checks for manual swapping.
///
/// b = a;
/// a = t;
/// ```
-declare_lint! {
+declare_clippy_lint! {
pub MANUAL_SWAP,
- Warn,
+ complexity,
"manual swap of two variables"
}
/// a = b;
/// b = a;
/// ```
-declare_lint! {
+declare_clippy_lint! {
pub ALMOST_SWAPPED,
- Warn,
+ correctness,
"`foo = bar; bar = foo` sequence"
}
if let StmtDecl(ref tmp, _) = w[0].node;
if let DeclLocal(ref tmp) = tmp.node;
if let Some(ref tmp_init) = tmp.init;
- if let PatKind::Binding(_, _, ref tmp_name, None) = tmp.pat.node;
+ if let PatKind::Binding(_, _, ident, None) = tmp.pat.node;
// foo() = bar();
if let StmtSemi(ref first, _) = w[1].node;
if let ExprPath(QPath::Resolved(None, ref rhs2)) = rhs2.node;
if rhs2.segments.len() == 1;
- if tmp_name.node.as_str() == rhs2.segments[0].name.as_str();
+ if ident.as_str() == rhs2.segments[0].ident.as_str();
if SpanlessEq::new(cx).ignore_fn().eq_expr(tmp_init, lhs1);
if SpanlessEq::new(cx).ignore_fn().eq_expr(rhs1, lhs2);
then {
if let ExprIndex(ref lhs2, ref idx2) = lhs2.node {
if SpanlessEq::new(cx).ignore_fn().eq_expr(lhs1, lhs2) {
let ty = walk_ptrs_ty(cx.tables.expr_ty(lhs1));
-
+
if matches!(ty.sty, ty::TySlice(_)) ||
matches!(ty.sty, ty::TyArray(_, _)) ||
match_type(cx, ty, &paths::VEC) ||
}
}
}
-
+
None
}
-
+
let (replace, what, sugg) = if let Some((slice, idx1, idx2)) = check_for_slice(cx, lhs1, lhs2) {
if let Some(slice) = Sugg::hir_opt(cx, slice) {
(false,
} else {
(true, "".to_owned(), "".to_owned())
};
-
+
let span = w[0].span.to(second.span);
-
+
span_lint_and_then(cx,
MANUAL_SWAP,
span,
|db| {
if !sugg.is_empty() {
db.span_suggestion(span, "try", sugg);
-
+
if replace {
db.note("or maybe you should use `std::mem::replace`?");
}
let lhs0 = Sugg::hir_opt(cx, lhs0);
let rhs0 = Sugg::hir_opt(cx, rhs0);
let (what, lhs, rhs) = if let (Some(first), Some(second)) = (lhs0, rhs0) {
- (format!(" `{}` and `{}`", first, second), first.mut_addr().to_string(), second.mut_addr().to_string())
+ (
+ format!(" `{}` and `{}`", first, second),
+ first.mut_addr().to_string(),
+ second.mut_addr().to_string(),
+ )
} else {
("".to_owned(), "".to_owned(), "".to_owned())
};
-
+
let span = first.span.to(second.span);
-
+
span_lint_and_then(cx,
ALMOST_SWAPPED,
span,