diff --git a/src/librustdoc/clean.rs b/src/librustdoc/clean.rs index b0554c21bf92e..0bc3da15462ad 100644 --- a/src/librustdoc/clean.rs +++ b/src/librustdoc/clean.rs @@ -174,12 +174,18 @@ pub enum ItemEnum { StaticItem(Static), TraitItem(Trait), ImplItem(Impl), + /// `use` and `extern crate` ViewItemItem(ViewItem), + /// A method signature only. Used for required methods in traits (ie, + /// non-default-methods). TyMethodItem(TyMethod), + /// A method with a body. MethodItem(Method), StructFieldItem(StructField), VariantItem(Variant), + /// `fn`s from an extern block ForeignFunctionItem(Function), + /// `static`s from an extern block ForeignStaticItem(Static), MacroItem(Macro), } @@ -1014,11 +1020,23 @@ pub struct Impl { generics: Generics, trait_: Option<Type>, for_: Type, - methods: Vec<Item> , + methods: Vec<Item>, + derived: bool, } impl Clean<Item> for doctree::Impl { fn clean(&self) -> Item { + let mut derived = false; + for attr in self.attrs.iter() { + match attr.node.value.node { + ast::MetaWord(ref s) => { + if s.get() == "automatically_derived" { + derived = true; + } + } + _ => {} + } + } Item { name: None, attrs: self.attrs.clean(), @@ -1030,6 +1048,7 @@ impl Clean<Item> for doctree::Impl { trait_: self.trait_.clean(), for_: self.for_.clean(), methods: self.methods.clean(), + derived: derived, }), } } diff --git a/src/librustdoc/html/layout.rs b/src/librustdoc/html/layout.rs index 317571ebc3ff6..095f27d25b350 100644 --- a/src/librustdoc/html/layout.rs +++ b/src/librustdoc/html/layout.rs @@ -29,53 +29,53 @@ pub fn render<T: fmt::Show, S: fmt::Show>( -> fmt::Result { write!(dst, -"<!DOCTYPE html> -<html lang=\"en\"> +r##"<!DOCTYPE html> +<html lang="en"> <head> - <meta charset=\"utf-8\" /> + <meta charset="utf-8" /> <title>{title}</title> <link href='http://fonts.googleapis.com/css?family=Oswald:700|Inconsolata:400,700' rel='stylesheet' type='text/css'> - <link rel=\"stylesheet\" type=\"text/css\" href=\"{root_path}main.css\"> + <link rel="stylesheet" type="text/css" href="{root_path}main.css"> - {favicon, select, none{} other{<link rel=\"shortcut icon\" href=\"#\" />}} + {favicon, select, none{} other{<link rel="shortcut icon" href="\#" />}} </head> <body> <!--[if lte IE 8]> - <div class=\"warning\"> + <div class="warning"> This old browser is unsupported and will most likely display funky things. </div> <![endif]--> - <section class=\"sidebar\"> + <section class="sidebar"> {logo, select, none{} other{ - <a href='{root_path}{krate}/index.html'><img src='#' alt=''/></a> + <a href='{root_path}{krate}/index.html'><img src='\#' alt=''/></a> }} {sidebar} </section> - <nav class=\"sub\"> - <form class=\"search-form js-only\"> - <button class=\"do-search\">Search</button> - <div class=\"search-container\"> - <input class=\"search-input\" name=\"search\" - autocomplete=\"off\" - placeholder=\"Search documentation...\" - type=\"search\" /> + <nav class="sub"> + <form class="search-form js-only"> + <button class="do-search">Search</button> + <div class="search-container"> + <input class="search-input" name="search" + autocomplete="off" + placeholder="Search documentation..." + type="search" /> </div> </form> </nav> - <section id='main' class=\"content {ty}\">{content}</section> - <section id='search' class=\"content hidden\"></section> + <section id='main' class="content {ty}">{content}</section> + <section id='search' class="content hidden"></section> - <section class=\"footer\"></section> + <section class="footer"></section> - <div id=\"help\" class=\"hidden\"> - <div class=\"shortcuts\"> + <div id="help" class="hidden"> + <div class="shortcuts"> <h1>Keyboard shortcuts</h1> <dl> <dt>?</dt> @@ -86,11 +86,11 @@ pub fn render<T: fmt::Show, S: fmt::Show>( <dd>Move up in search results</dd> <dt>↓</dt> <dd>Move down in search results</dd> - <dt>&\\#9166;</dt> + <dt>&\#9166;</dt> <dd>Go to active search result</dd> </dl> </div> - <div class=\"infos\"> + <div class="infos"> <h1>Search tricks</h1> <p> Prefix searches with a type followed by a colon (e.g. @@ -106,15 +106,15 @@ pub fn render<T: fmt::Show, S: fmt::Show>( </div> <script> - var rootPath = \"{root_path}\"; - var currentCrate = \"{krate}\"; + var rootPath = "{root_path}"; + var currentCrate = "{krate}"; </script> - <script src=\"{root_path}jquery.js\"></script> - <script src=\"{root_path}main.js\"></script> - <script async src=\"{root_path}search-index.js\"></script> + <script src="{root_path}jquery.js"></script> + <script src="{root_path}main.js"></script> + <script async src="{root_path}search-index.js"></script> </body> </html> -", +"##, content = *t, root_path = page.root_path, ty = page.ty, diff --git a/src/librustdoc/html/render.rs b/src/librustdoc/html/render.rs index 66b965633a0d9..0f4e1284e7403 100644 --- a/src/librustdoc/html/render.rs +++ b/src/librustdoc/html/render.rs @@ -1517,8 +1517,22 @@ fn render_methods(w: &mut Writer, it: &clean::Item) -> fmt::Result { if traits.len() > 0 { try!(write!(w, "<h2 id='implementations'>Trait \ Implementations</h2>")); - for &(ref i, ref dox) in traits.move_iter() { - try!(render_impl(w, i, dox)); + let mut any_derived = false; + for & &(ref i, ref dox) in traits.iter() { + if !i.derived { + try!(render_impl(w, i, dox)); + } else { + any_derived = true; + } + } + if any_derived { + try!(write!(w, "<h3 id='derived_implementations'>Derived Implementations \ + </h3>")); + for &(ref i, ref dox) in traits.move_iter() { + if i.derived { + try!(render_impl(w, i, dox)); + } + } } } }