diff options
| author | Matthias Krüger <matthias.krueger@famsik.de> | 2021-11-10 18:52:26 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-11-10 18:52:26 +0100 |
| commit | a8dff349ca0c9fb5283fe221b0b3786cacb8be4e (patch) | |
| tree | 7a5d46be7ad830af81f2548ed9ea5a906f9a5109 /src | |
| parent | 68ca579406f2fa9ec62710e4a4d5d3e07a168d3c (diff) | |
| parent | 6622376ff65d5c5f60f8a8877b223bb69e9a9552 (diff) | |
| download | rust-a8dff349ca0c9fb5283fe221b0b3786cacb8be4e.tar.gz rust-a8dff349ca0c9fb5283fe221b0b3786cacb8be4e.zip | |
Rollup merge of #88447 - inquisitivecrystal:rustdoc-vis, r=jyn514
Use computed visibility in rustdoc This PR changes `librustdoc` to use computed visibility instead of syntactic visibility. It was initially part of #88019, but was separated due to concerns that it might cause a regression somewhere we couldn't predict. r? `@jyn514` cc `@cjgillot` `@petrochenkov`
Diffstat (limited to 'src')
| -rw-r--r-- | src/librustdoc/clean/inline.rs | 4 | ||||
| -rw-r--r-- | src/librustdoc/clean/mod.rs | 12 | ||||
| -rw-r--r-- | src/librustdoc/clean/types.rs | 4 | ||||
| -rw-r--r-- | src/librustdoc/visit_ast.rs | 13 | ||||
| -rw-r--r-- | src/librustdoc/visit_lib.rs | 6 |
5 files changed, 20 insertions, 19 deletions
diff --git a/src/librustdoc/clean/inline.rs b/src/librustdoc/clean/inline.rs index d670288270a..4a8a3160379 100644 --- a/src/librustdoc/clean/inline.rs +++ b/src/librustdoc/clean/inline.rs @@ -435,7 +435,7 @@ crate fn build_impl( tcx.associated_items(did) .in_definition_order() .filter_map(|item| { - if associated_trait.is_some() || item.vis == ty::Visibility::Public { + if associated_trait.is_some() || item.vis.is_public() { Some(item.clean(cx)) } else { None @@ -515,7 +515,7 @@ fn build_module( // two namespaces, so the target may be listed twice. Make sure we only // visit each node at most once. for &item in cx.tcx.item_children(did).iter() { - if item.vis == ty::Visibility::Public { + if item.vis.is_public() { let res = item.res.expect_non_local(); if let Some(def_id) = res.mod_def_id() { if did == def_id || !visited.insert(def_id) { diff --git a/src/librustdoc/clean/mod.rs b/src/librustdoc/clean/mod.rs index 3db0ef17fd8..a44641f4488 100644 --- a/src/librustdoc/clean/mod.rs +++ b/src/librustdoc/clean/mod.rs @@ -1881,7 +1881,7 @@ 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 = krate.vis.node.is_pub() + let please_inline = cx.tcx.visibility(krate.def_id).is_public() && attrs.iter().any(|a| { a.has_name(sym::doc) && match a.meta_item_list() { @@ -1933,9 +1933,12 @@ fn clean_use_statement( return Vec::new(); } + let visibility = cx.tcx.visibility(import.def_id); let attrs = cx.tcx.hir().attrs(import.hir_id()); let inline_attr = attrs.lists(sym::doc).get_word_attr(sym::inline); - let pub_underscore = import.vis.node.is_pub() && name == kw::Underscore; + let pub_underscore = visibility.is_public() && name == kw::Underscore; + let current_mod = cx.tcx.parent_module_from_def_id(import.def_id); + let parent_mod = cx.tcx.parent_module_from_def_id(current_mod); if pub_underscore { if let Some(ref inline) = inline_attr { @@ -1954,8 +1957,9 @@ fn clean_use_statement( // forcefully don't inline if this is not public or if the // #[doc(no_inline)] attribute is present. // Don't inline doc(hidden) imports so they can be stripped at a later stage. - let mut denied = !(import.vis.node.is_pub() - || (cx.render_options.document_private && import.vis.node.is_pub_restricted())) + let mut denied = !(visibility.is_public() + || (cx.render_options.document_private + && visibility.is_accessible_from(parent_mod.to_def_id(), cx.tcx))) || pub_underscore || attrs.iter().any(|a| { a.has_name(sym::doc) diff --git a/src/librustdoc/clean/types.rs b/src/librustdoc/clean/types.rs index fd4d620c959..2dba52afcd9 100644 --- a/src/librustdoc/clean/types.rs +++ b/src/librustdoc/clean/types.rs @@ -254,7 +254,7 @@ impl ExternalCrate { as_keyword(Res::Def(DefKind::Mod, id.def_id.to_def_id())) } hir::ItemKind::Use(path, hir::UseKind::Single) - if item.vis.node.is_pub() => + if tcx.visibility(id.def_id).is_public() => { as_keyword(path.res.expect_non_local()) .map(|(_, prim)| (id.def_id.to_def_id(), prim)) @@ -320,7 +320,7 @@ impl ExternalCrate { as_primitive(Res::Def(DefKind::Mod, id.def_id.to_def_id())) } hir::ItemKind::Use(path, hir::UseKind::Single) - if item.vis.node.is_pub() => + if tcx.visibility(id.def_id).is_public() => { as_primitive(path.res.expect_non_local()).map(|(_, prim)| { // Pretend the primitive is local. diff --git a/src/librustdoc/visit_ast.rs b/src/librustdoc/visit_ast.rs index 5d1f934240f..1191a94a703 100644 --- a/src/librustdoc/visit_ast.rs +++ b/src/librustdoc/visit_ast.rs @@ -10,7 +10,6 @@ use rustc_hir::CRATE_HIR_ID; use rustc_middle::middle::privacy::AccessLevel; use rustc_middle::ty::TyCtxt; use rustc_span::def_id::{CRATE_DEF_ID, LOCAL_CRATE}; -use rustc_span::source_map::Spanned; use rustc_span::symbol::{kw, sym, Symbol}; use std::mem; @@ -72,9 +71,7 @@ impl<'a, 'tcx> RustdocVisitor<'a, 'tcx> { } crate fn visit(mut self) -> Module<'tcx> { - let span = self.cx.tcx.def_span(CRATE_DEF_ID); let mut top_level_module = self.visit_mod_contents( - &Spanned { span, node: hir::VisibilityKind::Public }, hir::CRATE_HIR_ID, self.cx.tcx.hir().root_module(), self.cx.tcx.crate_name(LOCAL_CRATE), @@ -134,15 +131,15 @@ impl<'a, 'tcx> RustdocVisitor<'a, 'tcx> { fn visit_mod_contents( &mut self, - vis: &hir::Visibility<'_>, id: hir::HirId, m: &'tcx hir::Mod<'tcx>, name: Symbol, ) -> Module<'tcx> { let mut om = Module::new(name, id, m.inner); + let def_id = self.cx.tcx.hir().local_def_id(id).to_def_id(); // Keep track of if there were any private modules in the path. let orig_inside_public_path = self.inside_public_path; - self.inside_public_path &= vis.node.is_pub(); + self.inside_public_path &= self.cx.tcx.visibility(def_id).is_public(); for &i in m.item_ids { let item = self.cx.tcx.hir().item(i); self.visit_item(item, None, &mut om); @@ -259,7 +256,7 @@ impl<'a, 'tcx> RustdocVisitor<'a, 'tcx> { let name = renamed.unwrap_or(item.ident.name); let def_id = item.def_id.to_def_id(); - let is_pub = item.vis.node.is_pub() || self.cx.tcx.has_attr(def_id, sym::macro_export); + let is_pub = self.cx.tcx.visibility(def_id).is_public(); if is_pub { self.store_path(item.def_id.to_def_id()); @@ -332,7 +329,7 @@ impl<'a, 'tcx> RustdocVisitor<'a, 'tcx> { } } hir::ItemKind::Mod(ref m) => { - om.mods.push(self.visit_mod_contents(&item.vis, item.hir_id(), m, name)); + om.mods.push(self.visit_mod_contents(item.hir_id(), m, name)); } hir::ItemKind::Fn(..) | hir::ItemKind::ExternCrate(..) @@ -368,7 +365,7 @@ impl<'a, 'tcx> RustdocVisitor<'a, 'tcx> { om: &mut Module<'tcx>, ) { // If inlining we only want to include public functions. - if !self.inlining || item.vis.node.is_pub() { + if !self.inlining || self.cx.tcx.visibility(item.def_id).is_public() { om.foreigns.push((item, renamed)); } } diff --git a/src/librustdoc/visit_lib.rs b/src/librustdoc/visit_lib.rs index 3e98ba08fb9..791f7ff437c 100644 --- a/src/librustdoc/visit_lib.rs +++ b/src/librustdoc/visit_lib.rs @@ -2,7 +2,7 @@ use rustc_data_structures::fx::FxHashSet; use rustc_hir::def::{DefKind, Res}; use rustc_hir::def_id::{CrateNum, DefId, CRATE_DEF_INDEX}; use rustc_middle::middle::privacy::{AccessLevel, AccessLevels}; -use rustc_middle::ty::{TyCtxt, Visibility}; +use rustc_middle::ty::TyCtxt; use rustc_span::symbol::sym; use crate::clean::{AttributesExt, NestedAttributesExt}; @@ -59,7 +59,7 @@ impl<'a, 'tcx> LibEmbargoVisitor<'a, 'tcx> { for item in self.tcx.item_children(def_id).iter() { if let Some(def_id) = item.res.opt_def_id() { if self.tcx.def_key(def_id).parent.map_or(false, |d| d == def_id.index) - || item.vis == Visibility::Public + || item.vis.is_public() { self.visit_item(item.res); } @@ -70,7 +70,7 @@ impl<'a, 'tcx> LibEmbargoVisitor<'a, 'tcx> { fn visit_item(&mut self, res: Res<!>) { let def_id = res.def_id(); let vis = self.tcx.visibility(def_id); - let inherited_item_level = if vis == Visibility::Public { self.prev_level } else { None }; + let inherited_item_level = if vis.is_public() { self.prev_level } else { None }; let item_level = self.update(def_id, inherited_item_level); |
