]>
Commit | Line | Data |
---|---|---|
dfeec247 XL |
1 | use rustc_hir as hir; |
2 | use rustc_hir::def_id::{CrateNum, DefId, LOCAL_CRATE}; | |
3 | use rustc_hir::itemlikevisit::ItemLikeVisitor; | |
ba9703b0 XL |
4 | use rustc_middle::ty::query::Providers; |
5 | use rustc_middle::ty::TyCtxt; | |
dfeec247 | 6 | use rustc_span::symbol::sym; |
9e0c209e | 7 | |
416331ca | 8 | pub fn find(tcx: TyCtxt<'_>) -> Option<DefId> { |
0731742a XL |
9 | tcx.proc_macro_decls_static(LOCAL_CRATE) |
10 | } | |
11 | ||
416331ca | 12 | fn proc_macro_decls_static(tcx: TyCtxt<'_>, cnum: CrateNum) -> Option<DefId> { |
0731742a | 13 | assert_eq!(cnum, LOCAL_CRATE); |
9e0c209e | 14 | |
3dfed10e | 15 | let mut finder = Finder { tcx, decls: None }; |
0731742a XL |
16 | tcx.hir().krate().visit_all_item_likes(&mut finder); |
17 | ||
f9f354fc | 18 | finder.decls.map(|id| tcx.hir().local_def_id(id).to_def_id()) |
9e0c209e SL |
19 | } |
20 | ||
3dfed10e XL |
21 | struct Finder<'tcx> { |
22 | tcx: TyCtxt<'tcx>, | |
532ac7d7 | 23 | decls: Option<hir::HirId>, |
9e0c209e SL |
24 | } |
25 | ||
3dfed10e | 26 | impl<'v> ItemLikeVisitor<'v> for Finder<'_> { |
dfeec247 | 27 | fn visit_item(&mut self, item: &hir::Item<'_>) { |
3dfed10e | 28 | if self.tcx.sess.contains_name(&item.attrs, sym::rustc_proc_macro_decls) { |
532ac7d7 | 29 | self.decls = Some(item.hir_id); |
9e0c209e SL |
30 | } |
31 | } | |
476ff2be | 32 | |
dfeec247 | 33 | fn visit_trait_item(&mut self, _trait_item: &hir::TraitItem<'_>) {} |
32a655c1 | 34 | |
dfeec247 | 35 | fn visit_impl_item(&mut self, _impl_item: &hir::ImplItem<'_>) {} |
9e0c209e | 36 | } |
476ff2be | 37 | |
f035d41b | 38 | pub(crate) fn provide(providers: &mut Providers) { |
dfeec247 | 39 | *providers = Providers { proc_macro_decls_static, ..*providers }; |
0731742a | 40 | } |