@@ -3,7 +3,7 @@ use rustc_data_structures::sync::Lock;
33use rustc_hir as hir;
44use rustc_hir:: def_id:: { LocalDefId , CRATE_DEF_ID } ;
55use rustc_hir:: intravisit;
6- use rustc_hir:: itemlikevisit :: ItemLikeVisitor ;
6+ use rustc_hir:: intravisit :: Visitor ;
77use rustc_hir:: { HirId , ItemLocalId } ;
88use rustc_middle:: hir:: map:: Map ;
99use rustc_middle:: hir:: nested_filter;
@@ -20,8 +20,30 @@ pub fn check_crate(tcx: TyCtxt<'_>) {
2020 let hir_map = tcx. hir ( ) ;
2121
2222 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+ }
2547 } ) ;
2648
2749 let errors = errors. into_inner ( ) ;
@@ -39,45 +61,16 @@ struct HirIdValidator<'a, 'hir> {
3961 errors : & ' a Lock < Vec < String > > ,
4062}
4163
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 > {
4966 HirIdValidator {
5067 hir_map,
5168 owner : None ,
5269 hir_ids_seen : Default :: default ( ) ,
5370 errors : self . errors ,
5471 }
5572 }
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- }
7973
80- impl < ' a , ' hir > HirIdValidator < ' a , ' hir > {
8174 #[ cold]
8275 #[ inline( never) ]
8376 fn error ( & self , f : impl FnOnce ( ) -> String ) {
@@ -146,6 +139,11 @@ impl<'a, 'hir> intravisit::Visitor<'hir> for HirIdValidator<'a, 'hir> {
146139 self . hir_map
147140 }
148141
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+
149147 fn visit_id ( & mut self , hir_id : HirId ) {
150148 let owner = self . owner . expect ( "no owner" ) ;
151149
@@ -163,11 +161,19 @@ impl<'a, 'hir> intravisit::Visitor<'hir> for HirIdValidator<'a, 'hir> {
163161 self . hir_ids_seen . insert ( hir_id. local_id ) ;
164162 }
165163
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) ) ;
171177 }
172178
173179 fn visit_foreign_item_ref ( & mut self , _: & ' hir hir:: ForeignItemRef ) {
@@ -176,4 +182,11 @@ impl<'a, 'hir> intravisit::Visitor<'hir> for HirIdValidator<'a, 'hir> {
176182 // we are currently in. So for those it's correct that they have a
177183 // different owner.
178184 }
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+ }
179192}
0 commit comments