X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=clippy_lints%2Fsrc%2Fneedless_borrowed_ref.rs;h=845e5d6425708bea048545dc21b66f15daf9b92c;hb=e5a5b0a0774625eebbe7b29c67b49dc6431544d1;hp=714c746f68d6b2240e9cc921b6a2ee1ac0e0971e;hpb=56f51b35e8b4252aa0d10e9ac3d26e4b821e12a0;p=rust.git diff --git a/clippy_lints/src/needless_borrowed_ref.rs b/clippy_lints/src/needless_borrowed_ref.rs index 714c746f68d..845e5d64257 100644 --- a/clippy_lints/src/needless_borrowed_ref.rs +++ b/clippy_lints/src/needless_borrowed_ref.rs @@ -2,12 +2,13 @@ //! //! This lint is **warn** by default -use crate::utils::{snippet, span_lint_and_then}; +use crate::utils::{snippet_with_applicability, span_lint_and_then}; use if_chain::if_chain; -use rustc::hir::{BindingAnnotation, MutImmutable, Pat, PatKind}; +use rustc::declare_lint_pass; +use rustc::hir::{BindingAnnotation, Mutability, Node, Pat, PatKind}; use rustc::lint::{LateContext, LateLintPass, LintArray, LintPass}; -use rustc::{declare_lint_pass, declare_tool_lint}; use rustc_errors::Applicability; +use rustc_session::declare_tool_lint; declare_clippy_lint! { /// **What it does:** Checks for useless borrowed references. @@ -61,20 +62,29 @@ fn check_pat(&mut self, cx: &LateContext<'a, 'tcx>, pat: &'tcx Pat) { if_chain! { // Only lint immutable refs, because `&mut ref T` may be useful. - if let PatKind::Ref(ref sub_pat, MutImmutable) = pat.node; + if let PatKind::Ref(ref sub_pat, Mutability::Immutable) = pat.kind; // Check sub_pat got a `ref` keyword (excluding `ref mut`). - if let PatKind::Binding(BindingAnnotation::Ref, .., spanned_name, _) = sub_pat.node; + if let PatKind::Binding(BindingAnnotation::Ref, .., spanned_name, _) = sub_pat.kind; + let parent_id = cx.tcx.hir().get_parent_node(pat.hir_id); + if let Some(parent_node) = cx.tcx.hir().find(parent_id); then { + // do not recurse within patterns, as they may have other references + // XXXManishearth we can relax this constraint if we only check patterns + // with a single ref pattern inside them + if let Node::Pat(_) = parent_node { + return; + } + let mut applicability = Applicability::MachineApplicable; span_lint_and_then(cx, NEEDLESS_BORROWED_REFERENCE, pat.span, "this pattern takes a reference on something that is being de-referenced", |db| { - let hint = snippet(cx, spanned_name.span, "..").into_owned(); + let hint = snippet_with_applicability(cx, spanned_name.span, "..", &mut applicability).into_owned(); db.span_suggestion( pat.span, "try removing the `&ref` part and just keep", hint, - Applicability::MachineApplicable, // snippet + applicability, ); }); }