@@ -6,8 +6,8 @@ use rustc_errors::Applicability;
6
6
use rustc_hir:: def:: { DefKind , Res } ;
7
7
use rustc_hir:: { Expr , ExprKind , QPath } ;
8
8
use rustc_lint:: { LateContext , LateLintPass } ;
9
- use rustc_middle:: ty:: { self , List , Ty } ;
10
- use rustc_session:: declare_lint_pass ;
9
+ use rustc_middle:: ty:: { List , Ty , TyCtxt } ;
10
+ use rustc_session:: impl_lint_pass ;
11
11
use rustc_span:: sym;
12
12
use std:: iter;
13
13
@@ -36,12 +36,35 @@ declare_clippy_lint! {
36
36
being enclosed in `Path::new` when the argument implements the trait"
37
37
}
38
38
39
- declare_lint_pass ! ( NeedlessPathNew => [ NEEDLESS_PATH_NEW ] ) ;
39
+ impl_lint_pass ! ( NeedlessPathNew < ' _> => [ NEEDLESS_PATH_NEW ] ) ;
40
40
41
- impl < ' tcx > LateLintPass < ' tcx > for NeedlessPathNew {
41
+ pub struct NeedlessPathNew < ' tcx > {
42
+ path_ty : Option < Ty < ' tcx > > ,
43
+ asref_def_id : Option < DefId > ,
44
+ }
45
+
46
+ impl < ' tcx > NeedlessPathNew < ' tcx > {
47
+ pub fn new ( tcx : TyCtxt < ' tcx > ) -> Self {
48
+ Self {
49
+ path_ty : ( tcx. get_diagnostic_item ( sym:: Path ) )
50
+ . map ( |path_def_id| Ty :: new_adt ( tcx, tcx. adt_def ( path_def_id) , List :: empty ( ) ) ) ,
51
+ asref_def_id : tcx. get_diagnostic_item ( sym:: AsRef ) ,
52
+ }
53
+ }
54
+ }
55
+
56
+ impl < ' tcx > LateLintPass < ' tcx > for NeedlessPathNew < ' tcx > {
42
57
fn check_expr ( & mut self , cx : & LateContext < ' tcx > , e : & ' tcx Expr < ' tcx > ) {
43
58
let tcx = cx. tcx ;
44
59
60
+ let Some ( path_ty) = self . path_ty else {
61
+ return ;
62
+ } ;
63
+
64
+ let Some ( asref_def_id) = self . asref_def_id else {
65
+ return ;
66
+ } ;
67
+
45
68
let ( fn_did, arguments) = match e. kind {
46
69
ExprKind :: Call ( callee, args)
47
70
if let Res :: Def ( DefKind :: Fn | DefKind :: AssocFn , did) = path_res ( cx, callee) =>
@@ -72,17 +95,6 @@ impl<'tcx> LateLintPass<'tcx> for NeedlessPathNew {
72
95
}
73
96
} ;
74
97
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
98
let implements_asref_path = |arg| implements_trait ( cx, arg, asref_def_id, & [ path_ty. into ( ) ] ) ;
87
99
88
100
let parameters = sig. inputs ( ) ;
0 commit comments