use rustc::hir::map as hir_map;
use rustc::hir::def::Def;
-use rustc::hir::def_id::LOCAL_CRATE;
+use rustc::hir::def_id::{DefId, LOCAL_CRATE};
use rustc::middle::cstore::LoadedMacro;
use rustc::middle::privacy::AccessLevel;
use rustc::util::nodemap::FxHashSet;
inlining: bool,
/// Is the current module and all of its parents public?
inside_public_path: bool,
+ reexported_macros: FxHashSet<DefId>,
}
impl<'a, 'tcx> RustdocVisitor<'a, 'tcx> {
view_item_stack: stack,
inlining: false,
inside_public_path: true,
+ reexported_macros: FxHashSet(),
}
}
if let Some(exports) = self.cx.tcx.export_map.get(&id) {
for export in exports {
if let Def::Macro(def_id, ..) = export.def {
- if def_id.krate == LOCAL_CRATE {
+ if def_id.krate == LOCAL_CRATE || self.reexported_macros.contains(&def_id) {
continue // These are `krate.exported_macros`, handled in `self.visit()`.
}
+
let imported_from = self.cx.sess().cstore.original_crate_name(def_id.krate);
let def = match self.cx.sess().cstore.load_macro(def_id, self.cx.sess()) {
LoadedMacro::MacroDef(macro_def) => macro_def,
} else {
unreachable!()
};
+
om.macros.push(Macro {
def_id: def_id,
attrs: def.attrs.clone().into(),
false
}
+ debug!("maybe_inline_local def: {:?}", def);
+
let tcx = self.cx.tcx;
if def == Def::Err {
return false;
let is_no_inline = use_attrs.lists("doc").has_word("no_inline") ||
use_attrs.lists("doc").has_word("hidden");
+ // Memoize the non-inlined `pub use`'d macros so we don't push an extra
+ // declaration in `visit_mod_contents()`
+ if !def_did.is_local() {
+ if let Def::Macro(did, _) = def {
+ if please_inline { return true }
+ debug!("memoizing non-inlined macro export: {:?}", def);
+ self.reexported_macros.insert(did);
+ return false;
+ }
+ }
+
// For cross-crate impl inlining we need to know whether items are
// reachable in documentation - a previously nonreachable item can be
// made reachable by cross-crate inlining which we're checking here.
},
_ => {},
}
+
return false
}
}
// If we're inlining, skip private items.
_ if self.inlining && item.vis != hir::Public => {}
+ hir::ItemGlobalAsm(..) => {}
hir::ItemExternCrate(ref p) => {
let cstore = &self.cx.sess().cstore;
om.extern_crates.push(ExternCrate {