]> git.lizzy.rs Git - rust.git/blob - clippy_lints/src/types/box_collection.rs
Merge commit '57b3c4b90f4346b3990c1be387c3b3ca7b78412c' into clippyup
[rust.git] / clippy_lints / src / types / box_collection.rs
1 use clippy_utils::diagnostics::span_lint_and_help;
2 use clippy_utils::{path_def_id, qpath_generic_tys};
3 use rustc_hir::{self as hir, def_id::DefId, QPath};
4 use rustc_lint::LateContext;
5 use rustc_span::{sym, Symbol};
6
7 use super::BOX_COLLECTION;
8
9 pub(super) fn check(cx: &LateContext<'_>, hir_ty: &hir::Ty<'_>, qpath: &QPath<'_>, def_id: DefId) -> bool {
10     if_chain! {
11         if Some(def_id) == cx.tcx.lang_items().owned_box();
12         if let Some(item_type) = get_std_collection(cx, qpath);
13         then {
14             let generic = match item_type {
15                 sym::String => "",
16                 _ => "<..>",
17             };
18             span_lint_and_help(
19                 cx,
20                 BOX_COLLECTION,
21                 hir_ty.span,
22                 &format!(
23                     "you seem to be trying to use `Box<{outer}{generic}>`. Consider using just `{outer}{generic}`",
24                     outer=item_type,
25                     generic = generic),
26                 None,
27                 &format!(
28                     "`{outer}{generic}` is already on the heap, `Box<{outer}{generic}>` makes an extra allocation",
29                     outer=item_type,
30                     generic = generic)
31             );
32             true
33         } else {
34             false
35         }
36     }
37 }
38
39 fn get_std_collection(cx: &LateContext<'_>, qpath: &QPath<'_>) -> Option<Symbol> {
40     let param = qpath_generic_tys(qpath).next()?;
41     let id = path_def_id(cx, param)?;
42     cx.tcx
43         .get_diagnostic_name(id)
44         .filter(|&name| matches!(name, sym::HashMap | sym::String | sym::Vec))
45 }