about summary refs log tree commit diff
diff options
context:
space:
mode:
authormitaa <mitaa.ceb@gmail.com>2016-02-26 01:45:24 +0100
committermitaa <mitaa.ceb@gmail.com>2016-02-26 15:56:46 +0100
commiteae9f4636cda0b1f9b2c23afbb03deccdb0b8ad1 (patch)
tree897e13d654dded20799d3c691126eed26bdd940d
parentc9852e2e550306a738653a5d4d16cab43454776f (diff)
downloadrust-eae9f4636cda0b1f9b2c23afbb03deccdb0b8ad1.tar.gz
rust-eae9f4636cda0b1f9b2c23afbb03deccdb0b8ad1.zip
Don't inline impls from `doc(hidden)` modules
-rw-r--r--src/librustdoc/clean/inline.rs27
-rw-r--r--src/test/auxiliary/issue-29584.rs18
-rw-r--r--src/test/rustdoc/issue-29584.rs18
3 files changed, 52 insertions, 11 deletions
diff --git a/src/librustdoc/clean/inline.rs b/src/librustdoc/clean/inline.rs
index 9eac2fd41fa..8f878264769 100644
--- a/src/librustdoc/clean/inline.rs
+++ b/src/librustdoc/clean/inline.rs
@@ -260,6 +260,11 @@ pub fn build_impls(cx: &DocContext, tcx: &ty::ctxt,
             match def {
                 cstore::DlImpl(did) => build_impl(cx, tcx, did, impls),
                 cstore::DlDef(Def::Mod(did)) => {
+                    // Don't recurse if this is a #[doc(hidden)] module
+                    if load_attrs(cx, tcx, did).iter().any(|a| is_doc_hidden(a)) {
+                        return;
+                    }
+
                     for item in tcx.sess.cstore.item_children(did) {
                         populate_impls(cx, tcx, item.def, impls)
                     }
@@ -423,19 +428,19 @@ pub fn build_impl(cx: &DocContext,
         deprecation: stability::lookup_deprecation(tcx, did).clean(cx),
         def_id: did,
     });
+}
 
-    fn is_doc_hidden(a: &clean::Attribute) -> bool {
-        match *a {
-            clean::List(ref name, ref inner) if *name == "doc" => {
-                inner.iter().any(|a| {
-                    match *a {
-                        clean::Word(ref s) => *s == "hidden",
-                        _ => false,
-                    }
-                })
-            }
-            _ => false
+fn is_doc_hidden(a: &clean::Attribute) -> bool {
+    match *a {
+        clean::List(ref name, ref inner) if *name == "doc" => {
+            inner.iter().any(|a| {
+                match *a {
+                    clean::Word(ref s) => *s == "hidden",
+                    _ => false,
+                }
+            })
         }
+        _ => false
     }
 }
 
diff --git a/src/test/auxiliary/issue-29584.rs b/src/test/auxiliary/issue-29584.rs
new file mode 100644
index 00000000000..4a9e6126fc6
--- /dev/null
+++ b/src/test/auxiliary/issue-29584.rs
@@ -0,0 +1,18 @@
+// 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 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+pub struct Foo;
+
+#[doc(hidden)]
+mod bar {
+    trait Bar {}
+
+    impl Bar for ::Foo {}
+}
diff --git a/src/test/rustdoc/issue-29584.rs b/src/test/rustdoc/issue-29584.rs
new file mode 100644
index 00000000000..0b5ef7fca8e
--- /dev/null
+++ b/src/test/rustdoc/issue-29584.rs
@@ -0,0 +1,18 @@
+// 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 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+// aux-build:issue-29584.rs
+// ignore-cross-compile
+
+extern crate issue_29584;
+
+// @has issue_29584/struct.Foo.html
+// @!has - 'impl Bar for'
+pub use issue_29584::Foo;