Fix invalid handling of nested items with --document-private-items
This commit is contained in:
parent
f91d02b153
commit
c3c9f8f5f8
@ -10,6 +10,7 @@
|
|||||||
use rustc_middle::hir::nested_filter;
|
use rustc_middle::hir::nested_filter;
|
||||||
use rustc_middle::ty::TyCtxt;
|
use rustc_middle::ty::TyCtxt;
|
||||||
use rustc_span::def_id::{CRATE_DEF_ID, LOCAL_CRATE};
|
use rustc_span::def_id::{CRATE_DEF_ID, LOCAL_CRATE};
|
||||||
|
use rustc_span::hygiene::MacroKind;
|
||||||
use rustc_span::symbol::{kw, sym, Symbol};
|
use rustc_span::symbol::{kw, sym, Symbol};
|
||||||
use rustc_span::Span;
|
use rustc_span::Span;
|
||||||
|
|
||||||
@ -87,6 +88,7 @@ pub(crate) struct RustdocVisitor<'a, 'tcx> {
|
|||||||
inside_public_path: bool,
|
inside_public_path: bool,
|
||||||
exact_paths: DefIdMap<Vec<Symbol>>,
|
exact_paths: DefIdMap<Vec<Symbol>>,
|
||||||
modules: Vec<Module<'tcx>>,
|
modules: Vec<Module<'tcx>>,
|
||||||
|
is_importable_from_parent: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a, 'tcx> RustdocVisitor<'a, 'tcx> {
|
impl<'a, 'tcx> RustdocVisitor<'a, 'tcx> {
|
||||||
@ -107,6 +109,7 @@ pub(crate) fn new(cx: &'a mut core::DocContext<'tcx>) -> RustdocVisitor<'a, 'tcx
|
|||||||
inside_public_path: true,
|
inside_public_path: true,
|
||||||
exact_paths: Default::default(),
|
exact_paths: Default::default(),
|
||||||
modules: vec![om],
|
modules: vec![om],
|
||||||
|
is_importable_from_parent: true,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -319,11 +322,23 @@ fn add_to_current_mod(
|
|||||||
renamed: Option<Symbol>,
|
renamed: Option<Symbol>,
|
||||||
parent_id: Option<LocalDefId>,
|
parent_id: Option<LocalDefId>,
|
||||||
) {
|
) {
|
||||||
self.modules
|
if self.is_importable_from_parent
|
||||||
.last_mut()
|
// If we're inside an item, only impl blocks and `macro_rules!` with the `macro_export`
|
||||||
.unwrap()
|
// attribute can still be visible.
|
||||||
.items
|
|| match item.kind {
|
||||||
.insert((item.owner_id.def_id, renamed), (item, renamed, parent_id));
|
hir::ItemKind::Impl(..) => true,
|
||||||
|
hir::ItemKind::Macro(_, MacroKind::Bang) => {
|
||||||
|
self.cx.tcx.has_attr(item.owner_id.def_id, sym::macro_export)
|
||||||
|
}
|
||||||
|
_ => false,
|
||||||
|
}
|
||||||
|
{
|
||||||
|
self.modules
|
||||||
|
.last_mut()
|
||||||
|
.unwrap()
|
||||||
|
.items
|
||||||
|
.insert((item.owner_id.def_id, renamed), (item, renamed, parent_id));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn visit_item_inner(
|
fn visit_item_inner(
|
||||||
@ -485,7 +500,22 @@ fn nested_visit_map(&mut self) -> Self::Map {
|
|||||||
|
|
||||||
fn visit_item(&mut self, i: &'tcx hir::Item<'tcx>) {
|
fn visit_item(&mut self, i: &'tcx hir::Item<'tcx>) {
|
||||||
self.visit_item_inner(i, None, None);
|
self.visit_item_inner(i, None, None);
|
||||||
|
let new_value = if self.is_importable_from_parent {
|
||||||
|
matches!(
|
||||||
|
i.kind,
|
||||||
|
hir::ItemKind::Mod(..)
|
||||||
|
| hir::ItemKind::ForeignMod { .. }
|
||||||
|
| hir::ItemKind::Impl(..)
|
||||||
|
| hir::ItemKind::Trait(..)
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
// Whatever the context, if it's an impl block, the items inside it can be used so they
|
||||||
|
// should be visible.
|
||||||
|
matches!(i.kind, hir::ItemKind::Impl(..))
|
||||||
|
};
|
||||||
|
let prev = mem::replace(&mut self.is_importable_from_parent, new_value);
|
||||||
walk_item(self, i);
|
walk_item(self, i);
|
||||||
|
self.is_importable_from_parent = prev;
|
||||||
}
|
}
|
||||||
|
|
||||||
fn visit_mod(&mut self, _: &hir::Mod<'tcx>, _: Span, _: hir::HirId) {
|
fn visit_mod(&mut self, _: &hir::Mod<'tcx>, _: Span, _: hir::HirId) {
|
||||||
|
Loading…
Reference in New Issue
Block a user