@@ -3,7 +3,7 @@ use rustc_data_structures::sync::Lock;
3
3
use rustc_hir as hir;
4
4
use rustc_hir:: def_id:: { LocalDefId , CRATE_DEF_ID } ;
5
5
use rustc_hir:: intravisit;
6
- use rustc_hir:: itemlikevisit :: ItemLikeVisitor ;
6
+ use rustc_hir:: intravisit :: Visitor ;
7
7
use rustc_hir:: { HirId , ItemLocalId } ;
8
8
use rustc_middle:: hir:: map:: Map ;
9
9
use rustc_middle:: hir:: nested_filter;
@@ -20,8 +20,30 @@ pub fn check_crate(tcx: TyCtxt<'_>) {
20
20
let hir_map = tcx. hir ( ) ;
21
21
22
22
hir_map. par_for_each_module ( |module_id| {
23
- hir_map
24
- . visit_item_likes_in_module ( module_id, & mut OuterVisitor { hir_map, errors : & errors } )
23
+ let mut v = HirIdValidator {
24
+ hir_map,
25
+ owner : None ,
26
+ hir_ids_seen : Default :: default ( ) ,
27
+ errors : & errors,
28
+ } ;
29
+
30
+ let module = tcx. hir_module_items ( module_id) ;
31
+
32
+ for id in module. items ( ) {
33
+ v. visit_item ( tcx. hir ( ) . item ( id) )
34
+ }
35
+
36
+ for id in module. trait_items ( ) {
37
+ v. visit_trait_item ( tcx. hir ( ) . trait_item ( id) )
38
+ }
39
+
40
+ for id in module. impl_items ( ) {
41
+ v. visit_impl_item ( tcx. hir ( ) . impl_item ( id) )
42
+ }
43
+
44
+ for id in module. foreign_items ( ) {
45
+ v. visit_foreign_item ( tcx. hir ( ) . foreign_item ( id) )
46
+ }
25
47
} ) ;
26
48
27
49
let errors = errors. into_inner ( ) ;
@@ -39,45 +61,16 @@ struct HirIdValidator<'a, 'hir> {
39
61
errors : & ' a Lock < Vec < String > > ,
40
62
}
41
63
42
- struct OuterVisitor < ' a , ' hir > {
43
- hir_map : Map < ' hir > ,
44
- errors : & ' a Lock < Vec < String > > ,
45
- }
46
-
47
- impl < ' a , ' hir > OuterVisitor < ' a , ' hir > {
48
- fn new_inner_visitor ( & self , hir_map : Map < ' hir > ) -> HirIdValidator < ' a , ' hir > {
64
+ impl < ' a , ' hir > HirIdValidator < ' a , ' hir > {
65
+ fn new_visitor ( & self , hir_map : Map < ' hir > ) -> HirIdValidator < ' a , ' hir > {
49
66
HirIdValidator {
50
67
hir_map,
51
68
owner : None ,
52
69
hir_ids_seen : Default :: default ( ) ,
53
70
errors : self . errors ,
54
71
}
55
72
}
56
- }
57
-
58
- impl < ' a , ' hir > ItemLikeVisitor < ' hir > for OuterVisitor < ' a , ' hir > {
59
- fn visit_item ( & mut self , i : & ' hir hir:: Item < ' hir > ) {
60
- let mut inner_visitor = self . new_inner_visitor ( self . hir_map ) ;
61
- inner_visitor. check ( i. def_id , |this| intravisit:: walk_item ( this, i) ) ;
62
- }
63
-
64
- fn visit_trait_item ( & mut self , i : & ' hir hir:: TraitItem < ' hir > ) {
65
- let mut inner_visitor = self . new_inner_visitor ( self . hir_map ) ;
66
- inner_visitor. check ( i. def_id , |this| intravisit:: walk_trait_item ( this, i) ) ;
67
- }
68
-
69
- fn visit_impl_item ( & mut self , i : & ' hir hir:: ImplItem < ' hir > ) {
70
- let mut inner_visitor = self . new_inner_visitor ( self . hir_map ) ;
71
- inner_visitor. check ( i. def_id , |this| intravisit:: walk_impl_item ( this, i) ) ;
72
- }
73
-
74
- fn visit_foreign_item ( & mut self , i : & ' hir hir:: ForeignItem < ' hir > ) {
75
- let mut inner_visitor = self . new_inner_visitor ( self . hir_map ) ;
76
- inner_visitor. check ( i. def_id , |this| intravisit:: walk_foreign_item ( this, i) ) ;
77
- }
78
- }
79
73
80
- impl < ' a , ' hir > HirIdValidator < ' a , ' hir > {
81
74
#[ cold]
82
75
#[ inline( never) ]
83
76
fn error ( & self , f : impl FnOnce ( ) -> String ) {
@@ -146,6 +139,11 @@ impl<'a, 'hir> intravisit::Visitor<'hir> for HirIdValidator<'a, 'hir> {
146
139
self . hir_map
147
140
}
148
141
142
+ fn visit_item ( & mut self , i : & ' hir hir:: Item < ' hir > ) {
143
+ let mut inner_visitor = self . new_visitor ( self . hir_map ) ;
144
+ inner_visitor. check ( i. def_id , |this| intravisit:: walk_item ( this, i) ) ;
145
+ }
146
+
149
147
fn visit_id ( & mut self , hir_id : HirId ) {
150
148
let owner = self . owner . expect ( "no owner" ) ;
151
149
@@ -163,11 +161,19 @@ impl<'a, 'hir> intravisit::Visitor<'hir> for HirIdValidator<'a, 'hir> {
163
161
self . hir_ids_seen . insert ( hir_id. local_id ) ;
164
162
}
165
163
166
- fn visit_impl_item_ref ( & mut self , _: & ' hir hir:: ImplItemRef ) {
167
- // Explicitly do nothing here. ImplItemRefs contain hir::Visibility
168
- // values that actually belong to an ImplItem instead of the ItemKind::Impl
169
- // we are currently in. So for those it's correct that they have a
170
- // different owner.
164
+ fn visit_foreign_item ( & mut self , i : & ' hir hir:: ForeignItem < ' hir > ) {
165
+ let mut inner_visitor = self . new_visitor ( self . hir_map ) ;
166
+ inner_visitor. check ( i. def_id , |this| intravisit:: walk_foreign_item ( this, i) ) ;
167
+ }
168
+
169
+ fn visit_trait_item ( & mut self , i : & ' hir hir:: TraitItem < ' hir > ) {
170
+ let mut inner_visitor = self . new_visitor ( self . hir_map ) ;
171
+ inner_visitor. check ( i. def_id , |this| intravisit:: walk_trait_item ( this, i) ) ;
172
+ }
173
+
174
+ fn visit_impl_item ( & mut self , i : & ' hir hir:: ImplItem < ' hir > ) {
175
+ let mut inner_visitor = self . new_visitor ( self . hir_map ) ;
176
+ inner_visitor. check ( i. def_id , |this| intravisit:: walk_impl_item ( this, i) ) ;
171
177
}
172
178
173
179
fn visit_foreign_item_ref ( & mut self , _: & ' hir hir:: ForeignItemRef ) {
@@ -176,4 +182,11 @@ impl<'a, 'hir> intravisit::Visitor<'hir> for HirIdValidator<'a, 'hir> {
176
182
// we are currently in. So for those it's correct that they have a
177
183
// different owner.
178
184
}
185
+
186
+ fn visit_impl_item_ref ( & mut self , _: & ' hir hir:: ImplItemRef ) {
187
+ // Explicitly do nothing here. ImplItemRefs contain hir::Visibility
188
+ // values that actually belong to an ImplItem instead of the ItemKind::Impl
189
+ // we are currently in. So for those it's correct that they have a
190
+ // different owner.
191
+ }
179
192
}
0 commit comments