@@ -1965,33 +1965,33 @@ fn item_trait(w: &mut fmt::Formatter, cx: &Context, it: &clean::Item,
1965
1965
} else {
1966
1966
// FIXME: we should be using a derived_id for the Anchors here
1967
1967
write ! ( w, "{{\n " ) ?;
1968
- for t in & types {
1968
+ for ty in & types {
1969
1969
write ! ( w, " " ) ?;
1970
- render_assoc_item ( w, t , AssocItemLink :: Anchor ( None ) ) ?;
1970
+ render_assoc_item ( w, ty , AssocItemLink :: Anchor ( None ) , it , Some ( t ) ) ?;
1971
1971
write ! ( w, ";\n " ) ?;
1972
1972
}
1973
1973
if !types. is_empty ( ) && !consts. is_empty ( ) {
1974
1974
w. write_str ( "\n " ) ?;
1975
1975
}
1976
- for t in & consts {
1976
+ for ty in & consts {
1977
1977
write ! ( w, " " ) ?;
1978
- render_assoc_item ( w, t , AssocItemLink :: Anchor ( None ) ) ?;
1978
+ render_assoc_item ( w, ty , AssocItemLink :: Anchor ( None ) , it , Some ( t ) ) ?;
1979
1979
write ! ( w, ";\n " ) ?;
1980
1980
}
1981
1981
if !consts. is_empty ( ) && !required. is_empty ( ) {
1982
1982
w. write_str ( "\n " ) ?;
1983
1983
}
1984
1984
for m in & required {
1985
1985
write ! ( w, " " ) ?;
1986
- render_assoc_item ( w, m, AssocItemLink :: Anchor ( None ) ) ?;
1986
+ render_assoc_item ( w, m, AssocItemLink :: Anchor ( None ) , it , Some ( t ) ) ?;
1987
1987
write ! ( w, ";\n " ) ?;
1988
1988
}
1989
1989
if !required. is_empty ( ) && !provided. is_empty ( ) {
1990
1990
w. write_str ( "\n " ) ?;
1991
1991
}
1992
1992
for m in & provided {
1993
1993
write ! ( w, " " ) ?;
1994
- render_assoc_item ( w, m, AssocItemLink :: Anchor ( None ) ) ?;
1994
+ render_assoc_item ( w, m, AssocItemLink :: Anchor ( None ) , it , Some ( t ) ) ?;
1995
1995
write ! ( w, " {{ ... }}\n " ) ?;
1996
1996
}
1997
1997
write ! ( w, "}}" ) ?;
@@ -2001,16 +2001,17 @@ fn item_trait(w: &mut fmt::Formatter, cx: &Context, it: &clean::Item,
2001
2001
// Trait documentation
2002
2002
document ( w, cx, it) ?;
2003
2003
2004
- fn trait_item ( w : & mut fmt:: Formatter , cx : & Context , m : & clean:: Item , t : & clean:: Item )
2004
+ fn trait_item ( w : & mut fmt:: Formatter , cx : & Context , m : & clean:: Item , item : & clean:: Item ,
2005
+ t : & clean:: Trait )
2005
2006
-> fmt:: Result {
2006
2007
let name = m. name . as_ref ( ) . unwrap ( ) ;
2007
2008
let id = derive_id ( format ! ( "{}.{}" , shortty( m) , name) ) ;
2008
2009
write ! ( w, "<h3 id='{id}' class='method stab {stab}'><code>" ,
2009
2010
id = id,
2010
2011
stab = m. stability_class( ) ) ?;
2011
- render_assoc_item ( w, m, AssocItemLink :: Anchor ( Some ( & id) ) ) ?;
2012
+ render_assoc_item ( w, m, AssocItemLink :: Anchor ( Some ( & id) ) , item , Some ( t ) ) ?;
2012
2013
write ! ( w, "</code>" ) ?;
2013
- render_stability_since ( w, m, t ) ?;
2014
+ render_stability_since ( w, m, item ) ?;
2014
2015
write ! ( w, "</h3>" ) ?;
2015
2016
document ( w, cx, m) ?;
2016
2017
Ok ( ( ) )
@@ -2021,8 +2022,8 @@ fn item_trait(w: &mut fmt::Formatter, cx: &Context, it: &clean::Item,
2021
2022
<h2 id='associated-types'>Associated Types</h2>
2022
2023
<div class='methods'>
2023
2024
" ) ?;
2024
- for t in & types {
2025
- trait_item ( w, cx, * t , it) ?;
2025
+ for ty in & types {
2026
+ trait_item ( w, cx, * ty , it, t ) ?;
2026
2027
}
2027
2028
write ! ( w, "</div>" ) ?;
2028
2029
}
@@ -2032,8 +2033,8 @@ fn item_trait(w: &mut fmt::Formatter, cx: &Context, it: &clean::Item,
2032
2033
<h2 id='associated-const'>Associated Constants</h2>
2033
2034
<div class='methods'>
2034
2035
" ) ?;
2035
- for t in & consts {
2036
- trait_item ( w, cx, * t , it) ?;
2036
+ for ty in & consts {
2037
+ trait_item ( w, cx, * ty , it, t ) ?;
2037
2038
}
2038
2039
write ! ( w, "</div>" ) ?;
2039
2040
}
@@ -2045,7 +2046,7 @@ fn item_trait(w: &mut fmt::Formatter, cx: &Context, it: &clean::Item,
2045
2046
<div class='methods'>
2046
2047
" ) ?;
2047
2048
for m in & required {
2048
- trait_item ( w, cx, * m, it) ?;
2049
+ trait_item ( w, cx, * m, it, t ) ?;
2049
2050
}
2050
2051
write ! ( w, "</div>" ) ?;
2051
2052
}
@@ -2055,7 +2056,7 @@ fn item_trait(w: &mut fmt::Formatter, cx: &Context, it: &clean::Item,
2055
2056
<div class='methods'>
2056
2057
" ) ?;
2057
2058
for m in & provided {
2058
- trait_item ( w, cx, * m, it) ?;
2059
+ trait_item ( w, cx, * m, it, t ) ?;
2059
2060
}
2060
2061
write ! ( w, "</div>" ) ?;
2061
2062
}
@@ -2165,18 +2166,23 @@ fn render_stability_since(w: &mut fmt::Formatter,
2165
2166
2166
2167
fn render_assoc_item ( w : & mut fmt:: Formatter ,
2167
2168
item : & clean:: Item ,
2168
- link : AssocItemLink ) -> fmt:: Result {
2169
+ link : AssocItemLink ,
2170
+ c : & clean:: Item ,
2171
+ trait_ : Option < & clean:: Trait > ) -> fmt:: Result {
2169
2172
fn method ( w : & mut fmt:: Formatter ,
2170
2173
meth : & clean:: Item ,
2171
2174
unsafety : hir:: Unsafety ,
2172
2175
constness : hir:: Constness ,
2173
2176
abi : abi:: Abi ,
2174
2177
g : & clean:: Generics ,
2175
2178
d : & clean:: FnDecl ,
2176
- link : AssocItemLink )
2179
+ link : AssocItemLink ,
2180
+ trait_ : Option < & clean:: Trait > ,
2181
+ item : & clean:: Item )
2177
2182
-> fmt:: Result {
2178
2183
let name = meth. name . as_ref ( ) . unwrap ( ) ;
2179
2184
let anchor = format ! ( "#{}.{}" , shortty( meth) , name) ;
2185
+ let mut d = d. clone ( ) ;
2180
2186
let href = match link {
2181
2187
AssocItemLink :: Anchor ( Some ( ref id) ) => format ! ( "#{}" , id) ,
2182
2188
AssocItemLink :: Anchor ( None ) => anchor,
@@ -2197,6 +2203,69 @@ fn render_assoc_item(w: &mut fmt::Formatter,
2197
2203
UnstableFeatures :: Allow => constness,
2198
2204
_ => hir:: Constness :: NotConst
2199
2205
} ;
2206
+ if let Some ( trait_) = trait_ {
2207
+ if ( item. is_struct ( ) || item. is_enum ( ) ) &&
2208
+ d. inputs . values . iter ( ) . any ( |ref x| {
2209
+ match x. type_ {
2210
+ clean:: Type :: BorrowedRef { ref type_, .. } => {
2211
+ match * type_. clone ( ) {
2212
+ clean:: Type :: Generic ( _) => true ,
2213
+ _ => false ,
2214
+ }
2215
+ }
2216
+ clean:: Type :: Generic ( _) => true ,
2217
+ _ => false ,
2218
+ }
2219
+ } ) {
2220
+ let generics = & trait_. generics ;
2221
+ let values = d. inputs . values . clone ( ) ;
2222
+
2223
+ d. inputs . values = values. iter ( ) . map ( |ref x| {
2224
+ let mut new_v = None ;
2225
+ match x. type_ {
2226
+ clean:: Type :: BorrowedRef { ref type_, ref mutability, ref lifetime } => {
2227
+ match * type_. clone ( ) {
2228
+ clean:: Type :: Generic ( ref name) => {
2229
+ for ty in generics. type_params . iter ( ) {
2230
+ if & ty. name == name &&
2231
+ ty. default == Some ( clean:: Type :: Generic ( "Self"
2232
+ . to_owned ( ) ) ) {
2233
+ if let Some ( resolved) = item. to_resolved_path ( ) {
2234
+ new_v = Some (
2235
+ clean:: Type :: BorrowedRef {
2236
+ type_ : Box :: new ( resolved) ,
2237
+ mutability : mutability. clone ( ) ,
2238
+ lifetime : lifetime. clone ( ) ,
2239
+ } ) ;
2240
+ }
2241
+ break ;
2242
+ }
2243
+ }
2244
+ }
2245
+ _ => { } ,
2246
+ }
2247
+ }
2248
+ clean:: Type :: Generic ( ref name) => {
2249
+ for ty in generics. type_params . iter ( ) {
2250
+ if & ty. name == name &&
2251
+ ty. default == Some ( clean:: Type :: Generic ( "Self" . to_owned ( ) ) ) {
2252
+ if let Some ( resolved) = item. to_resolved_path ( ) {
2253
+ new_v = Some ( resolved) ;
2254
+ }
2255
+ break ;
2256
+ }
2257
+ }
2258
+ }
2259
+ _ => { }
2260
+ }
2261
+ let mut x = ( * x) . clone ( ) ;
2262
+ if let Some ( n) = new_v {
2263
+ x. type_ = n;
2264
+ }
2265
+ x
2266
+ } ) . collect ( ) ;
2267
+ }
2268
+ }
2200
2269
write ! ( w, "{}{}{}fn <a href='{href}' class='fnname'>{name}</a>\
2201
2270
{generics}{decl}{where_clause}",
2202
2271
ConstnessSpace ( vis_constness) ,
@@ -2205,19 +2274,19 @@ fn render_assoc_item(w: &mut fmt::Formatter,
2205
2274
href = href,
2206
2275
name = name,
2207
2276
generics = * g,
2208
- decl = Method ( d) ,
2277
+ decl = Method ( & d) ,
2209
2278
where_clause = WhereClause ( g) )
2210
2279
}
2211
2280
match item. inner {
2212
2281
clean:: StrippedItem ( ..) => Ok ( ( ) ) ,
2213
2282
clean:: TyMethodItem ( ref m) => {
2214
2283
method ( w, item, m. unsafety , hir:: Constness :: NotConst ,
2215
- m. abi , & m. generics , & m. decl , link)
2284
+ m. abi , & m. generics , & m. decl , link, trait_ , c )
2216
2285
}
2217
2286
clean:: MethodItem ( ref m) => {
2218
2287
method ( w, item, m. unsafety , m. constness ,
2219
2288
m. abi , & m. generics , & m. decl ,
2220
- link)
2289
+ link, trait_ , c )
2221
2290
}
2222
2291
clean:: AssociatedConstItem ( ref ty, ref default) => {
2223
2292
assoc_const ( w, item, ty, default. as_ref ( ) , link)
@@ -2481,7 +2550,7 @@ fn render_assoc_items(w: &mut fmt::Formatter,
2481
2550
} ;
2482
2551
for i in & non_trait {
2483
2552
render_impl ( w, cx, i, AssocItemLink :: Anchor ( None ) , render_header,
2484
- containing_item. stable_since ( ) ) ?;
2553
+ containing_item) ?;
2485
2554
}
2486
2555
}
2487
2556
if let AssocItemRender :: DerefFor { .. } = what {
@@ -2502,7 +2571,7 @@ fn render_assoc_items(w: &mut fmt::Formatter,
2502
2571
for i in & manual {
2503
2572
let did = i. trait_did ( ) . unwrap ( ) ;
2504
2573
let assoc_link = AssocItemLink :: GotoSource ( did, & i. inner_impl ( ) . provided_trait_methods ) ;
2505
- render_impl ( w, cx, i, assoc_link, true , containing_item. stable_since ( ) ) ?;
2574
+ render_impl ( w, cx, i, assoc_link, true , containing_item) ?;
2506
2575
}
2507
2576
if !derived. is_empty ( ) {
2508
2577
write ! ( w, "<h3 id='derived_implementations'>\
@@ -2512,7 +2581,7 @@ fn render_assoc_items(w: &mut fmt::Formatter,
2512
2581
let did = i. trait_did ( ) . unwrap ( ) ;
2513
2582
let assoc_link = AssocItemLink :: GotoSource ( did,
2514
2583
& i. inner_impl ( ) . provided_trait_methods ) ;
2515
- render_impl ( w, cx, i, assoc_link, true , containing_item. stable_since ( ) ) ?;
2584
+ render_impl ( w, cx, i, assoc_link, true , containing_item) ?;
2516
2585
}
2517
2586
}
2518
2587
}
@@ -2546,7 +2615,8 @@ fn render_deref_methods(w: &mut fmt::Formatter, cx: &Context, impl_: &Impl,
2546
2615
// otherwise. If render_header is false, we will avoid rendering static
2547
2616
// methods, since they are not accessible for the type implementing `Deref`
2548
2617
fn render_impl ( w : & mut fmt:: Formatter , cx : & Context , i : & Impl , link : AssocItemLink ,
2549
- render_header : bool , outer_version : Option < & str > ) -> fmt:: Result {
2618
+ render_header : bool , item : & clean:: Item ) -> fmt:: Result {
2619
+ let outer_version = item. stable_since ( ) ;
2550
2620
if render_header {
2551
2621
write ! ( w, "<h3 class='impl'><span class='in-band'><code>{}</code>" , i. inner_impl( ) ) ?;
2552
2622
write ! ( w, "</span><span class='out-of-band'>" ) ?;
@@ -2570,7 +2640,8 @@ fn render_impl(w: &mut fmt::Formatter, cx: &Context, i: &Impl, link: AssocItemLi
2570
2640
fn doctraititem ( w : & mut fmt:: Formatter , cx : & Context , item : & clean:: Item ,
2571
2641
link : AssocItemLink , render_static : bool ,
2572
2642
is_default_item : bool , outer_version : Option < & str > ,
2573
- trait_ : Option < & clean:: Trait > ) -> fmt:: Result {
2643
+ trait_ : Option < & clean:: Trait > ,
2644
+ i : & clean:: Item ) -> fmt:: Result {
2574
2645
let shortty = shortty ( item) ;
2575
2646
let name = item. name . as_ref ( ) . unwrap ( ) ;
2576
2647
@@ -2587,7 +2658,7 @@ fn render_impl(w: &mut fmt::Formatter, cx: &Context, i: &Impl, link: AssocItemLi
2587
2658
let id = derive_id ( format ! ( "{}.{}" , shortty, name) ) ;
2588
2659
write ! ( w, "<h4 id='{}' class='{}'>" , id, shortty) ?;
2589
2660
write ! ( w, "<code>" ) ?;
2590
- render_assoc_item ( w, item, link. anchor ( & id) ) ?;
2661
+ render_assoc_item ( w, item, link. anchor ( & id) , i , trait_ ) ?;
2591
2662
write ! ( w, "</code>" ) ?;
2592
2663
render_stability_since_raw ( w, item. stable_since ( ) , outer_version) ?;
2593
2664
write ! ( w, "</h4>\n " ) ?;
@@ -2649,15 +2720,17 @@ fn render_impl(w: &mut fmt::Formatter, cx: &Context, i: &Impl, link: AssocItemLi
2649
2720
write ! ( w, "<div class='impl-items'>" ) ?;
2650
2721
for trait_item in & i. inner_impl ( ) . items {
2651
2722
doctraititem ( w, cx, trait_item, link, render_header,
2652
- false , outer_version, trait_) ?;
2723
+ false , outer_version, trait_, item ) ?;
2653
2724
}
2654
2725
2655
2726
fn render_default_items ( w : & mut fmt:: Formatter ,
2656
2727
cx : & Context ,
2657
2728
t : & clean:: Trait ,
2658
2729
i : & clean:: Impl ,
2659
2730
render_static : bool ,
2660
- outer_version : Option < & str > ) -> fmt:: Result {
2731
+ outer_version : Option < & str > ,
2732
+ trait_ : & clean:: Trait ,
2733
+ item : & clean:: Item ) -> fmt:: Result {
2661
2734
for trait_item in & t. items {
2662
2735
let n = trait_item. name . clone ( ) ;
2663
2736
if i. items . iter ( ) . find ( |m| m. name == n) . is_some ( ) {
@@ -2667,15 +2740,16 @@ fn render_impl(w: &mut fmt::Formatter, cx: &Context, i: &Impl, link: AssocItemLi
2667
2740
let assoc_link = AssocItemLink :: GotoSource ( did, & i. provided_trait_methods ) ;
2668
2741
2669
2742
doctraititem ( w, cx, trait_item, assoc_link, render_static, true ,
2670
- outer_version, None ) ?;
2743
+ outer_version, Some ( trait_ ) , item ) ?;
2671
2744
}
2672
2745
Ok ( ( ) )
2673
2746
}
2674
2747
2675
2748
// If we've implemented a trait, then also emit documentation for all
2676
2749
// default items which weren't overridden in the implementation block.
2677
2750
if let Some ( t) = trait_ {
2678
- render_default_items ( w, cx, t, & i. inner_impl ( ) , render_header, outer_version) ?;
2751
+ render_default_items ( w, cx, t, & i. inner_impl ( ) , render_header, outer_version,
2752
+ & t, item) ?;
2679
2753
}
2680
2754
write ! ( w, "</div>" ) ?;
2681
2755
Ok ( ( ) )
0 commit comments