@@ -57,7 +57,7 @@ use clean;
57
57
use doctree;
58
58
use fold:: DocFolder ;
59
59
use html:: format:: { VisSpace , Method , FnStyleSpace , MutableSpace , Stability } ;
60
- use html:: format:: { ConciseStability , WhereClause } ;
60
+ use html:: format:: { ConciseStability , TyParamBounds , WhereClause } ;
61
61
use html:: highlight;
62
62
use html:: item_type:: { ItemType , shortty} ;
63
63
use html:: item_type;
@@ -1654,27 +1654,23 @@ fn item_trait(w: &mut fmt::Formatter, cx: &Context, it: &clean::Item,
1654
1654
t. generics,
1655
1655
bounds,
1656
1656
WhereClause ( & t. generics) ) ) ;
1657
- let required = t. items . iter ( )
1658
- . filter ( |m| {
1659
- match * * m {
1660
- clean:: RequiredMethod ( _) => true ,
1661
- _ => false ,
1662
- }
1663
- } )
1664
- . collect :: < Vec < & clean:: TraitMethod > > ( ) ;
1665
- let provided = t. items . iter ( )
1666
- . filter ( |m| {
1667
- match * * m {
1668
- clean:: ProvidedMethod ( _) => true ,
1669
- _ => false ,
1670
- }
1671
- } )
1672
- . collect :: < Vec < & clean:: TraitMethod > > ( ) ;
1657
+
1658
+ let types = t. items . iter ( ) . filter ( |m| m. is_type ( ) ) . collect :: < Vec < _ > > ( ) ;
1659
+ let required = t. items . iter ( ) . filter ( |m| m. is_req ( ) ) . collect :: < Vec < _ > > ( ) ;
1660
+ let provided = t. items . iter ( ) . filter ( |m| m. is_def ( ) ) . collect :: < Vec < _ > > ( ) ;
1673
1661
1674
1662
if t. items . len ( ) == 0 {
1675
1663
try!( write ! ( w, "{{ }}" ) ) ;
1676
1664
} else {
1677
1665
try!( write ! ( w, "{{\n " ) ) ;
1666
+ for t in types. iter ( ) {
1667
+ try!( write ! ( w, " " ) ) ;
1668
+ try!( render_method ( w, t. item ( ) ) ) ;
1669
+ try!( write ! ( w, ";\n " ) ) ;
1670
+ }
1671
+ if types. len ( ) > 0 && required. len ( ) > 0 {
1672
+ try!( w. write ( "\n " . as_bytes ( ) ) ) ;
1673
+ }
1678
1674
for m in required. iter ( ) {
1679
1675
try!( write ! ( w, " " ) ) ;
1680
1676
try!( render_method ( w, m. item ( ) ) ) ;
@@ -1707,6 +1703,17 @@ fn item_trait(w: &mut fmt::Formatter, cx: &Context, it: &clean::Item,
1707
1703
Ok ( ( ) )
1708
1704
}
1709
1705
1706
+ if types. len ( ) > 0 {
1707
+ try!( write ! ( w, "
1708
+ <h2 id='associated-types'>Associated Types</h2>
1709
+ <div class='methods'>
1710
+ " ) ) ;
1711
+ for t in types. iter ( ) {
1712
+ try!( trait_item ( w, * t) ) ;
1713
+ }
1714
+ try!( write ! ( w, "</div>" ) ) ;
1715
+ }
1716
+
1710
1717
// Output the documentation for each function individually
1711
1718
if required. len ( ) > 0 {
1712
1719
try!( write ! ( w, "
@@ -1761,7 +1768,7 @@ fn item_trait(w: &mut fmt::Formatter, cx: &Context, it: &clean::Item,
1761
1768
}
1762
1769
1763
1770
fn render_method ( w : & mut fmt:: Formatter , meth : & clean:: Item ) -> fmt:: Result {
1764
- fn fun ( w : & mut fmt:: Formatter , it : & clean:: Item , fn_style : ast:: FnStyle ,
1771
+ fn method ( w : & mut fmt:: Formatter , it : & clean:: Item , fn_style : ast:: FnStyle ,
1765
1772
g : & clean:: Generics , selfty : & clean:: SelfTy ,
1766
1773
d : & clean:: FnDecl ) -> fmt:: Result {
1767
1774
write ! ( w, "{}fn <a href='#{ty}.{name}' class='fnname'>{name}</a>\
@@ -1776,14 +1783,28 @@ fn render_method(w: &mut fmt::Formatter, meth: &clean::Item) -> fmt::Result {
1776
1783
decl = Method ( selfty, d) ,
1777
1784
where_clause = WhereClause ( g) )
1778
1785
}
1786
+ fn assoc_type ( w : & mut fmt:: Formatter , it : & clean:: Item ,
1787
+ typ : & clean:: TyParam ) -> fmt:: Result {
1788
+ try!( write ! ( w, "type {}" , it. name. as_ref( ) . unwrap( ) ) ) ;
1789
+ if typ. bounds . len ( ) > 0 {
1790
+ try!( write ! ( w, ": {}" , TyParamBounds ( & * typ. bounds) ) )
1791
+ }
1792
+ if let Some ( ref default) = typ. default {
1793
+ try!( write ! ( w, " = {}" , default ) ) ;
1794
+ }
1795
+ Ok ( ( ) )
1796
+ }
1779
1797
match meth. inner {
1780
1798
clean:: TyMethodItem ( ref m) => {
1781
- fun ( w, meth, m. fn_style , & m. generics , & m. self_ , & m. decl )
1799
+ method ( w, meth, m. fn_style , & m. generics , & m. self_ , & m. decl )
1782
1800
}
1783
1801
clean:: MethodItem ( ref m) => {
1784
- fun ( w, meth, m. fn_style , & m. generics , & m. self_ , & m. decl )
1802
+ method ( w, meth, m. fn_style , & m. generics , & m. self_ , & m. decl )
1785
1803
}
1786
- _ => unreachable ! ( )
1804
+ clean:: AssociatedTypeItem ( ref typ) => {
1805
+ assoc_type ( w, meth, typ)
1806
+ }
1807
+ _ => panic ! ( "render_method called on non-method" )
1787
1808
}
1788
1809
}
1789
1810
@@ -2040,11 +2061,26 @@ fn render_impl(w: &mut fmt::Formatter, i: &Impl) -> fmt::Result {
2040
2061
2041
2062
fn doctraititem ( w : & mut fmt:: Formatter , item : & clean:: Item , dox : bool )
2042
2063
-> fmt:: Result {
2043
- try!( write ! ( w, "<h4 id='method.{}' class='method'>{}<code>" ,
2044
- * item. name. as_ref( ) . unwrap( ) ,
2045
- ConciseStability ( & item. stability) ) ) ;
2046
- try!( render_method ( w, item) ) ;
2047
- try!( write ! ( w, "</code></h4>\n " ) ) ;
2064
+ match item. inner {
2065
+ clean:: MethodItem ( ..) => {
2066
+ try!( write ! ( w, "<h4 id='method.{}' class='{}'>{}<code>" ,
2067
+ * item. name. as_ref( ) . unwrap( ) ,
2068
+ shortty( item) ,
2069
+ ConciseStability ( & item. stability) ) ) ;
2070
+ try!( render_method ( w, item) ) ;
2071
+ try!( write ! ( w, "</code></h4>\n " ) ) ;
2072
+ }
2073
+ clean:: TypedefItem ( ref tydef) => {
2074
+ let name = item. name . as_ref ( ) . unwrap ( ) ;
2075
+ try!( write ! ( w, "<h4 id='assoc_type.{}' class='{}'>{}<code>" ,
2076
+ * name,
2077
+ shortty( item) ,
2078
+ ConciseStability ( & item. stability) ) ) ;
2079
+ try!( write ! ( w, "type {} = {}" , name, tydef. type_) ) ;
2080
+ try!( write ! ( w, "</code></h4>\n " ) ) ;
2081
+ }
2082
+ _ => panic ! ( "unknown trait item with name {}" , item. name)
2083
+ }
2048
2084
match item. doc_value ( ) {
2049
2085
Some ( s) if dox => {
2050
2086
try!( write ! ( w, "<div class='docblock'>{}</div>" , Markdown ( s) ) ) ;
@@ -2054,7 +2090,7 @@ fn render_impl(w: &mut fmt::Formatter, i: &Impl) -> fmt::Result {
2054
2090
}
2055
2091
}
2056
2092
2057
- try!( write ! ( w, "<div class='impl-methods '>" ) ) ;
2093
+ try!( write ! ( w, "<div class='impl-items '>" ) ) ;
2058
2094
for trait_item in i. impl_ . items . iter ( ) {
2059
2095
try!( doctraititem ( w, trait_item, true ) ) ;
2060
2096
}
@@ -2076,6 +2112,8 @@ fn render_impl(w: &mut fmt::Formatter, i: &Impl) -> fmt::Result {
2076
2112
2077
2113
// If we've implemented a trait, then also emit documentation for all
2078
2114
// default methods which weren't overridden in the implementation block.
2115
+ // FIXME: this also needs to be done for associated types, whenever defaults
2116
+ // for them work.
2079
2117
match i. impl_ . trait_ {
2080
2118
Some ( clean:: ResolvedPath { did, .. } ) => {
2081
2119
try!( {
0 commit comments