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