about summary refs log tree commit diff
diff options
context:
space:
mode:
authorAlex Crichton <alex@alexcrichton.com>2015-04-06 19:21:52 -0700
committerAlex Crichton <alex@alexcrichton.com>2015-04-07 17:54:34 -0700
commit8f6855c8c8e22efeea2f5766c2b653b674b1c9cf (patch)
treeee3beb5349565755b09eb0a5f92da1a16b90e0da
parentba402312fed8134a9919bbb79bcd9978b92e4dee (diff)
downloadrust-8f6855c8c8e22efeea2f5766c2b653b674b1c9cf.tar.gz
rust-8f6855c8c8e22efeea2f5766c2b653b674b1c9cf.zip
rustdoc: Render methods/impls for bare traits
This renders a "Methods" and "Trait Implementations" section for each item
implemented for a bare trait itself.

Closes #19055
-rw-r--r--src/librustdoc/html/render.rs67
-rw-r--r--src/test/rustdoc/issue-19055.rs30
2 files changed, 65 insertions, 32 deletions
diff --git a/src/librustdoc/html/render.rs b/src/librustdoc/html/render.rs
index 418256d4723..85f538e7dc3 100644
--- a/src/librustdoc/html/render.rs
+++ b/src/librustdoc/html/render.rs
@@ -920,9 +920,10 @@ impl DocFolder for Cache {
                         let path = match self.paths.get(&did) {
                             Some(&(_, ItemType::Trait)) =>
                                 Some(&self.stack[..self.stack.len() - 1]),
-                            // The current stack not necessarily has correlation for
-                            // where the type was defined. On the other hand,
-                            // `paths` always has the right information if present.
+                            // The current stack not necessarily has correlation
+                            // for where the type was defined. On the other
+                            // hand, `paths` always has the right
+                            // information if present.
                             Some(&(ref fqp, ItemType::Struct)) |
                             Some(&(ref fqp, ItemType::Enum)) =>
                                 Some(&fqp[..fqp.len() - 1]),
@@ -1861,6 +1862,9 @@ fn item_trait(w: &mut fmt::Formatter, cx: &Context, it: &clean::Item,
         try!(write!(w, "</div>"));
     }
 
+    // If there are methods directly on this trait object, render them here.
+    try!(render_methods(w, it));
+
     let cache = cache();
     try!(write!(w, "
         <h2 id='implementors'>Implementors</h2>
@@ -2179,37 +2183,36 @@ enum MethodLink {
 }
 
 fn render_methods(w: &mut fmt::Formatter, it: &clean::Item) -> fmt::Result {
-    match cache().impls.get(&it.def_id) {
-        Some(v) => {
-            let (non_trait, traits): (Vec<_>, _) = v.iter().cloned()
-                .partition(|i| i.impl_.trait_.is_none());
-            if non_trait.len() > 0 {
-                try!(write!(w, "<h2 id='methods'>Methods</h2>"));
-                for i in &non_trait {
-                    try!(render_impl(w, i, MethodLink::Anchor));
-                }
-            }
-            if traits.len() > 0 {
-                try!(write!(w, "<h2 id='implementations'>Trait \
-                                  Implementations</h2>"));
-                let (derived, manual): (Vec<_>, _) = traits.into_iter()
-                    .partition(|i| i.impl_.derived);
-                for i in &manual {
-                    let did = i.trait_did().unwrap();
-                    try!(render_impl(w, i, MethodLink::GotoSource(did)));
-                }
-                if derived.len() > 0 {
-                    try!(write!(w, "<h3 id='derived_implementations'>\
-                        Derived Implementations \
-                    </h3>"));
-                    for i in &derived {
-                        let did = i.trait_did().unwrap();
-                        try!(render_impl(w, i, MethodLink::GotoSource(did)));
-                    }
-                }
+    let v = match cache().impls.get(&it.def_id) {
+        Some(v) => v.clone(),
+        None => return Ok(()),
+    };
+    let (non_trait, traits): (Vec<_>, _) = v.into_iter()
+        .partition(|i| i.impl_.trait_.is_none());
+    if non_trait.len() > 0 {
+        try!(write!(w, "<h2 id='methods'>Methods</h2>"));
+        for i in &non_trait {
+            try!(render_impl(w, i, MethodLink::Anchor));
+        }
+    }
+    if traits.len() > 0 {
+        try!(write!(w, "<h2 id='implementations'>Trait \
+                          Implementations</h2>"));
+        let (derived, manual): (Vec<_>, _) = traits.into_iter()
+            .partition(|i| i.impl_.derived);
+        for i in &manual {
+            let did = i.trait_did().unwrap();
+            try!(render_impl(w, i, MethodLink::GotoSource(did)));
+        }
+        if derived.len() > 0 {
+            try!(write!(w, "<h3 id='derived_implementations'>\
+                Derived Implementations \
+            </h3>"));
+            for i in &derived {
+                let did = i.trait_did().unwrap();
+                try!(render_impl(w, i, MethodLink::GotoSource(did)));
             }
         }
-        None => {}
     }
     Ok(())
 }
diff --git a/src/test/rustdoc/issue-19055.rs b/src/test/rustdoc/issue-19055.rs
new file mode 100644
index 00000000000..609ae22be10
--- /dev/null
+++ b/src/test/rustdoc/issue-19055.rs
@@ -0,0 +1,30 @@
+// Copyright 2015 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.
+
+// @has issue_19055/trait.Any.html
+pub trait Any {}
+
+impl<'any> Any + 'any {
+    // @has - '//*[@id="method.is"]' 'fn is'
+    pub fn is<T: 'static>(&self) -> bool { loop {} }
+
+    // @has - '//*[@id="method.downcast_ref"]' 'fn downcast_ref'
+    pub fn downcast_ref<T: 'static>(&self) -> Option<&T> { loop {} }
+
+    // @has - '//*[@id="method.downcast_mut"]' 'fn downcast_mut'
+    pub fn downcast_mut<T: 'static>(&mut self) -> Option<&mut T> { loop {} }
+}
+
+pub trait Foo {
+    fn foo(&self) {}
+}
+
+// @has - '//*[@id="method.foo"]' 'fn foo'
+impl Foo for Any {}