diff options
| author | Alex Crichton <alex@alexcrichton.com> | 2015-04-06 19:21:52 -0700 |
|---|---|---|
| committer | Alex Crichton <alex@alexcrichton.com> | 2015-04-07 17:54:34 -0700 |
| commit | 8f6855c8c8e22efeea2f5766c2b653b674b1c9cf (patch) | |
| tree | ee3beb5349565755b09eb0a5f92da1a16b90e0da | |
| parent | ba402312fed8134a9919bbb79bcd9978b92e4dee (diff) | |
| download | rust-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.rs | 67 | ||||
| -rw-r--r-- | src/test/rustdoc/issue-19055.rs | 30 |
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 {} |
