about summary refs log tree commit diff
diff options
context:
space:
mode:
authorCorey Richardson <corey@octayn.net>2014-03-16 20:00:56 -0400
committerCorey Richardson <corey@octayn.net>2014-03-25 15:32:27 -0400
commit1f937fa79e6f6a4d010b9d22b1370214c952fbfa (patch)
tree6d4d710e6da25565e4608db7c7a087d566243625
parente88387a94709b3bf86c4abf39477be9ffa26c7e8 (diff)
downloadrust-1f937fa79e6f6a4d010b9d22b1370214c952fbfa.tar.gz
rust-1f937fa79e6f6a4d010b9d22b1370214c952fbfa.zip
rustdoc: render derived impls separately
-rw-r--r--src/librustdoc/clean.rs15
-rw-r--r--src/librustdoc/html/render.rs18
2 files changed, 30 insertions, 3 deletions
diff --git a/src/librustdoc/clean.rs b/src/librustdoc/clean.rs
index bb6302b9fb7..0bc3da15462 100644
--- a/src/librustdoc/clean.rs
+++ b/src/librustdoc/clean.rs
@@ -1020,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(),
@@ -1036,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/render.rs b/src/librustdoc/html/render.rs
index 66b965633a0..0f4e1284e74 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));
+                            }
+                        }
                     }
                 }
             }