@@ -4,10 +4,11 @@ use clippy_utils::source::snippet;
44use clippy_utils:: ty:: implements_trait;
55use rustc_errors:: Applicability ;
66use rustc_hir:: def:: { DefKind , Res } ;
7+ use rustc_hir:: def_id:: DefId ;
78use rustc_hir:: { Expr , ExprKind , QPath } ;
89use rustc_lint:: { LateContext , LateLintPass } ;
9- use rustc_middle:: ty:: { self , List , Ty } ;
10- use rustc_session:: declare_lint_pass ;
10+ use rustc_middle:: ty:: { List , Ty , TyCtxt } ;
11+ use rustc_session:: impl_lint_pass ;
1112use rustc_span:: sym;
1213use std:: iter;
1314
@@ -36,12 +37,35 @@ declare_clippy_lint! {
3637 being enclosed in `Path::new` when the argument implements the trait"
3738}
3839
39- declare_lint_pass ! ( NeedlessPathNew => [ NEEDLESS_PATH_NEW ] ) ;
40+ impl_lint_pass ! ( NeedlessPathNew < ' _> => [ NEEDLESS_PATH_NEW ] ) ;
4041
41- impl < ' tcx > LateLintPass < ' tcx > for NeedlessPathNew {
42+ pub struct NeedlessPathNew < ' tcx > {
43+ path_ty : Option < Ty < ' tcx > > ,
44+ asref_def_id : Option < DefId > ,
45+ }
46+
47+ impl < ' tcx > NeedlessPathNew < ' tcx > {
48+ pub fn new ( tcx : TyCtxt < ' tcx > ) -> Self {
49+ Self {
50+ path_ty : ( tcx. get_diagnostic_item ( sym:: Path ) )
51+ . map ( |path_def_id| Ty :: new_adt ( tcx, tcx. adt_def ( path_def_id) , List :: empty ( ) ) ) ,
52+ asref_def_id : tcx. get_diagnostic_item ( sym:: AsRef ) ,
53+ }
54+ }
55+ }
56+
57+ impl < ' tcx > LateLintPass < ' tcx > for NeedlessPathNew < ' tcx > {
4258 fn check_expr ( & mut self , cx : & LateContext < ' tcx > , e : & ' tcx Expr < ' tcx > ) {
4359 let tcx = cx. tcx ;
4460
61+ let Some ( path_ty) = self . path_ty else {
62+ return ;
63+ } ;
64+
65+ let Some ( asref_def_id) = self . asref_def_id else {
66+ return ;
67+ } ;
68+
4569 let ( fn_did, arguments) = match e. kind {
4670 ExprKind :: Call ( callee, args)
4771 if let Res :: Def ( DefKind :: Fn | DefKind :: AssocFn , did) = path_res ( cx, callee) =>
@@ -72,17 +96,6 @@ impl<'tcx> LateLintPass<'tcx> for NeedlessPathNew {
7296 }
7397 } ;
7498
75- let path_ty = {
76- let Some ( path_def_id) = tcx. get_diagnostic_item ( sym:: Path ) else {
77- return ;
78- } ;
79- Ty :: new_adt ( tcx, tcx. adt_def ( path_def_id) , List :: empty ( ) )
80- } ;
81-
82- let Some ( asref_def_id) = tcx. get_diagnostic_item ( sym:: AsRef ) else {
83- return ;
84- } ;
85-
8699 let implements_asref_path = |arg| implements_trait ( cx, arg, asref_def_id, & [ path_ty. into ( ) ] ) ;
87100
88101 let parameters = sig. inputs ( ) ;
0 commit comments