@@ -21,7 +21,7 @@ extern crate rustc_session;
2121use rustc_borrowck:: consumers:: BodyWithBorrowckFacts ;
2222use rustc_driver:: Compilation ;
2323use rustc_hir:: def_id:: LocalDefId ;
24- use rustc_hir:: itemlikevisit :: ItemLikeVisitor ;
24+ use rustc_hir:: def :: DefKind ;
2525use rustc_interface:: interface:: Compiler ;
2626use rustc_interface:: { Config , Queries } ;
2727use rustc_middle:: ty:: query:: query_values:: mir_borrowck;
@@ -65,11 +65,34 @@ impl rustc_driver::Callbacks for CompilerCalls {
6565 queries. global_ctxt ( ) . unwrap ( ) . peek_mut ( ) . enter ( |tcx| {
6666 // Collect definition ids of MIR bodies.
6767 let hir = tcx. hir ( ) ;
68- let mut visitor = HirVisitor { bodies : Vec :: new ( ) } ;
69- hir. visit_all_item_likes ( & mut visitor) ;
68+ let mut bodies = Vec :: new ( ) ;
69+
70+ let crate_items = tcx. hir_crate_items ( ( ) ) ;
71+ for id in crate_items. items ( ) {
72+ if matches ! ( tcx. def_kind( id. def_id) , DefKind :: Fn ) {
73+ bodies. push ( id. def_id ) ;
74+ }
75+ }
76+
77+ for id in crate_items. trait_items ( ) {
78+ if matches ! ( tcx. def_kind( id. def_id) , DefKind :: AssocFn ) {
79+ let trait_item = hir. trait_item ( id) ;
80+ if let rustc_hir:: TraitItemKind :: Fn ( _, trait_fn) = & trait_item. kind {
81+ if let rustc_hir:: TraitFn :: Provided ( _) = trait_fn {
82+ bodies. push ( trait_item. def_id ) ;
83+ }
84+ }
85+ }
86+ }
87+
88+ for id in crate_items. impl_items ( ) {
89+ if matches ! ( tcx. def_kind( id. def_id) , DefKind :: AssocFn ) {
90+ bodies. push ( id. def_id ) ;
91+ }
92+ }
7093
7194 // Trigger borrow checking of all bodies.
72- for def_id in visitor . bodies {
95+ for def_id in bodies {
7396 let _ = tcx. optimized_mir ( def_id) ;
7497 }
7598
@@ -121,35 +144,6 @@ fn mir_borrowck<'tcx>(tcx: TyCtxt<'tcx>, def_id: LocalDefId) -> mir_borrowck<'tc
121144 original_mir_borrowck ( tcx, def_id)
122145}
123146
124- /// Visitor that collects all body definition ids mentioned in the program.
125- struct HirVisitor {
126- bodies : Vec < LocalDefId > ,
127- }
128-
129- impl < ' tcx > ItemLikeVisitor < ' tcx > for HirVisitor {
130- fn visit_item ( & mut self , item : & rustc_hir:: Item ) {
131- if let rustc_hir:: ItemKind :: Fn ( ..) = item. kind {
132- self . bodies . push ( item. def_id ) ;
133- }
134- }
135-
136- fn visit_trait_item ( & mut self , trait_item : & rustc_hir:: TraitItem ) {
137- if let rustc_hir:: TraitItemKind :: Fn ( _, trait_fn) = & trait_item. kind {
138- if let rustc_hir:: TraitFn :: Provided ( _) = trait_fn {
139- self . bodies . push ( trait_item. def_id ) ;
140- }
141- }
142- }
143-
144- fn visit_impl_item ( & mut self , impl_item : & rustc_hir:: ImplItem ) {
145- if let rustc_hir:: ImplItemKind :: Fn ( ..) = impl_item. kind {
146- self . bodies . push ( impl_item. def_id ) ;
147- }
148- }
149-
150- fn visit_foreign_item ( & mut self , _foreign_item : & rustc_hir:: ForeignItem ) { }
151- }
152-
153147/// Pull MIR bodies stored in the thread-local.
154148fn get_bodies < ' tcx > ( tcx : TyCtxt < ' tcx > ) -> Vec < ( String , BodyWithBorrowckFacts < ' tcx > ) > {
155149 MIR_BODIES . with ( |state| {
0 commit comments