]> git.lizzy.rs Git - rust.git/blob - src/librustc_metadata/foreign_modules.rs
Don't use ExpnKind::descr to get the name of a bang macro.
[rust.git] / src / librustc_metadata / foreign_modules.rs
1 use rustc::middle::cstore::ForeignModule;
2 use rustc::ty::TyCtxt;
3 use rustc_hir as hir;
4 use rustc_hir::itemlikevisit::ItemLikeVisitor;
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     return 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 }