From 9de308ee1538ed35988dc6bcb0fd2faf43129133 Mon Sep 17 00:00:00 2001 From: Devon Hollowood Date: Fri, 11 Dec 2015 14:02:02 -0800 Subject: [PATCH] Add used_underscore_binding lint --- src/misc.rs | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/src/misc.rs b/src/misc.rs index b5c3d0c514f1..7068aac781e1 100644 --- a/src/misc.rs +++ b/src/misc.rs @@ -9,6 +9,7 @@ use rustc::middle::ty; use rustc::middle::const_eval::ConstVal::Float; use rustc::middle::const_eval::eval_const_expr_partial; use rustc::middle::const_eval::EvalHint::ExprTypeChecked; +use rustc::middle::def::Def; use utils::{get_item_name, match_path, snippet, span_lint, walk_ptrs_ty, is_integer_literal}; use utils::span_help_and_lint; @@ -316,3 +317,36 @@ impl LateLintPass for PatternPass { } } } + +declare_lint!(pub USED_UNDERSCORE_BINDING, Warn, + "using a binding which is prefixed with an underscore"); + +#[derive(Copy, Clone)] +pub struct UsedUnderscoreBinding; + +impl LintPass for UsedUnderscoreBinding { + fn get_lints(&self) -> LintArray { + lint_array!(USED_UNDERSCORE_BINDING) + } +} + +impl LateLintPass for UsedUnderscoreBinding { + fn check_expr(&mut self, cx: &LateContext, expr: &Expr) { + let needs_lint = match expr.node { + ExprPath(_, ref path) => { + path.segments.last().unwrap().identifier.name.as_str().chars().next() == Some('_') && + (cx.tcx.def_map.borrow()).values().any(|res| match res.base_def { + Def::DefLocal(_, _) => true, + _ => false + }) + }, + ExprField(_, spanned) => spanned.node.as_str().chars().next() == Some('_'), + _ => false + }; + if needs_lint { + cx.span_lint(USED_UNDERSCORE_BINDING, expr.span, &format!( + "Used binding which is prefixed with an underscore. A leading underscore signals\ + that a binding will not be used.")); + } + } +}