1 use clippy_utils::diagnostics::span_lint_and_sugg;
2 use clippy_utils::source::snippet_with_applicability;
3 use clippy_utils::{get_qpath_generic_tys, is_ty_param_diagnostic_item, is_ty_param_lang_item};
4 use rustc_errors::Applicability;
5 use rustc_hir::{self as hir, def_id::DefId, LangItem, QPath, TyKind};
6 use rustc_lint::LateContext;
7 use rustc_span::symbol::sym;
9 use super::{utils, REDUNDANT_ALLOCATION};
11 pub(super) fn check(cx: &LateContext<'_>, hir_ty: &hir::Ty<'_>, qpath: &QPath<'_>, def_id: DefId) -> bool {
12 if Some(def_id) == cx.tcx.lang_items().owned_box() {
13 if let Some(span) = utils::match_borrows_parameter(cx, qpath) {
14 let mut applicability = Applicability::MachineApplicable;
21 snippet_with_applicability(cx, span, "..", &mut applicability).to_string(),
28 if cx.tcx.is_diagnostic_item(sym::Rc, def_id) {
29 if let Some(ty) = is_ty_param_diagnostic_item(cx, qpath, sym::Rc) {
30 let mut applicability = Applicability::MachineApplicable;
35 "usage of `Rc<Rc<T>>`",
37 snippet_with_applicability(cx, ty.span, "..", &mut applicability).to_string(),
41 } else if let Some(ty) = is_ty_param_lang_item(cx, qpath, LangItem::OwnedBox) {
42 let qpath = match &ty.kind {
43 TyKind::Path(qpath) => qpath,
46 let inner_span = match get_qpath_generic_tys(qpath).next() {
50 let mut applicability = Applicability::MachineApplicable;
55 "usage of `Rc<Box<T>>`",
59 snippet_with_applicability(cx, inner_span, "..", &mut applicability)
65 utils::match_borrows_parameter(cx, qpath).map_or(false, |span| {
66 let mut applicability = Applicability::MachineApplicable;
73 snippet_with_applicability(cx, span, "..", &mut applicability).to_string(),