]> git.proxmox.com Git - rustc.git/blob - src/librustc_metadata/foreign_modules.rs
New upstream version 1.44.1+dfsg1
[rustc.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)).collect();
26 self.modules
27 .push(ForeignModule { foreign_items, def_id: self.tcx.hir().local_def_id(it.hir_id) });
28 }
29
30 fn visit_trait_item(&mut self, _it: &'tcx hir::TraitItem<'tcx>) {}
31 fn visit_impl_item(&mut self, _it: &'tcx hir::ImplItem<'tcx>) {}
32 }