]> git.lizzy.rs Git - rust.git/blob - src/librustc_metadata/foreign_modules.rs
Rollup merge of #75262 - pickfire:patch-6, r=jyn514
[rust.git] / src / librustc_metadata / foreign_modules.rs
1 use rustc_hir as hir;
2 use rustc_hir::itemlikevisit::ItemLikeVisitor;
3 use rustc_middle::middle::cstore::ForeignModule;
4 use rustc_middle::ty::TyCtxt;
5
6 crate fn collect(tcx: TyCtxt<'_>) -> Vec<ForeignModule> {
7     let mut collector = Collector { tcx, modules: Vec::new() };
8     tcx.hir().krate().visit_all_item_likes(&mut collector);
9     collector.modules
10 }
11
12 struct Collector<'tcx> {
13     tcx: TyCtxt<'tcx>,
14     modules: Vec<ForeignModule>,
15 }
16
17 impl ItemLikeVisitor<'tcx> for Collector<'tcx> {
18     fn visit_item(&mut self, it: &'tcx hir::Item<'tcx>) {
19         let fm = match it.kind {
20             hir::ItemKind::ForeignMod(ref fm) => fm,
21             _ => return,
22         };
23
24         let foreign_items =
25             fm.items.iter().map(|it| self.tcx.hir().local_def_id(it.hir_id).to_def_id()).collect();
26         self.modules.push(ForeignModule {
27             foreign_items,
28             def_id: self.tcx.hir().local_def_id(it.hir_id).to_def_id(),
29         });
30     }
31
32     fn visit_trait_item(&mut self, _it: &'tcx hir::TraitItem<'tcx>) {}
33     fn visit_impl_item(&mut self, _it: &'tcx hir::ImplItem<'tcx>) {}
34 }