diff --git a/src/librustdoc/clean/mod.rs b/src/librustdoc/clean/mod.rs index c527e7f9725..6eaea4f3b06 100644 --- a/src/librustdoc/clean/mod.rs +++ b/src/librustdoc/clean/mod.rs @@ -1560,14 +1560,23 @@ impl<'tcx> Clean for ty::Const<'tcx> { impl Clean for hir::FieldDef<'_> { fn clean(&self, cx: &mut DocContext<'_>) -> Item { - let what_rustc_thinks = Item::from_hir_id_and_parts( - self.hir_id, + let def_id = cx.tcx.hir().local_def_id(self.hir_id).to_def_id(); + let what_rustc_thinks = Item::from_def_id_and_parts( + def_id, Some(self.ident.name), StructFieldItem(self.ty.clean(cx)), cx, ); - // Don't show `pub` for fields on enum variants; they are always public - Item { visibility: self.vis.clean(cx), ..what_rustc_thinks } + let parent = cx.tcx.parent(def_id).unwrap(); + match cx.tcx.def_kind(parent) { + DefKind::Struct | DefKind::Union => what_rustc_thinks, + DefKind::Variant => { + // Variant fields inherit their enum's visibility. + Item { visibility: Visibility::Inherited, ..what_rustc_thinks } + } + // FIXME: what about DefKind::Ctor? + parent_kind => panic!("unexpected parent kind: {:?}", parent_kind), + } } } @@ -1584,24 +1593,6 @@ impl Clean for ty::FieldDef { } } -impl Clean for hir::Visibility<'_> { - fn clean(&self, cx: &mut DocContext<'_>) -> Visibility { - match self.node { - hir::VisibilityKind::Public => Visibility::Public, - hir::VisibilityKind::Inherited => Visibility::Inherited, - hir::VisibilityKind::Crate(_) => { - let krate = DefId::local(CRATE_DEF_INDEX); - Visibility::Restricted(krate) - } - hir::VisibilityKind::Restricted { ref path, .. } => { - let path = path.clean(cx); - let did = register_res(cx, path.res); - Visibility::Restricted(did) - } - } - } -} - impl Clean for ty::Visibility { fn clean(&self, _cx: &mut DocContext<'_>) -> Visibility { match *self { @@ -1793,9 +1784,9 @@ impl Clean> for (&hir::Item<'_>, Option) { clean_fn_or_proc_macro(item, sig, generics, body_id, &mut name, cx) } ItemKind::Macro(ref macro_def) => { - let vis = item.vis.clean(cx); + let ty_vis = cx.tcx.visibility(def_id).clean(cx); MacroItem(Macro { - source: display_macro_source(cx, name, macro_def, def_id, vis), + source: display_macro_source(cx, name, macro_def, def_id, ty_vis), }) } ItemKind::Trait(is_auto, unsafety, ref generics, bounds, item_ids) => { @@ -1884,7 +1875,8 @@ fn clean_extern_crate( // this is the ID of the crate itself let crate_def_id = DefId { krate: cnum, index: CRATE_DEF_INDEX }; let attrs = cx.tcx.hir().attrs(krate.hir_id()); - let please_inline = cx.tcx.visibility(krate.def_id).is_public() + let ty_vis = cx.tcx.visibility(krate.def_id); + let please_inline = ty_vis.is_public() && attrs.iter().any(|a| { a.has_name(sym::doc) && match a.meta_item_list() { @@ -1916,7 +1908,7 @@ fn clean_extern_crate( name: Some(name), attrs: box attrs.clean(cx), def_id: crate_def_id.into(), - visibility: krate.vis.clean(cx), + visibility: ty_vis.clean(cx), kind: box ExternCrateItem { src: orig_name }, cfg: attrs.cfg(cx.tcx, &cx.cache.hidden_cfg), }]