From f894adce8cd93a9edf3ce0908920e514d837e0dd Mon Sep 17 00:00:00 2001 From: rhysd Date: Thu, 31 Jan 2019 02:39:38 +0900 Subject: [PATCH] implement dbg_macro rule (fixes #3721) --- clippy_lints/src/dbg_macro.rs | 51 +++++++++++++++++++++++++++++++++++ clippy_lints/src/lib.rs | 4 +++ tests/ui/dbg_macro.rs | 3 +++ tests/ui/dbg_macro.stderr | 10 +++++++ 4 files changed, 68 insertions(+) create mode 100644 clippy_lints/src/dbg_macro.rs create mode 100644 tests/ui/dbg_macro.rs create mode 100644 tests/ui/dbg_macro.stderr diff --git a/clippy_lints/src/dbg_macro.rs b/clippy_lints/src/dbg_macro.rs new file mode 100644 index 00000000000..fad012bf7a2 --- /dev/null +++ b/clippy_lints/src/dbg_macro.rs @@ -0,0 +1,51 @@ +use rustc::lint::{EarlyContext, EarlyLintPass, LintArray, LintPass}; +use rustc::{declare_tool_lint, lint_array}; +use crate::utils::span_lint; +use syntax::ast; + +/// **What it does:** Checks for usage of dbg!() macro not to have it in +/// version control. +/// +/// **Why is this bad?** `dbg!` macro is intended as a debugging tool. +/// +/// **Known problems:** None. +/// +/// **Example:** +/// ```rust,ignore +/// // Bad +/// dbg!(true) +/// +/// // Good +/// true +/// ``` +declare_clippy_lint! { + pub DBG_MACRO, + style, + "`dbg!` macro is intended as a debugging tool" +} + +#[derive(Copy, Clone, Debug)] +pub struct Pass; + +impl LintPass for Pass { + fn get_lints(&self) -> LintArray { + lint_array!(DBG_MACRO) + } + + fn name(&self) -> &'static str { + "DbgMacro" + } +} + +impl EarlyLintPass for Pass { + fn check_mac(&mut self, cx: &EarlyContext<'_>, mac: &ast::Mac) { + if mac.node.path == "dbg" { + span_lint( + cx, + DBG_MACRO, + mac.span, + "`dbg!` macro is intended as a debugging tool. ensure to avoid having uses of it in version control", + ); + } + } +} diff --git a/clippy_lints/src/lib.rs b/clippy_lints/src/lib.rs index 52cc2a88da4..9681e58914d 100644 --- a/clippy_lints/src/lib.rs +++ b/clippy_lints/src/lib.rs @@ -94,6 +94,7 @@ pub mod const_static_lifetime; pub mod copies; pub mod copy_iterator; pub mod cyclomatic_complexity; +pub mod dbg_macro; pub mod default_trait_access; pub mod derive; pub mod doc; @@ -231,6 +232,7 @@ pub fn register_pre_expansion_lints( }, ); store.register_pre_expansion_pass(Some(session), true, false, box attrs::CfgAttrPass); + store.register_pre_expansion_pass(Some(session), true, false, box dbg_macro::Pass); } pub fn read_conf(reg: &rustc_plugin::Registry<'_>) -> Conf { @@ -589,6 +591,7 @@ pub fn register_plugins(reg: &mut rustc_plugin::Registry<'_>, conf: &Conf) { copies::IFS_SAME_COND, copies::IF_SAME_THEN_ELSE, cyclomatic_complexity::CYCLOMATIC_COMPLEXITY, + dbg_macro::DBG_MACRO, derive::DERIVE_HASH_XOR_EQ, double_comparison::DOUBLE_COMPARISONS, double_parens::DOUBLE_PARENS, @@ -800,6 +803,7 @@ pub fn register_plugins(reg: &mut rustc_plugin::Registry<'_>, conf: &Conf) { block_in_if_condition::BLOCK_IN_IF_CONDITION_STMT, collapsible_if::COLLAPSIBLE_IF, const_static_lifetime::CONST_STATIC_LIFETIME, + dbg_macro::DBG_MACRO, enum_variants::ENUM_VARIANT_NAMES, enum_variants::MODULE_INCEPTION, eq_op::OP_REF, diff --git a/tests/ui/dbg_macro.rs b/tests/ui/dbg_macro.rs new file mode 100644 index 00000000000..cf113050c26 --- /dev/null +++ b/tests/ui/dbg_macro.rs @@ -0,0 +1,3 @@ +fn main() { + dbg!(42); +} diff --git a/tests/ui/dbg_macro.stderr b/tests/ui/dbg_macro.stderr new file mode 100644 index 00000000000..cb5389c6e76 --- /dev/null +++ b/tests/ui/dbg_macro.stderr @@ -0,0 +1,10 @@ +error: `dbg!` macro is intended as a debugging tool. ensure to avoid having uses of it in version control + --> $DIR/dbg_macro.rs:2:5 + | +LL | dbg!(42); + | ^^^^^^^^ + | + = note: `-D clippy::dbg-macro` implied by `-D warnings` + +error: aborting due to previous error +