]> git.lizzy.rs Git - rust.git/blob - src/tools/clippy/clippy_lints/src/methods/iter_count.rs
Rollup merge of #102765 - TaKO8Ki:follow-up-to-102708, r=compiler-errors
[rust.git] / src / tools / clippy / clippy_lints / src / methods / iter_count.rs
1 use super::utils::derefs_to_slice;
2 use clippy_utils::diagnostics::span_lint_and_sugg;
3 use clippy_utils::source::snippet_with_applicability;
4 use clippy_utils::ty::is_type_diagnostic_item;
5 use rustc_errors::Applicability;
6 use rustc_hir::Expr;
7 use rustc_lint::LateContext;
8 use rustc_span::sym;
9
10 use super::ITER_COUNT;
11
12 pub(crate) fn check<'tcx>(cx: &LateContext<'tcx>, expr: &Expr<'_>, recv: &'tcx Expr<'tcx>, iter_method: &str) {
13     let ty = cx.typeck_results().expr_ty(recv);
14     let caller_type = if derefs_to_slice(cx, recv, ty).is_some() {
15         "slice"
16     } else if is_type_diagnostic_item(cx, ty, sym::Vec) {
17         "Vec"
18     } else if is_type_diagnostic_item(cx, ty, sym::VecDeque) {
19         "VecDeque"
20     } else if is_type_diagnostic_item(cx, ty, sym::HashSet) {
21         "HashSet"
22     } else if is_type_diagnostic_item(cx, ty, sym::HashMap) {
23         "HashMap"
24     } else if is_type_diagnostic_item(cx, ty, sym::BTreeMap) {
25         "BTreeMap"
26     } else if is_type_diagnostic_item(cx, ty, sym::BTreeSet) {
27         "BTreeSet"
28     } else if is_type_diagnostic_item(cx, ty, sym::LinkedList) {
29         "LinkedList"
30     } else if is_type_diagnostic_item(cx, ty, sym::BinaryHeap) {
31         "BinaryHeap"
32     } else {
33         return;
34     };
35     let mut applicability = Applicability::MachineApplicable;
36     span_lint_and_sugg(
37         cx,
38         ITER_COUNT,
39         expr.span,
40         &format!("called `.{iter_method}().count()` on a `{caller_type}`"),
41         "try",
42         format!(
43             "{}.len()",
44             snippet_with_applicability(cx, recv.span, "..", &mut applicability),
45         ),
46         applicability,
47     );
48 }