about summary refs log tree commit diff
diff options
context:
space:
mode:
authorMateusz Gacek <96mateusz.gacek@gmail.com>2021-05-04 12:36:20 -0700
committerMateusz Gacek <96mateusz.gacek@gmail.com>2021-05-04 12:38:30 -0700
commit1835d8a2383c8ae3d26cdcba594fdb933a41f3fb (patch)
tree63d8b66c1e2b0b119f68f3f3c8aedd0eaf5a7637
parent0dc38c047e742d7d3c9f42866305a8c849eb4894 (diff)
downloadrust-1835d8a2383c8ae3d26cdcba594fdb933a41f3fb.tar.gz
rust-1835d8a2383c8ae3d26cdcba594fdb933a41f3fb.zip
needless_collect: Add `BinaryHeap` for indirect usage lint
-rw-r--r--clippy_lints/src/loops/needless_collect.rs1
-rw-r--r--tests/ui/needless_collect_indirect.rs7
-rw-r--r--tests/ui/needless_collect_indirect.stderr16
3 files changed, 22 insertions, 2 deletions
diff --git a/clippy_lints/src/loops/needless_collect.rs b/clippy_lints/src/loops/needless_collect.rs
index 293dd8b6b79..88d586c9346 100644
--- a/clippy_lints/src/loops/needless_collect.rs
+++ b/clippy_lints/src/loops/needless_collect.rs
@@ -85,6 +85,7 @@ fn check_needless_collect_indirect_usage<'tcx>(expr: &'tcx Expr<'_>, cx: &LateCo
                 if let ty = cx.typeck_results().node_type(hir_id);
                 if is_type_diagnostic_item(cx, ty, sym::vec_type) ||
                     is_type_diagnostic_item(cx, ty, sym::vecdeque_type) ||
+                    is_type_diagnostic_item(cx, ty, sym::BinaryHeap) ||
                     match_type(cx, ty, &paths::LINKED_LIST);
                 if let Some(iter_calls) = detect_iter_and_into_iters(block, *ident);
                 if let [iter_call] = &*iter_calls;
diff --git a/tests/ui/needless_collect_indirect.rs b/tests/ui/needless_collect_indirect.rs
index 2647c6401a4..2458bf1e490 100644
--- a/tests/ui/needless_collect_indirect.rs
+++ b/tests/ui/needless_collect_indirect.rs
@@ -1,4 +1,4 @@
-use std::collections::{HashMap, LinkedList, VecDeque};
+use std::collections::{BinaryHeap, HashMap, LinkedList, VecDeque};
 
 fn main() {
     let sample = [1; 5];
@@ -62,6 +62,11 @@ mod issue7110 {
         let indirect_len: LinkedList<_> = sample.iter().collect();
         indirect_len.len()
     }
+    fn lint_binary_heap() -> usize {
+        let sample = [1; 5];
+        let indirect_len: BinaryHeap<_> = sample.iter().collect();
+        indirect_len.len()
+    }
     fn dont_lint(string: &str) -> usize {
         let buffer: Vec<&str> = string.split('/').collect();
         for buff in &buffer {
diff --git a/tests/ui/needless_collect_indirect.stderr b/tests/ui/needless_collect_indirect.stderr
index 642beb2865a..f094e182a48 100644
--- a/tests/ui/needless_collect_indirect.stderr
+++ b/tests/ui/needless_collect_indirect.stderr
@@ -111,5 +111,19 @@ LL |
 LL |         sample.iter().count()
    |
 
-error: aborting due to 8 previous errors
+error: avoid using `collect()` when not needed
+  --> $DIR/needless_collect_indirect.rs:67:57
+   |
+LL |         let indirect_len: BinaryHeap<_> = sample.iter().collect();
+   |                                                         ^^^^^^^
+LL |         indirect_len.len()
+   |         ------------------ the iterator could be used here instead
+   |
+help: take the original Iterator's count instead of collecting it and finding the length
+   |
+LL |         
+LL |         sample.iter().count()
+   |
+
+error: aborting due to 9 previous errors