X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=clippy_lints%2Fsrc%2Fmut_reference.rs;h=58a8e1a1064ae7603f46bce495a4a76c70afaff7;hb=19339334cb4e9c6db5a1f7dced38edcb16707bc7;hp=5293c80ca2b5dcae8d91967199625c4dc948ba81;hpb=da7aebc342b7dae444912b98dedbab22bf2a224c;p=rust.git diff --git a/clippy_lints/src/mut_reference.rs b/clippy_lints/src/mut_reference.rs index 5293c80ca2b..58a8e1a1064 100644 --- a/clippy_lints/src/mut_reference.rs +++ b/clippy_lints/src/mut_reference.rs @@ -1,52 +1,49 @@ use crate::utils::span_lint; -use rustc::hir::*; -use rustc::lint::{LateContext, LateLintPass, LintArray, LintPass}; -use rustc::ty::subst::Subst; -use rustc::ty::{self, Ty}; -use rustc::{declare_tool_lint, lint_array}; +use rustc_hir::{BorrowKind, Expr, ExprKind, Mutability}; +use rustc_lint::{LateContext, LateLintPass}; +use rustc_middle::ty::subst::Subst; +use rustc_middle::ty::{self, Ty}; +use rustc_session::{declare_lint_pass, declare_tool_lint}; -/// **What it does:** Detects giving a mutable reference to a function that only -/// requires an immutable reference. -/// -/// **Why is this bad?** The immutable reference rules out all other references -/// to the value. Also the code misleads about the intent of the call site. -/// -/// **Known problems:** None. -/// -/// **Example:** -/// ```rust -/// my_vec.push(&mut value) -/// ``` declare_clippy_lint! { + /// **What it does:** Detects passing a mutable reference to a function that only + /// requires an immutable reference. + /// + /// **Why is this bad?** The immutable reference rules out all other references + /// to the value. Also the code misleads about the intent of the call site. + /// + /// **Known problems:** None. + /// + /// **Example:** + /// ```ignore + /// // Bad + /// my_vec.push(&mut value) + /// + /// // Good + /// my_vec.push(&value) + /// ``` pub UNNECESSARY_MUT_PASSED, style, "an argument passed as a mutable reference although the callee only demands an immutable reference" } -#[derive(Copy, Clone)] -pub struct UnnecessaryMutPassed; - -impl LintPass for UnnecessaryMutPassed { - fn get_lints(&self) -> LintArray { - lint_array!(UNNECESSARY_MUT_PASSED) - } -} +declare_lint_pass!(UnnecessaryMutPassed => [UNNECESSARY_MUT_PASSED]); impl<'a, 'tcx> LateLintPass<'a, 'tcx> for UnnecessaryMutPassed { - fn check_expr(&mut self, cx: &LateContext<'a, 'tcx>, e: &'tcx Expr) { - match e.node { + fn check_expr(&mut self, cx: &LateContext<'a, 'tcx>, e: &'tcx Expr<'_>) { + match e.kind { ExprKind::Call(ref fn_expr, ref arguments) => { - if let ExprKind::Path(ref path) = fn_expr.node { + if let ExprKind::Path(ref path) = fn_expr.kind { check_arguments( cx, arguments, cx.tables.expr_ty(fn_expr), - &print::to_string(print::NO_ANN, |s| s.print_qpath(path, false)), + &rustc_hir_pretty::to_string(rustc_hir_pretty::NO_ANN, |s| s.print_qpath(path, false)), ); } }, ExprKind::MethodCall(ref path, _, ref arguments) => { - let def_id = cx.tables.type_dependent_defs()[e.hir_id].def_id(); + let def_id = cx.tables.type_dependent_def_id(e.hir_id).unwrap(); let substs = cx.tables.node_substs(e.hir_id); let method_type = cx.tcx.type_of(def_id).subst(cx.tcx, substs); check_arguments(cx, arguments, method_type, &path.ident.as_str()) @@ -56,17 +53,22 @@ fn check_expr(&mut self, cx: &LateContext<'a, 'tcx>, e: &'tcx Expr) { } } -fn check_arguments<'a, 'tcx>(cx: &LateContext<'a, 'tcx>, arguments: &[Expr], type_definition: Ty<'tcx>, name: &str) { - match type_definition.sty { +fn check_arguments<'a, 'tcx>( + cx: &LateContext<'a, 'tcx>, + arguments: &[Expr<'_>], + type_definition: Ty<'tcx>, + name: &str, +) { + match type_definition.kind { ty::FnDef(..) | ty::FnPtr(_) => { let parameters = type_definition.fn_sig(cx.tcx).skip_binder().inputs(); for (argument, parameter) in arguments.iter().zip(parameters.iter()) { - match parameter.sty { - ty::Ref(_, _, MutImmutable) + match parameter.kind { + ty::Ref(_, _, Mutability::Not) | ty::RawPtr(ty::TypeAndMut { - mutbl: MutImmutable, .. + mutbl: Mutability::Not, .. }) => { - if let ExprKind::AddrOf(MutMutable, _) = argument.node { + if let ExprKind::AddrOf(BorrowKind::Ref, Mutability::Mut, _) = argument.kind { span_lint( cx, UNNECESSARY_MUT_PASSED,