@@ -21,7 +21,7 @@ extern crate rustc_session;
21
21
use rustc_borrowck:: consumers:: BodyWithBorrowckFacts ;
22
22
use rustc_driver:: Compilation ;
23
23
use rustc_hir:: def_id:: LocalDefId ;
24
- use rustc_hir:: itemlikevisit :: ItemLikeVisitor ;
24
+ use rustc_hir:: def :: DefKind ;
25
25
use rustc_interface:: interface:: Compiler ;
26
26
use rustc_interface:: { Config , Queries } ;
27
27
use rustc_middle:: ty:: query:: query_values:: mir_borrowck;
@@ -65,11 +65,34 @@ impl rustc_driver::Callbacks for CompilerCalls {
65
65
queries. global_ctxt ( ) . unwrap ( ) . peek_mut ( ) . enter ( |tcx| {
66
66
// Collect definition ids of MIR bodies.
67
67
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
+ }
70
93
71
94
// Trigger borrow checking of all bodies.
72
- for def_id in visitor . bodies {
95
+ for def_id in bodies {
73
96
let _ = tcx. optimized_mir ( def_id) ;
74
97
}
75
98
@@ -121,35 +144,6 @@ fn mir_borrowck<'tcx>(tcx: TyCtxt<'tcx>, def_id: LocalDefId) -> mir_borrowck<'tc
121
144
original_mir_borrowck ( tcx, def_id)
122
145
}
123
146
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
-
153
147
/// Pull MIR bodies stored in the thread-local.
154
148
fn get_bodies < ' tcx > ( tcx : TyCtxt < ' tcx > ) -> Vec < ( String , BodyWithBorrowckFacts < ' tcx > ) > {
155
149
MIR_BODIES . with ( |state| {
0 commit comments