From a7c467418fe552762dfff1be5405c35ef7407f38 Mon Sep 17 00:00:00 2001 From: Oliver Middleton Date: Tue, 7 Jun 2016 01:20:12 +0100 Subject: [PATCH] rustdoc: Don't inline #[doc(hidden)] pub use Currently if a `#[doc(hidden)] pub use` item is inlined the `hidden` attribute is ignored so the item can appear in the docs. By never inlining such imports, they can be stripped. --- src/librustdoc/clean/mod.rs | 4 +++- src/librustdoc/visit_ast.rs | 4 +++- src/test/rustdoc/inline_cross/hidden-use.rs | 22 +++++++++++++++++++++ src/test/rustdoc/inline_local/hidden-use.rs | 20 +++++++++++++++++++ 4 files changed, 48 insertions(+), 2 deletions(-) create mode 100644 src/test/rustdoc/inline_cross/hidden-use.rs create mode 100644 src/test/rustdoc/inline_local/hidden-use.rs diff --git a/src/librustdoc/clean/mod.rs b/src/librustdoc/clean/mod.rs index d7b4ad1128c..4c14176d3dd 100644 --- a/src/librustdoc/clean/mod.rs +++ b/src/librustdoc/clean/mod.rs @@ -2389,9 +2389,11 @@ impl Clean> for doctree::Import { // We consider inlining the documentation of `pub use` statements, but we // 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 denied = self.vis != hir::Public || self.attrs.iter().any(|a| { &a.name()[..] == "doc" && match a.meta_item_list() { - Some(l) => attr::contains_name(l, "no_inline"), + Some(l) => attr::contains_name(l, "no_inline") || + attr::contains_name(l, "hidden"), None => false, } }); diff --git a/src/librustdoc/visit_ast.rs b/src/librustdoc/visit_ast.rs index d5309d74334..a5ab806d149 100644 --- a/src/librustdoc/visit_ast.rs +++ b/src/librustdoc/visit_ast.rs @@ -245,7 +245,9 @@ impl<'a, 'tcx> RustdocVisitor<'a, 'tcx> { let def_did = def.def_id(); let use_attrs = tcx.map.attrs(id).clean(self.cx); - let is_no_inline = use_attrs.list("doc").has_word("no_inline"); + // Don't inline doc(hidden) imports so they can be stripped at a later stage. + let is_no_inline = use_attrs.list("doc").has_word("no_inline") || + use_attrs.list("doc").has_word("hidden"); // For cross-crate impl inlining we need to know whether items are // reachable in documentation - a previously nonreachable item can be diff --git a/src/test/rustdoc/inline_cross/hidden-use.rs b/src/test/rustdoc/inline_cross/hidden-use.rs new file mode 100644 index 00000000000..dd668c20362 --- /dev/null +++ b/src/test/rustdoc/inline_cross/hidden-use.rs @@ -0,0 +1,22 @@ +// Copyright 2016 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +// aux-build:rustdoc-hidden.rs +// build-aux-docs +// ignore-cross-compile + +extern crate rustdoc_hidden; + +// @has hidden_use/index.html +// @!has - 'rustdoc_hidden' +// @!has - 'Bar' +// @!has hidden_use/struct.Bar.html +#[doc(hidden)] +pub use rustdoc_hidden::Bar; diff --git a/src/test/rustdoc/inline_local/hidden-use.rs b/src/test/rustdoc/inline_local/hidden-use.rs new file mode 100644 index 00000000000..1b1dafcf58b --- /dev/null +++ b/src/test/rustdoc/inline_local/hidden-use.rs @@ -0,0 +1,20 @@ +// Copyright 2016 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +mod private { + pub struct Foo {} +} + +// @has hidden_use/index.html +// @!has - 'private' +// @!has - 'Foo' +// @!has hidden_use/struct.Foo.html +#[doc(hidden)] +pub use private::Foo;