]> git.lizzy.rs Git - rust.git/blob - src/librustc_metadata/foreign_modules.rs
Run `rustfmt --file-lines ...` for changes from previous commits.
[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 pub fn collect<'tcx>(tcx: TyCtxt<'tcx, 'tcx>) -> 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, 'tcx>,
17     modules: Vec<ForeignModule>,
18 }
19
20 impl ItemLikeVisitor<'tcx> for Collector<'tcx> {
21     fn visit_item(&mut self, it: &'tcx hir::Item) {
22         let fm = match it.node {
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_from_hir_id(it.hir_id))
29             .collect();
30         self.modules.push(ForeignModule {
31             foreign_items,
32             def_id: self.tcx.hir().local_def_id_from_hir_id(it.hir_id),
33         });
34     }
35
36     fn visit_trait_item(&mut self, _it: &'tcx hir::TraitItem) {}
37     fn visit_impl_item(&mut self, _it: &'tcx hir::ImplItem) {}
38 }