diff --git a/src/librustdoc/html/render.rs b/src/librustdoc/html/render.rs
index 418256d4723d..85f538e7dc34 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, ""));
}
+ // If there are methods directly on this trait object, render them here.
+ try!(render_methods(w, it));
+
let cache = cache();
try!(write!(w, "
Implementors
@@ -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, "Methods
"));
- for i in &non_trait {
- try!(render_impl(w, i, MethodLink::Anchor));
- }
- }
- if traits.len() > 0 {
- try!(write!(w, "Trait \
- Implementations
"));
- 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, "\
- Derived Implementations \
-
"));
- 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, "Methods
"));
+ for i in &non_trait {
+ try!(render_impl(w, i, MethodLink::Anchor));
+ }
+ }
+ if traits.len() > 0 {
+ try!(write!(w, "Trait \
+ Implementations
"));
+ 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, "\
+ Derived Implementations \
+
"));
+ 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 000000000000..609ae22be104
--- /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 or the MIT license
+// , 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(&self) -> bool { loop {} }
+
+ // @has - '//*[@id="method.downcast_ref"]' 'fn downcast_ref'
+ pub fn downcast_ref(&self) -> Option<&T> { loop {} }
+
+ // @has - '//*[@id="method.downcast_mut"]' 'fn downcast_mut'
+ pub fn downcast_mut(&mut self) -> Option<&mut T> { loop {} }
+}
+
+pub trait Foo {
+ fn foo(&self) {}
+}
+
+// @has - '//*[@id="method.foo"]' 'fn foo'
+impl Foo for Any {}