2 use rustc_hir
::def_id
::{CrateNum, DefId, LOCAL_CRATE}
;
3 use rustc_hir
::itemlikevisit
::ItemLikeVisitor
;
4 use rustc_middle
::ty
::query
::Providers
;
5 use rustc_middle
::ty
::TyCtxt
;
6 use rustc_span
::symbol
::sym
;
8 pub fn find(tcx
: TyCtxt
<'_
>) -> Option
<DefId
> {
9 tcx
.proc_macro_decls_static(LOCAL_CRATE
)
12 fn proc_macro_decls_static(tcx
: TyCtxt
<'_
>, cnum
: CrateNum
) -> Option
<DefId
> {
13 assert_eq
!(cnum
, LOCAL_CRATE
);
15 let mut finder
= Finder { tcx, decls: None }
;
16 tcx
.hir().krate().visit_all_item_likes(&mut finder
);
18 finder
.decls
.map(|id
| tcx
.hir().local_def_id(id
).to_def_id())
23 decls
: Option
<hir
::HirId
>,
26 impl<'v
> ItemLikeVisitor
<'v
> for Finder
<'_
> {
27 fn visit_item(&mut self, item
: &hir
::Item
<'_
>) {
28 if self.tcx
.sess
.contains_name(&item
.attrs
, sym
::rustc_proc_macro_decls
) {
29 self.decls
= Some(item
.hir_id
);
33 fn visit_trait_item(&mut self, _trait_item
: &hir
::TraitItem
<'_
>) {}
35 fn visit_impl_item(&mut self, _impl_item
: &hir
::ImplItem
<'_
>) {}
38 pub(crate) fn provide(providers
: &mut Providers
) {
39 *providers
= Providers { proc_macro_decls_static, ..*providers }
;