1 use rustc_errors::Applicability;
2 use rustc_hir::{self as hir, def_id::DefId, LangItem, QPath, TyKind};
3 use rustc_lint::LateContext;
4 use rustc_span::symbol::sym;
7 get_qpath_generic_tys, is_ty_param_diagnostic_item, is_ty_param_lang_item, snippet_with_applicability,
11 use super::{utils, REDUNDANT_ALLOCATION};
13 pub(super) fn check(cx: &LateContext<'_>, hir_ty: &hir::Ty<'_>, qpath: &QPath<'_>, def_id: DefId) {
14 if Some(def_id) == cx.tcx.lang_items().owned_box() {
15 if let Some(span) = utils::match_borrows_parameter(cx, qpath) {
16 let mut applicability = Applicability::MachineApplicable;
23 snippet_with_applicability(cx, span, "..", &mut applicability).to_string(),
30 if cx.tcx.is_diagnostic_item(sym::Rc, def_id) {
31 if let Some(ty) = is_ty_param_diagnostic_item(cx, qpath, sym::Rc) {
32 let mut applicability = Applicability::MachineApplicable;
37 "usage of `Rc<Rc<T>>`",
39 snippet_with_applicability(cx, ty.span, "..", &mut applicability).to_string(),
42 } else if let Some(ty) = is_ty_param_lang_item(cx, qpath, LangItem::OwnedBox) {
43 let qpath = match &ty.kind {
44 TyKind::Path(qpath) => qpath,
47 let inner_span = match get_qpath_generic_tys(qpath).next() {
51 let mut applicability = Applicability::MachineApplicable;
56 "usage of `Rc<Box<T>>`",
60 snippet_with_applicability(cx, inner_span, "..", &mut applicability)
64 } else if let Some(span) = utils::match_borrows_parameter(cx, qpath) {
65 let mut applicability = Applicability::MachineApplicable;
72 snippet_with_applicability(cx, span, "..", &mut applicability).to_string(),
75 return; // don't recurse into the type