diff options
| author | John Kåre Alsaker <john.kare.alsaker@gmail.com> | 2018-12-08 20:30:23 +0100 |
|---|---|---|
| committer | John Kåre Alsaker <john.kare.alsaker@gmail.com> | 2019-02-28 19:30:31 +0100 |
| commit | 23a51f91c928a4ff2cbf39218e6e991365e5f562 (patch) | |
| tree | e27a82e677e472550536820a8af2390d8f1da364 /src/librustc_interface/proc_macro_decls.rs | |
| parent | 1999a2288123173b2e487865c9a04386173025f7 (diff) | |
| download | rust-23a51f91c928a4ff2cbf39218e6e991365e5f562.tar.gz rust-23a51f91c928a4ff2cbf39218e6e991365e5f562.zip | |
Introduce rustc_interface and move some methods there
Diffstat (limited to 'src/librustc_interface/proc_macro_decls.rs')
| -rw-r--r-- | src/librustc_interface/proc_macro_decls.rs | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/src/librustc_interface/proc_macro_decls.rs b/src/librustc_interface/proc_macro_decls.rs new file mode 100644 index 00000000000..093d15b7e3c --- /dev/null +++ b/src/librustc_interface/proc_macro_decls.rs @@ -0,0 +1,48 @@ +use rustc::hir::itemlikevisit::ItemLikeVisitor; +use rustc::hir::def_id::{CrateNum, DefId, LOCAL_CRATE}; +use rustc::hir; +use rustc::ty::TyCtxt; +use rustc::ty::query::Providers; +use syntax::ast; +use syntax::attr; + +pub fn find<'tcx>(tcx: TyCtxt<'_, 'tcx, 'tcx>) -> Option<DefId> { + tcx.proc_macro_decls_static(LOCAL_CRATE) +} + +fn proc_macro_decls_static<'tcx>( + tcx: TyCtxt<'_, 'tcx, 'tcx>, + cnum: CrateNum, +) -> Option<DefId> { + assert_eq!(cnum, LOCAL_CRATE); + + let mut finder = Finder { decls: None }; + tcx.hir().krate().visit_all_item_likes(&mut finder); + + finder.decls.map(|id| tcx.hir().local_def_id(id)) +} + +struct Finder { + decls: Option<ast::NodeId>, +} + +impl<'v> ItemLikeVisitor<'v> for Finder { + fn visit_item(&mut self, item: &hir::Item) { + if attr::contains_name(&item.attrs, "rustc_proc_macro_decls") { + self.decls = Some(item.id); + } + } + + fn visit_trait_item(&mut self, _trait_item: &hir::TraitItem) { + } + + fn visit_impl_item(&mut self, _impl_item: &hir::ImplItem) { + } +} + +pub(crate) fn provide(providers: &mut Providers<'_>) { + *providers = Providers { + proc_macro_decls_static, + ..*providers + }; +} |
