@@ -62,7 +62,7 @@ use clean;
62
62
use doctree;
63
63
use fold:: DocFolder ;
64
64
use html:: format:: { VisSpace , Method , UnsafetySpace , MutableSpace , Stability } ;
65
- use html:: format:: { ConciseStability , TyParamBounds , WhereClause } ;
65
+ use html:: format:: { ConciseStability , TyParamBounds , WhereClause , href } ;
66
66
use html:: highlight;
67
67
use html:: item_type:: ItemType ;
68
68
use html:: layout;
@@ -137,6 +137,14 @@ pub struct Impl {
137
137
pub stability : Option < clean:: Stability > ,
138
138
}
139
139
140
+ impl Impl {
141
+ fn trait_did ( & self ) -> Option < ast:: DefId > {
142
+ self . impl_ . trait_ . as_ref ( ) . and_then ( |tr| {
143
+ if let clean:: ResolvedPath { did, .. } = * tr { Some ( did) } else { None }
144
+ } )
145
+ }
146
+ }
147
+
140
148
/// This cache is used to store information about the `clean::Crate` being
141
149
/// rendered in order to provide more useful documentation. This contains
142
150
/// information like all implementors of a trait, all traits a type implements,
@@ -277,7 +285,9 @@ impl fmt::Display for IndexItemFunctionType {
277
285
return write ! ( f, "null" )
278
286
}
279
287
280
- let inputs: Vec < String > = self . inputs . iter ( ) . map ( |ref t| format ! ( "{}" , t) ) . collect ( ) ;
288
+ let inputs: Vec < String > = self . inputs . iter ( ) . map ( |ref t| {
289
+ format ! ( "{}" , t)
290
+ } ) . collect ( ) ;
281
291
try!( write ! ( f, "{{\" inputs\" :[{}],\" output\" :" , inputs. connect( "," ) ) ) ;
282
292
283
293
match self . output {
@@ -1780,23 +1790,23 @@ fn item_trait(w: &mut fmt::Formatter, cx: &Context, it: &clean::Item,
1780
1790
try!( write ! ( w, "{{\n " ) ) ;
1781
1791
for t in & types {
1782
1792
try!( write ! ( w, " " ) ) ;
1783
- try!( render_method ( w, t) ) ;
1793
+ try!( render_method ( w, t, MethodLink :: Anchor ) ) ;
1784
1794
try!( write ! ( w, ";\n " ) ) ;
1785
1795
}
1786
1796
if types. len ( ) > 0 && required. len ( ) > 0 {
1787
1797
try!( w. write_str ( "\n " ) ) ;
1788
1798
}
1789
1799
for m in & required {
1790
1800
try!( write ! ( w, " " ) ) ;
1791
- try!( render_method ( w, m) ) ;
1801
+ try!( render_method ( w, m, MethodLink :: Anchor ) ) ;
1792
1802
try!( write ! ( w, ";\n " ) ) ;
1793
1803
}
1794
1804
if required. len ( ) > 0 && provided. len ( ) > 0 {
1795
1805
try!( w. write_str ( "\n " ) ) ;
1796
1806
}
1797
1807
for m in & provided {
1798
1808
try!( write ! ( w, " " ) ) ;
1799
- try!( render_method ( w, m) ) ;
1809
+ try!( render_method ( w, m, MethodLink :: Anchor ) ) ;
1800
1810
try!( write ! ( w, " {{ ... }}\n " ) ) ;
1801
1811
}
1802
1812
try!( write ! ( w, "}}" ) ) ;
@@ -1812,7 +1822,7 @@ fn item_trait(w: &mut fmt::Formatter, cx: &Context, it: &clean::Item,
1812
1822
shortty( m) ,
1813
1823
* m. name. as_ref( ) . unwrap( ) ,
1814
1824
ConciseStability ( & m. stability) ) ) ;
1815
- try!( render_method ( w, m) ) ;
1825
+ try!( render_method ( w, m, MethodLink :: Anchor ) ) ;
1816
1826
try!( write ! ( w, "</code></h3>" ) ) ;
1817
1827
try!( document ( w, m) ) ;
1818
1828
Ok ( ( ) )
@@ -1896,14 +1906,23 @@ fn assoc_type(w: &mut fmt::Formatter, it: &clean::Item,
1896
1906
Ok ( ( ) )
1897
1907
}
1898
1908
1899
- fn render_method ( w : & mut fmt:: Formatter , meth : & clean:: Item ) -> fmt:: Result {
1909
+ fn render_method ( w : & mut fmt:: Formatter , meth : & clean:: Item ,
1910
+ link : MethodLink ) -> fmt:: Result {
1900
1911
fn method ( w : & mut fmt:: Formatter , it : & clean:: Item ,
1901
1912
unsafety : ast:: Unsafety , abi : abi:: Abi ,
1902
1913
g : & clean:: Generics , selfty : & clean:: SelfTy ,
1903
- d : & clean:: FnDecl ) -> fmt:: Result {
1914
+ d : & clean:: FnDecl , link : MethodLink ) -> fmt:: Result {
1904
1915
use syntax:: abi:: Abi ;
1905
1916
1906
- write ! ( w, "{}{}fn <a href='#{ty}.{name}' class='fnname'>{name}</a>\
1917
+ let name = it. name . as_ref ( ) . unwrap ( ) ;
1918
+ let anchor = format ! ( "#{}.{}" , shortty( it) , name) ;
1919
+ let href = match link {
1920
+ MethodLink :: Anchor => anchor,
1921
+ MethodLink :: GotoSource ( did) => {
1922
+ href ( did) . map ( |p| format ! ( "{}{}" , p. 0 , anchor) ) . unwrap_or ( anchor)
1923
+ }
1924
+ } ;
1925
+ write ! ( w, "{}{}fn <a href='{href}' class='fnname'>{name}</a>\
1907
1926
{generics}{decl}{where_clause}",
1908
1927
match unsafety {
1909
1928
ast:: Unsafety :: Unsafe => "unsafe " ,
@@ -1913,18 +1932,20 @@ fn render_method(w: &mut fmt::Formatter, meth: &clean::Item) -> fmt::Result {
1913
1932
Abi :: Rust => String :: new( ) ,
1914
1933
a => format!( "extern {} " , a. to_string( ) )
1915
1934
} ,
1916
- ty = shortty ( it ) ,
1917
- name = it . name. as_ref ( ) . unwrap ( ) ,
1935
+ href = href ,
1936
+ name = name,
1918
1937
generics = * g,
1919
1938
decl = Method ( selfty, d) ,
1920
1939
where_clause = WhereClause ( g) )
1921
1940
}
1922
1941
match meth. inner {
1923
1942
clean:: TyMethodItem ( ref m) => {
1924
- method ( w, meth, m. unsafety , m. abi , & m. generics , & m. self_ , & m. decl )
1943
+ method ( w, meth, m. unsafety , m. abi , & m. generics , & m. self_ , & m. decl ,
1944
+ link)
1925
1945
}
1926
1946
clean:: MethodItem ( ref m) => {
1927
- method ( w, meth, m. unsafety , m. abi , & m. generics , & m. self_ , & m. decl )
1947
+ method ( w, meth, m. unsafety , m. abi , & m. generics , & m. self_ , & m. decl ,
1948
+ link)
1928
1949
}
1929
1950
clean:: AssociatedTypeItem ( ref bounds, ref default) => {
1930
1951
assoc_type ( w, meth, bounds, default)
@@ -2151,6 +2172,12 @@ fn render_struct(w: &mut fmt::Formatter, it: &clean::Item,
2151
2172
Ok ( ( ) )
2152
2173
}
2153
2174
2175
+ #[ derive( Copy , Clone ) ]
2176
+ enum MethodLink {
2177
+ Anchor ,
2178
+ GotoSource ( ast:: DefId ) ,
2179
+ }
2180
+
2154
2181
fn render_methods ( w : & mut fmt:: Formatter , it : & clean:: Item ) -> fmt:: Result {
2155
2182
match cache ( ) . impls . get ( & it. def_id ) {
2156
2183
Some ( v) => {
@@ -2159,7 +2186,7 @@ fn render_methods(w: &mut fmt::Formatter, it: &clean::Item) -> fmt::Result {
2159
2186
if non_trait. len ( ) > 0 {
2160
2187
try!( write ! ( w, "<h2 id='methods'>Methods</h2>" ) ) ;
2161
2188
for i in & non_trait {
2162
- try!( render_impl ( w, i) ) ;
2189
+ try!( render_impl ( w, i, MethodLink :: Anchor ) ) ;
2163
2190
}
2164
2191
}
2165
2192
if traits. len ( ) > 0 {
@@ -2168,13 +2195,16 @@ fn render_methods(w: &mut fmt::Formatter, it: &clean::Item) -> fmt::Result {
2168
2195
let ( derived, manual) : ( Vec < _ > , _ ) = traits. into_iter ( )
2169
2196
. partition ( |i| i. impl_ . derived ) ;
2170
2197
for i in & manual {
2171
- try!( render_impl ( w, i) ) ;
2198
+ let did = i. trait_did ( ) . unwrap ( ) ;
2199
+ try!( render_impl ( w, i, MethodLink :: GotoSource ( did) ) ) ;
2172
2200
}
2173
2201
if derived. len ( ) > 0 {
2174
- try!( write ! ( w, "<h3 id='derived_implementations'>Derived Implementations \
2175
- </h3>") ) ;
2202
+ try!( write ! ( w, "<h3 id='derived_implementations'>\
2203
+ Derived Implementations \
2204
+ </h3>") ) ;
2176
2205
for i in & derived {
2177
- try!( render_impl ( w, i) ) ;
2206
+ let did = i. trait_did ( ) . unwrap ( ) ;
2207
+ try!( render_impl ( w, i, MethodLink :: GotoSource ( did) ) ) ;
2178
2208
}
2179
2209
}
2180
2210
}
@@ -2184,36 +2214,32 @@ fn render_methods(w: &mut fmt::Formatter, it: &clean::Item) -> fmt::Result {
2184
2214
Ok ( ( ) )
2185
2215
}
2186
2216
2187
- fn render_impl ( w : & mut fmt:: Formatter , i : & Impl ) -> fmt:: Result {
2217
+ fn render_impl ( w : & mut fmt:: Formatter , i : & Impl , link : MethodLink )
2218
+ -> fmt:: Result {
2188
2219
try!( write ! ( w, "<h3 class='impl'>{}<code>impl{} " ,
2189
2220
ConciseStability ( & i. stability) ,
2190
2221
i. impl_. generics) ) ;
2191
- match i. impl_ . polarity {
2192
- Some ( clean:: ImplPolarity :: Negative ) => try!( write ! ( w, "!" ) ) ,
2193
- _ => { }
2222
+ if let Some ( clean:: ImplPolarity :: Negative ) = i. impl_ . polarity {
2223
+ try!( write ! ( w, "!" ) ) ;
2194
2224
}
2195
- match i. impl_ . trait_ {
2196
- Some ( ref ty) => try!( write ! ( w, "{} for " , * ty) ) ,
2197
- None => { }
2225
+ if let Some ( ref ty) = i. impl_ . trait_ {
2226
+ try!( write ! ( w, "{} for " , * ty) ) ;
2198
2227
}
2199
- try!( write ! ( w, "{}{}</code></h3>" , i. impl_. for_, WhereClause ( & i. impl_. generics) ) ) ;
2200
- match i. dox {
2201
- Some ( ref dox) => {
2202
- try!( write ! ( w, "<div class='docblock'>{}</div>" ,
2203
- Markdown ( dox) ) ) ;
2204
- }
2205
- None => { }
2228
+ try!( write ! ( w, "{}{}</code></h3>" , i. impl_. for_,
2229
+ WhereClause ( & i. impl_. generics) ) ) ;
2230
+ if let Some ( ref dox) = i. dox {
2231
+ try!( write ! ( w, "<div class='docblock'>{}</div>" , Markdown ( dox) ) ) ;
2206
2232
}
2207
2233
2208
- fn doctraititem ( w : & mut fmt:: Formatter , item : & clean:: Item , dox : bool )
2209
- -> fmt:: Result {
2234
+ fn doctraititem ( w : & mut fmt:: Formatter , item : & clean:: Item ,
2235
+ dox : bool , link : MethodLink ) -> fmt:: Result {
2210
2236
match item. inner {
2211
2237
clean:: MethodItem ( ..) | clean:: TyMethodItem ( ..) => {
2212
2238
try!( write ! ( w, "<h4 id='method.{}' class='{}'>{}<code>" ,
2213
2239
* item. name. as_ref( ) . unwrap( ) ,
2214
2240
shortty( item) ,
2215
2241
ConciseStability ( & item. stability) ) ) ;
2216
- try!( render_method ( w, item) ) ;
2242
+ try!( render_method ( w, item, link ) ) ;
2217
2243
try!( write ! ( w, "</code></h4>\n " ) ) ;
2218
2244
}
2219
2245
clean:: TypedefItem ( ref tydef) => {
@@ -2247,10 +2273,11 @@ fn render_impl(w: &mut fmt::Formatter, i: &Impl) -> fmt::Result {
2247
2273
2248
2274
try!( write ! ( w, "<div class='impl-items'>" ) ) ;
2249
2275
for trait_item in i. impl_ . items . iter ( ) {
2250
- try!( doctraititem ( w, trait_item, true ) ) ;
2276
+ try!( doctraititem ( w, trait_item, true , link ) ) ;
2251
2277
}
2252
2278
2253
2279
fn render_default_methods ( w : & mut fmt:: Formatter ,
2280
+ did : ast:: DefId ,
2254
2281
t : & clean:: Trait ,
2255
2282
i : & clean:: Impl ) -> fmt:: Result {
2256
2283
for trait_item in & t. items {
@@ -2260,7 +2287,8 @@ fn render_impl(w: &mut fmt::Formatter, i: &Impl) -> fmt::Result {
2260
2287
None => { }
2261
2288
}
2262
2289
2263
- try!( doctraititem ( w, trait_item, false ) ) ;
2290
+ try!( doctraititem ( w, trait_item, false ,
2291
+ MethodLink :: GotoSource ( did) ) ) ;
2264
2292
}
2265
2293
Ok ( ( ) )
2266
2294
}
@@ -2271,7 +2299,7 @@ fn render_impl(w: &mut fmt::Formatter, i: &Impl) -> fmt::Result {
2271
2299
// for them work.
2272
2300
if let Some ( clean:: ResolvedPath { did, .. } ) = i. impl_ . trait_ {
2273
2301
if let Some ( t) = cache ( ) . traits . get ( & did) {
2274
- try!( render_default_methods ( w, t, & i. impl_ ) ) ;
2302
+ try!( render_default_methods ( w, did , t, & i. impl_ ) ) ;
2275
2303
}
2276
2304
}
2277
2305
try!( write ! ( w, "</div>" ) ) ;
0 commit comments