about summary refs log tree commit diff
diff options
context:
space:
mode:
authorJeremy Stucki <stucki.jeremy@gmail.com>2019-08-15 22:56:16 +0200
committerJeremy Stucki <stucki.jeremy@gmail.com>2019-08-15 22:58:32 +0200
commitf4f31a4ff40a6763bb9adf7413773f3a6e701dd9 (patch)
treee802a3ec94e3b49d57b623822dcd0d2f97dd1f5b
parentf95c87ecea0a885c8dd16c19a38dc3b46ab0754b (diff)
downloadrust-f4f31a4ff40a6763bb9adf7413773f3a6e701dd9.tar.gz
rust-f4f31a4ff40a6763bb9adf7413773f3a6e701dd9.zip
Implement lint 'suspicious_map'
-rw-r--r--CHANGELOG.md1
-rw-r--r--README.md2
-rw-r--r--clippy_lints/src/lib.rs1
-rw-r--r--clippy_lints/src/methods/mod.rs28
-rw-r--r--src/lintlist/mod.rs9
5 files changed, 39 insertions, 2 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 5e9013985ea..7e5dfa112cf 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1152,6 +1152,7 @@ Released 2018-09-13
 [`suspicious_arithmetic_impl`]: https://rust-lang.github.io/rust-clippy/master/index.html#suspicious_arithmetic_impl
 [`suspicious_assignment_formatting`]: https://rust-lang.github.io/rust-clippy/master/index.html#suspicious_assignment_formatting
 [`suspicious_else_formatting`]: https://rust-lang.github.io/rust-clippy/master/index.html#suspicious_else_formatting
+[`suspicious_map`]: https://rust-lang.github.io/rust-clippy/master/index.html#suspicious_map
 [`suspicious_op_assign_impl`]: https://rust-lang.github.io/rust-clippy/master/index.html#suspicious_op_assign_impl
 [`temporary_assignment`]: https://rust-lang.github.io/rust-clippy/master/index.html#temporary_assignment
 [`temporary_cstring_as_ptr`]: https://rust-lang.github.io/rust-clippy/master/index.html#temporary_cstring_as_ptr
diff --git a/README.md b/README.md
index 8bcfd8a8430..389fe316ade 100644
--- a/README.md
+++ b/README.md
@@ -6,7 +6,7 @@
 
 A collection of lints to catch common mistakes and improve your [Rust](https://github.com/rust-lang/rust) code.
 
-[There are 309 lints included in this crate!](https://rust-lang.github.io/rust-clippy/master/index.html)
+[There are 310 lints included in this crate!](https://rust-lang.github.io/rust-clippy/master/index.html)
 
 We have a bunch of lint categories to allow you to choose how much Clippy is supposed to ~~annoy~~ help you:
 
diff --git a/clippy_lints/src/lib.rs b/clippy_lints/src/lib.rs
index c8dbf77704c..2108b65dbd8 100644
--- a/clippy_lints/src/lib.rs
+++ b/clippy_lints/src/lib.rs
@@ -657,6 +657,7 @@ pub fn register_plugins(reg: &mut rustc_plugin::Registry<'_>, conf: &Conf) {
         methods::OPTION_MAP_UNWRAP_OR,
         methods::OPTION_MAP_UNWRAP_OR_ELSE,
         methods::RESULT_MAP_UNWRAP_OR_ELSE,
+        methods::SUSPICIOUS_MAP,
         misc::USED_UNDERSCORE_BINDING,
         misc_early::UNSEPARATED_LITERAL_SUFFIX,
         mut_mut::MUT_MUT,
diff --git a/clippy_lints/src/methods/mod.rs b/clippy_lints/src/methods/mod.rs
index 0020dbd233d..fc2d2341533 100644
--- a/clippy_lints/src/methods/mod.rs
+++ b/clippy_lints/src/methods/mod.rs
@@ -889,6 +889,23 @@ declare_clippy_lint! {
     "using `.into_iter()` on a reference"
 }
 
+declare_clippy_lint! {
+    /// **What it does:** Checks for calls to `map` followed by a `count`.
+    ///
+    /// **Why is this bad?** It looks suspicious. Maybe `map` was confused with `filter`.
+    ///
+    /// **Known problems:** None
+    ///
+    /// **Example:**
+    ///
+    /// ```rust
+    /// let _ = (0..3).map(|x| x + 2).count();
+    /// ```
+    pub SUSPICIOUS_MAP,
+    pedantic,
+    "suspicious usage of map"
+}
+
 declare_lint_pass!(Methods => [
     OPTION_UNWRAP_USED,
     RESULT_UNWRAP_USED,
@@ -927,6 +944,7 @@ declare_lint_pass!(Methods => [
     UNNECESSARY_FILTER_MAP,
     INTO_ITER_ON_ARRAY,
     INTO_ITER_ON_REF,
+    SUSPICIOUS_MAP,
 ]);
 
 impl<'a, 'tcx> LateLintPass<'a, 'tcx> for Methods {
@@ -972,6 +990,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for Methods {
             ["as_mut"] => lint_asref(cx, expr, "as_mut", arg_lists[0]),
             ["fold", ..] => lint_unnecessary_fold(cx, expr, arg_lists[0]),
             ["filter_map", ..] => unnecessary_filter_map::lint(cx, expr, arg_lists[0]),
+            ["count", "map"] => lint_suspicious_map(cx, expr),
             _ => {},
         }
 
@@ -2519,6 +2538,15 @@ fn lint_into_iter(cx: &LateContext<'_, '_>, expr: &hir::Expr, self_ref_ty: Ty<'_
     }
 }
 
+fn lint_suspicious_map(cx: &LateContext<'_, '_>, expr: &hir::Expr) {
+    span_lint(
+        cx,
+        SUSPICIOUS_MAP,
+        expr.span,
+        "Make sure you did not confuse `map` with `filter`.",
+    );
+}
+
 /// Given a `Result<T, E>` type, return its error type (`E`).
 fn get_error_type<'a>(cx: &LateContext<'_, '_>, ty: Ty<'a>) -> Option<Ty<'a>> {
     if let ty::Adt(_, substs) = ty.sty {
diff --git a/src/lintlist/mod.rs b/src/lintlist/mod.rs
index c02cdcdbd45..2d4520fb228 100644
--- a/src/lintlist/mod.rs
+++ b/src/lintlist/mod.rs
@@ -6,7 +6,7 @@ pub use lint::Lint;
 pub use lint::LINT_LEVELS;
 
 // begin lint list, do not remove this comment, it’s used in `update_lints`
-pub const ALL_LINTS: [Lint; 309] = [
+pub const ALL_LINTS: [Lint; 310] = [
     Lint {
         name: "absurd_extreme_comparisons",
         group: "correctness",
@@ -1737,6 +1737,13 @@ pub const ALL_LINTS: [Lint; 309] = [
         module: "formatting",
     },
     Lint {
+        name: "suspicious_map",
+        group: "pedantic",
+        desc: "suspicious usage of map",
+        deprecation: None,
+        module: "methods",
+    },
+    Lint {
         name: "suspicious_op_assign_impl",
         group: "correctness",
         desc: "suspicious use of operators in impl of OpAssign trait",