2 use rustc_hir::itemlikevisit::ItemLikeVisitor;
3 use rustc_middle::middle::cstore::ForeignModule;
4 use rustc_middle::ty::TyCtxt;
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);
12 struct Collector<'tcx> {
14 modules: Vec<ForeignModule>,
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,
25 fm.items.iter().map(|it| self.tcx.hir().local_def_id(it.hir_id).to_def_id()).collect();
26 self.modules.push(ForeignModule {
28 def_id: self.tcx.hir().local_def_id(it.hir_id).to_def_id(),
32 fn visit_trait_item(&mut self, _it: &'tcx hir::TraitItem<'tcx>) {}
33 fn visit_impl_item(&mut self, _it: &'tcx hir::ImplItem<'tcx>) {}