Skip to content

Commit

Permalink
rustdoc: Render methods/impls for bare traits
Browse files Browse the repository at this point in the history
This renders a "Methods" and "Trait Implementations" section for each item
implemented for a bare trait itself.

Closes rust-lang#19055
  • Loading branch information
alexcrichton committed Apr 8, 2015
1 parent ba40231 commit 8f6855c
Show file tree
Hide file tree
Showing 2 changed files with 65 additions and 32 deletions.
67 changes: 35 additions & 32 deletions src/librustdoc/html/render.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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]),
Expand Down Expand Up @@ -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>
Expand Down Expand Up @@ -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(())
}
Expand Down
30 changes: 30 additions & 0 deletions src/test/rustdoc/issue-19055.rs
Original file line number Diff line number Diff line change
@@ -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 {}

3 comments on commit 8f6855c

@aturon
Copy link

@aturon aturon commented on 8f6855c Apr 8, 2015

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hm, this does not entirely fix rust-lang#19055 (comment), since clicking on downcast_ref in search results gives you a 404.

@aturon
Copy link

@aturon aturon commented on 8f6855c Apr 8, 2015

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Confirmed that the original issue has been addressed, though. Maybe we should fork off a separate issue for the 404.

@alexcrichton
Copy link
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I have a feeling we think alike sometimes!

Please sign in to comment.