]> git.lizzy.rs Git - rust.git/blob - compiler/rustc_metadata/src/foreign_modules.rs
Auto merge of #80883 - GuillaumeGomez:remove-some-function-fields, r=ollie27
[rust.git] / compiler / rustc_metadata / src / 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 items = match it.kind {
20             hir::ItemKind::ForeignMod { items, .. } => items,
21             _ => return,
22         };
23
24         let foreign_items =
25             items.iter().map(|it| self.tcx.hir().local_def_id(it.id.hir_id).to_def_id()).collect();
26         self.modules.push(ForeignModule {
27             foreign_items,
28             def_id: self.tcx.hir().local_def_id(it.hir_id).to_def_id(),
29         });
30     }
31
32     fn visit_trait_item(&mut self, _it: &'tcx hir::TraitItem<'tcx>) {}
33     fn visit_impl_item(&mut self, _it: &'tcx hir::ImplItem<'tcx>) {}
34     fn visit_foreign_item(&mut self, _it: &'tcx hir::ForeignItem<'tcx>) {}
35 }