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};
4 use rustc_errors::Applicability;
5 use rustc_hir::{self as hir, def_id::DefId, QPath, TyKind};
6 use rustc_lint::LateContext;
7 use rustc_span::symbol::sym;
11 pub(super) fn check(cx: &LateContext<'_>, hir_ty: &hir::Ty<'_>, qpath: &QPath<'_>, def_id: DefId) -> bool {
12 if cx.tcx.is_diagnostic_item(sym::Rc, def_id) {
13 if let Some(alternate) = match_buffer_type(cx, qpath) {
18 "usage of `Rc<T>` when T is a buffer type",
20 format!("Rc<{}>", alternate),
21 Applicability::MachineApplicable,
23 } else if let Some(ty) = is_ty_param_diagnostic_item(cx, qpath, sym::vec_type) {
24 let qpath = match &ty.kind {
25 TyKind::Path(qpath) => qpath,
28 let inner_span = match get_qpath_generic_tys(qpath).next() {
32 let mut applicability = Applicability::MachineApplicable;
37 "usage of `Rc<T>` when T is a buffer type",
41 snippet_with_applicability(cx, inner_span, "..", &mut applicability)
43 Applicability::MachineApplicable,
47 } else if cx.tcx.is_diagnostic_item(sym::Arc, def_id) {
48 if let Some(alternate) = match_buffer_type(cx, qpath) {
53 "usage of `Arc<T>` when T is a buffer type",
55 format!("Arc<{}>", alternate),
56 Applicability::MachineApplicable,
58 } else if let Some(ty) = is_ty_param_diagnostic_item(cx, qpath, sym::vec_type) {
59 let qpath = match &ty.kind {
60 TyKind::Path(qpath) => qpath,
63 let inner_span = match get_qpath_generic_tys(qpath).next() {
67 let mut applicability = Applicability::MachineApplicable;
72 "usage of `Arc<T>` when T is a buffer type",
76 snippet_with_applicability(cx, inner_span, "..", &mut applicability)
78 Applicability::MachineApplicable,
87 fn match_buffer_type(cx: &LateContext<'_>, qpath: &QPath<'_>) -> Option<&'static str> {
88 if is_ty_param_diagnostic_item(cx, qpath, sym::string_type).is_some() {
90 } else if is_ty_param_diagnostic_item(cx, qpath, sym::OsString).is_some() {
91 Some("std::ffi::OsStr")
92 } else if is_ty_param_diagnostic_item(cx, qpath, sym::PathBuf).is_some() {
93 Some("std::path::Path")