X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=clippy_lints%2Fsrc%2Fneedless_borrow.rs;h=6e18501480b6043bc5d0ebaea57fd36446db195f;hb=6d1225981177587fbb68d9c4902c770c3dbaafb0;hp=f21cbe8b9adb0b7012cf22979d4326a4c1d302b0;hpb=38d4ac7ceaf8ace26864e847c8280dc66410587c;p=rust.git diff --git a/clippy_lints/src/needless_borrow.rs b/clippy_lints/src/needless_borrow.rs index f21cbe8b9ad..6e18501480b 100644 --- a/clippy_lints/src/needless_borrow.rs +++ b/clippy_lints/src/needless_borrow.rs @@ -2,29 +2,29 @@ //! //! This lint is **warn** by default -use crate::utils::{in_macro, snippet_opt, span_lint_and_then}; +use crate::utils::{snippet_opt, span_lint_and_then}; use if_chain::if_chain; -use rustc::hir::{BindingAnnotation, Expr, ExprKind, Item, MutImmutable, Pat, PatKind}; +use rustc::hir::{BindingAnnotation, BorrowKind, Expr, ExprKind, HirId, Item, Mutability, Pat, PatKind}; +use rustc::impl_lint_pass; use rustc::lint::{LateContext, LateLintPass, LintArray, LintPass}; use rustc::ty; use rustc::ty::adjustment::{Adjust, Adjustment}; -use rustc::{declare_tool_lint, lint_array}; use rustc_errors::Applicability; -use syntax::ast::NodeId; +use rustc_session::declare_tool_lint; -/// **What it does:** Checks for address of operations (`&`) that are going to -/// be dereferenced immediately by the compiler. -/// -/// **Why is this bad?** Suggests that the receiver of the expression borrows -/// the expression. -/// -/// **Example:** -/// ```rust -/// let x: &i32 = &&&&&&5; -/// ``` -/// -/// **Known problems:** None. declare_clippy_lint! { + /// **What it does:** Checks for address of operations (`&`) that are going to + /// be dereferenced immediately by the compiler. + /// + /// **Why is this bad?** Suggests that the receiver of the expression borrows + /// the expression. + /// + /// **Example:** + /// ```rust + /// let x: &i32 = &&&&&&5; + /// ``` + /// + /// **Known problems:** None. pub NEEDLESS_BORROW, nursery, "taking a reference that is going to be automatically dereferenced" @@ -32,22 +32,18 @@ #[derive(Default)] pub struct NeedlessBorrow { - derived_item: Option, + derived_item: Option, } -impl LintPass for NeedlessBorrow { - fn get_lints(&self) -> LintArray { - lint_array!(NEEDLESS_BORROW) - } -} +impl_lint_pass!(NeedlessBorrow => [NEEDLESS_BORROW]); impl<'a, 'tcx> LateLintPass<'a, 'tcx> for NeedlessBorrow { fn check_expr(&mut self, cx: &LateContext<'a, 'tcx>, e: &'tcx Expr) { - if in_macro(e.span) || self.derived_item.is_some() { + if e.span.from_expansion() || self.derived_item.is_some() { return; } - if let ExprKind::AddrOf(MutImmutable, ref inner) = e.node { - if let ty::Ref(..) = cx.tables.expr_ty(inner).sty { + if let ExprKind::AddrOf(BorrowKind::Ref, Mutability::Not, ref inner) = e.kind { + if let ty::Ref(..) = cx.tables.expr_ty(inner).kind { for adj3 in cx.tables.expr_adjustments(e).windows(3) { if let [Adjustment { kind: Adjust::Deref(_), .. @@ -66,7 +62,7 @@ fn check_expr(&mut self, cx: &LateContext<'a, 'tcx>, e: &'tcx Expr) { by the compiler", |db| { if let Some(snippet) = snippet_opt(cx, inner.span) { - db.span_suggestion_with_applicability( + db.span_suggestion( e.span, "change this to", snippet, @@ -81,16 +77,16 @@ fn check_expr(&mut self, cx: &LateContext<'a, 'tcx>, e: &'tcx Expr) { } } fn check_pat(&mut self, cx: &LateContext<'a, 'tcx>, pat: &'tcx Pat) { - if in_macro(pat.span) || self.derived_item.is_some() { + if pat.span.from_expansion() || self.derived_item.is_some() { return; } if_chain! { - if let PatKind::Binding(BindingAnnotation::Ref, _, name, _) = pat.node; - if let ty::Ref(_, tam, mutbl) = cx.tables.pat_ty(pat).sty; - if mutbl == MutImmutable; - if let ty::Ref(_, _, mutbl) = tam.sty; + if let PatKind::Binding(BindingAnnotation::Ref, .., name, _) = pat.kind; + if let ty::Ref(_, tam, mutbl) = cx.tables.pat_ty(pat).kind; + if mutbl == Mutability::Not; + if let ty::Ref(_, _, mutbl) = tam.kind; // only lint immutable refs, because borrowed `&mut T` cannot be moved out - if mutbl == MutImmutable; + if mutbl == Mutability::Not; then { span_lint_and_then( cx, @@ -99,7 +95,7 @@ fn check_pat(&mut self, cx: &LateContext<'a, 'tcx>, pat: &'tcx Pat) { "this pattern creates a reference to a reference", |db| { if let Some(snippet) = snippet_opt(cx, name.span) { - db.span_suggestion_with_applicability( + db.span_suggestion( pat.span, "change this to", snippet, @@ -112,16 +108,16 @@ fn check_pat(&mut self, cx: &LateContext<'a, 'tcx>, pat: &'tcx Pat) { } } - fn check_item(&mut self, _: &LateContext<'a, 'tcx>, item: &'tcx Item) { - if item.attrs.iter().any(|a| a.check_name("automatically_derived")) { + fn check_item(&mut self, _: &LateContext<'a, 'tcx>, item: &'tcx Item<'_>) { + if item.attrs.iter().any(|a| a.check_name(sym!(automatically_derived))) { debug_assert!(self.derived_item.is_none()); - self.derived_item = Some(item.id); + self.derived_item = Some(item.hir_id); } } - fn check_item_post(&mut self, _: &LateContext<'a, 'tcx>, item: &'tcx Item) { + fn check_item_post(&mut self, _: &LateContext<'a, 'tcx>, item: &'tcx Item<'_>) { if let Some(id) = self.derived_item { - if item.id == id { + if item.hir_id == id { self.derived_item = None; } }