@@ -59,7 +59,7 @@ use clean;
5959use doctree;
6060use fold:: DocFolder ;
6161use html:: format:: { VisSpace , Method , FnStyleSpace , MutableSpace , Stability } ;
62- use html:: format:: { ConciseStability , WhereClause } ;
62+ use html:: format:: { ConciseStability , TyParamBounds , WhereClause } ;
6363use html:: highlight;
6464use html:: item_type:: { ItemType , shortty} ;
6565use html:: item_type;
@@ -1685,27 +1685,23 @@ fn item_trait(w: &mut fmt::Formatter, cx: &Context, it: &clean::Item,
16851685 t. generics,
16861686 bounds,
16871687 WhereClause ( & t. generics) ) ) ;
1688- let required = t. items . iter ( )
1689- . filter ( |m| {
1690- match * * m {
1691- clean:: RequiredMethod ( _) => true ,
1692- _ => false ,
1693- }
1694- } )
1695- . collect :: < Vec < & clean:: TraitMethod > > ( ) ;
1696- let provided = t. items . iter ( )
1697- . filter ( |m| {
1698- match * * m {
1699- clean:: ProvidedMethod ( _) => true ,
1700- _ => false ,
1701- }
1702- } )
1703- . collect :: < Vec < & clean:: TraitMethod > > ( ) ;
1688+
1689+ let types = t. items . iter ( ) . filter ( |m| m. is_type ( ) ) . collect :: < Vec < _ > > ( ) ;
1690+ let required = t. items . iter ( ) . filter ( |m| m. is_req ( ) ) . collect :: < Vec < _ > > ( ) ;
1691+ let provided = t. items . iter ( ) . filter ( |m| m. is_def ( ) ) . collect :: < Vec < _ > > ( ) ;
17041692
17051693 if t. items . len ( ) == 0 {
17061694 try!( write ! ( w, "{{ }}" ) ) ;
17071695 } else {
17081696 try!( write ! ( w, "{{\n " ) ) ;
1697+ for t in types. iter ( ) {
1698+ try!( write ! ( w, " " ) ) ;
1699+ try!( render_method ( w, t. item ( ) ) ) ;
1700+ try!( write ! ( w, ";\n " ) ) ;
1701+ }
1702+ if types. len ( ) > 0 && required. len ( ) > 0 {
1703+ try!( w. write ( "\n " . as_bytes ( ) ) ) ;
1704+ }
17091705 for m in required. iter ( ) {
17101706 try!( write ! ( w, " " ) ) ;
17111707 try!( render_method ( w, m. item ( ) ) ) ;
@@ -1738,6 +1734,17 @@ fn item_trait(w: &mut fmt::Formatter, cx: &Context, it: &clean::Item,
17381734 Ok ( ( ) )
17391735 }
17401736
1737+ if types. len ( ) > 0 {
1738+ try!( write ! ( w, "
1739+ <h2 id='associated-types'>Associated Types</h2>
1740+ <div class='methods'>
1741+ " ) ) ;
1742+ for t in types. iter ( ) {
1743+ try!( trait_item ( w, * t) ) ;
1744+ }
1745+ try!( write ! ( w, "</div>" ) ) ;
1746+ }
1747+
17411748 // Output the documentation for each function individually
17421749 if required. len ( ) > 0 {
17431750 try!( write ! ( w, "
@@ -1792,7 +1799,7 @@ fn item_trait(w: &mut fmt::Formatter, cx: &Context, it: &clean::Item,
17921799}
17931800
17941801fn render_method ( w : & mut fmt:: Formatter , meth : & clean:: Item ) -> fmt:: Result {
1795- fn fun ( w : & mut fmt:: Formatter , it : & clean:: Item , fn_style : ast:: FnStyle ,
1802+ fn method ( w : & mut fmt:: Formatter , it : & clean:: Item , fn_style : ast:: FnStyle ,
17961803 g : & clean:: Generics , selfty : & clean:: SelfTy ,
17971804 d : & clean:: FnDecl ) -> fmt:: Result {
17981805 write ! ( w, "{}fn <a href='#{ty}.{name}' class='fnname'>{name}</a>\
@@ -1807,14 +1814,28 @@ fn render_method(w: &mut fmt::Formatter, meth: &clean::Item) -> fmt::Result {
18071814 decl = Method ( selfty, d) ,
18081815 where_clause = WhereClause ( g) )
18091816 }
1817+ fn assoc_type ( w : & mut fmt:: Formatter , it : & clean:: Item ,
1818+ typ : & clean:: TyParam ) -> fmt:: Result {
1819+ try!( write ! ( w, "type {}" , it. name. as_ref( ) . unwrap( ) ) ) ;
1820+ if typ. bounds . len ( ) > 0 {
1821+ try!( write ! ( w, ": {}" , TyParamBounds ( & * typ. bounds) ) )
1822+ }
1823+ if let Some ( ref default) = typ. default {
1824+ try!( write ! ( w, " = {}" , default ) ) ;
1825+ }
1826+ Ok ( ( ) )
1827+ }
18101828 match meth. inner {
18111829 clean:: TyMethodItem ( ref m) => {
1812- fun ( w, meth, m. fn_style , & m. generics , & m. self_ , & m. decl )
1830+ method ( w, meth, m. fn_style , & m. generics , & m. self_ , & m. decl )
18131831 }
18141832 clean:: MethodItem ( ref m) => {
1815- fun ( w, meth, m. fn_style , & m. generics , & m. self_ , & m. decl )
1833+ method ( w, meth, m. fn_style , & m. generics , & m. self_ , & m. decl )
18161834 }
1817- _ => unreachable ! ( )
1835+ clean:: AssociatedTypeItem ( ref typ) => {
1836+ assoc_type ( w, meth, typ)
1837+ }
1838+ _ => panic ! ( "render_method called on non-method" )
18181839 }
18191840}
18201841
@@ -2071,11 +2092,26 @@ fn render_impl(w: &mut fmt::Formatter, i: &Impl) -> fmt::Result {
20712092
20722093 fn doctraititem ( w : & mut fmt:: Formatter , item : & clean:: Item , dox : bool )
20732094 -> fmt:: Result {
2074- try!( write ! ( w, "<h4 id='method.{}' class='method'>{}<code>" ,
2075- * item. name. as_ref( ) . unwrap( ) ,
2076- ConciseStability ( & item. stability) ) ) ;
2077- try!( render_method ( w, item) ) ;
2078- try!( write ! ( w, "</code></h4>\n " ) ) ;
2095+ match item. inner {
2096+ clean:: MethodItem ( ..) | clean:: TyMethodItem ( ..) => {
2097+ try!( write ! ( w, "<h4 id='method.{}' class='{}'>{}<code>" ,
2098+ * item. name. as_ref( ) . unwrap( ) ,
2099+ shortty( item) ,
2100+ ConciseStability ( & item. stability) ) ) ;
2101+ try!( render_method ( w, item) ) ;
2102+ try!( write ! ( w, "</code></h4>\n " ) ) ;
2103+ }
2104+ clean:: TypedefItem ( ref tydef) => {
2105+ let name = item. name . as_ref ( ) . unwrap ( ) ;
2106+ try!( write ! ( w, "<h4 id='assoc_type.{}' class='{}'>{}<code>" ,
2107+ * name,
2108+ shortty( item) ,
2109+ ConciseStability ( & item. stability) ) ) ;
2110+ try!( write ! ( w, "type {} = {}" , name, tydef. type_) ) ;
2111+ try!( write ! ( w, "</code></h4>\n " ) ) ;
2112+ }
2113+ _ => panic ! ( "can't make docs for trait item with name {}" , item. name)
2114+ }
20792115 match item. doc_value ( ) {
20802116 Some ( s) if dox => {
20812117 try!( write ! ( w, "<div class='docblock'>{}</div>" , Markdown ( s) ) ) ;
@@ -2085,7 +2121,7 @@ fn render_impl(w: &mut fmt::Formatter, i: &Impl) -> fmt::Result {
20852121 }
20862122 }
20872123
2088- try!( write ! ( w, "<div class='impl-methods '>" ) ) ;
2124+ try!( write ! ( w, "<div class='impl-items '>" ) ) ;
20892125 for trait_item in i. impl_ . items . iter ( ) {
20902126 try!( doctraititem ( w, trait_item, true ) ) ;
20912127 }
@@ -2107,6 +2143,8 @@ fn render_impl(w: &mut fmt::Formatter, i: &Impl) -> fmt::Result {
21072143
21082144 // If we've implemented a trait, then also emit documentation for all
21092145 // default methods which weren't overridden in the implementation block.
2146+ // FIXME: this also needs to be done for associated types, whenever defaults
2147+ // for them work.
21102148 match i. impl_ . trait_ {
21112149 Some ( clean:: ResolvedPath { did, .. } ) => {
21122150 try!( {
0 commit comments