@@ -4,10 +4,11 @@ use clippy_utils::source::snippet;
4
4
use clippy_utils:: ty:: implements_trait;
5
5
use rustc_errors:: Applicability ;
6
6
use rustc_hir:: def:: { DefKind , Res } ;
7
+ use rustc_hir:: def_id:: DefId ;
7
8
use rustc_hir:: { Expr , ExprKind , QPath } ;
8
9
use 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 ;
11
12
use rustc_span:: sym;
12
13
use std:: iter;
13
14
@@ -36,12 +37,35 @@ declare_clippy_lint! {
36
37
being enclosed in `Path::new` when the argument implements the trait"
37
38
}
38
39
39
- declare_lint_pass ! ( NeedlessPathNew => [ NEEDLESS_PATH_NEW ] ) ;
40
+ impl_lint_pass ! ( NeedlessPathNew < ' _> => [ NEEDLESS_PATH_NEW ] ) ;
40
41
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 > {
42
58
fn check_expr ( & mut self , cx : & LateContext < ' tcx > , e : & ' tcx Expr < ' tcx > ) {
43
59
let tcx = cx. tcx ;
44
60
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
+
45
69
let ( fn_did, arguments) = match e. kind {
46
70
ExprKind :: Call ( callee, args)
47
71
if let Res :: Def ( DefKind :: Fn | DefKind :: AssocFn , did) = path_res ( cx, callee) =>
@@ -72,17 +96,6 @@ impl<'tcx> LateLintPass<'tcx> for NeedlessPathNew {
72
96
}
73
97
} ;
74
98
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
-
86
99
let implements_asref_path = |arg| implements_trait ( cx, arg, asref_def_id, & [ path_ty. into ( ) ] ) ;
87
100
88
101
let parameters = sig. inputs ( ) ;
0 commit comments