@@ -59,7 +59,7 @@ use clean;
59
59
use doctree;
60
60
use fold:: DocFolder ;
61
61
use html:: format:: { VisSpace , Method , FnStyleSpace , MutableSpace , Stability } ;
62
- use html:: format:: { ConciseStability , WhereClause } ;
62
+ use html:: format:: { ConciseStability , TyParamBounds , WhereClause } ;
63
63
use html:: highlight;
64
64
use html:: item_type:: { ItemType , shortty} ;
65
65
use html:: item_type;
@@ -1685,27 +1685,23 @@ fn item_trait(w: &mut fmt::Formatter, cx: &Context, it: &clean::Item,
1685
1685
t. generics,
1686
1686
bounds,
1687
1687
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 < _ > > ( ) ;
1704
1692
1705
1693
if t. items . len ( ) == 0 {
1706
1694
try!( write ! ( w, "{{ }}" ) ) ;
1707
1695
} else {
1708
1696
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
+ }
1709
1705
for m in required. iter ( ) {
1710
1706
try!( write ! ( w, " " ) ) ;
1711
1707
try!( render_method ( w, m. item ( ) ) ) ;
@@ -1738,6 +1734,17 @@ fn item_trait(w: &mut fmt::Formatter, cx: &Context, it: &clean::Item,
1738
1734
Ok ( ( ) )
1739
1735
}
1740
1736
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
+
1741
1748
// Output the documentation for each function individually
1742
1749
if required. len ( ) > 0 {
1743
1750
try!( write ! ( w, "
@@ -1792,7 +1799,7 @@ fn item_trait(w: &mut fmt::Formatter, cx: &Context, it: &clean::Item,
1792
1799
}
1793
1800
1794
1801
fn 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 ,
1796
1803
g : & clean:: Generics , selfty : & clean:: SelfTy ,
1797
1804
d : & clean:: FnDecl ) -> fmt:: Result {
1798
1805
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 {
1807
1814
decl = Method ( selfty, d) ,
1808
1815
where_clause = WhereClause ( g) )
1809
1816
}
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
+ }
1810
1828
match meth. inner {
1811
1829
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 )
1813
1831
}
1814
1832
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 )
1816
1834
}
1817
- _ => unreachable ! ( )
1835
+ clean:: AssociatedTypeItem ( ref typ) => {
1836
+ assoc_type ( w, meth, typ)
1837
+ }
1838
+ _ => panic ! ( "render_method called on non-method" )
1818
1839
}
1819
1840
}
1820
1841
@@ -2071,11 +2092,26 @@ fn render_impl(w: &mut fmt::Formatter, i: &Impl) -> fmt::Result {
2071
2092
2072
2093
fn doctraititem ( w : & mut fmt:: Formatter , item : & clean:: Item , dox : bool )
2073
2094
-> 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
+ }
2079
2115
match item. doc_value ( ) {
2080
2116
Some ( s) if dox => {
2081
2117
try!( write ! ( w, "<div class='docblock'>{}</div>" , Markdown ( s) ) ) ;
@@ -2085,7 +2121,7 @@ fn render_impl(w: &mut fmt::Formatter, i: &Impl) -> fmt::Result {
2085
2121
}
2086
2122
}
2087
2123
2088
- try!( write ! ( w, "<div class='impl-methods '>" ) ) ;
2124
+ try!( write ! ( w, "<div class='impl-items '>" ) ) ;
2089
2125
for trait_item in i. impl_ . items . iter ( ) {
2090
2126
try!( doctraititem ( w, trait_item, true ) ) ;
2091
2127
}
@@ -2107,6 +2143,8 @@ fn render_impl(w: &mut fmt::Formatter, i: &Impl) -> fmt::Result {
2107
2143
2108
2144
// If we've implemented a trait, then also emit documentation for all
2109
2145
// 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.
2110
2148
match i. impl_ . trait_ {
2111
2149
Some ( clean:: ResolvedPath { did, .. } ) => {
2112
2150
try!( {
0 commit comments