@@ -51,26 +51,20 @@ use std::sync::Arc;
51
51
52
52
use externalfiles:: ExternalHtml ;
53
53
54
- use serialize:: json;
55
- use serialize:: json:: ToJson ;
56
- use syntax:: abi;
57
- use syntax:: ast;
58
- use syntax:: ast_util;
59
- use syntax:: attr;
54
+ use serialize:: json:: { self , ToJson } ;
55
+ use syntax:: { abi, ast, ast_util, attr} ;
60
56
use rustc:: util:: nodemap:: NodeSet ;
61
57
62
- use clean;
58
+ use clean:: { self , SelfTy } ;
63
59
use doctree;
64
60
use fold:: DocFolder ;
65
61
use html:: escape:: Escape ;
66
62
use html:: format:: { ConstnessSpace } ;
67
63
use html:: format:: { TyParamBounds , WhereClause , href, AbiSpace } ;
68
64
use html:: format:: { VisSpace , Method , UnsafetySpace , MutableSpace } ;
69
- use html:: highlight;
70
65
use html:: item_type:: ItemType ;
71
- use html:: layout;
72
- use html:: markdown:: Markdown ;
73
- use html:: markdown;
66
+ use html:: markdown:: { self , Markdown } ;
67
+ use html:: { highlight, layout} ;
74
68
75
69
/// A pair of name and its optional document.
76
70
pub type NameDoc = ( String , Option < String > ) ;
@@ -871,7 +865,7 @@ impl DocFolder for Cache {
871
865
clean:: StructItem ( ref s) => self . generics ( & s. generics ) ,
872
866
clean:: EnumItem ( ref e) => self . generics ( & e. generics ) ,
873
867
clean:: FunctionItem ( ref f) => self . generics ( & f. generics ) ,
874
- clean:: TypedefItem ( ref t) => self . generics ( & t. generics ) ,
868
+ clean:: TypedefItem ( ref t, _ ) => self . generics ( & t. generics ) ,
875
869
clean:: TraitItem ( ref t) => self . generics ( & t. generics ) ,
876
870
clean:: ImplItem ( ref i) => self . generics ( & i. generics ) ,
877
871
clean:: TyMethodItem ( ref i) => self . generics ( & i. generics ) ,
@@ -937,6 +931,10 @@ impl DocFolder for Cache {
937
931
( ( Some ( * last) , path) , true )
938
932
}
939
933
}
934
+ clean:: TypedefItem ( _, true ) => {
935
+ // skip associated types in impls
936
+ ( ( None , None ) , false )
937
+ }
940
938
_ => ( ( None , Some ( & * self . stack ) ) , false )
941
939
} ;
942
940
let hidden_field = match item. inner {
@@ -1498,7 +1496,7 @@ impl<'a> fmt::Display for Item<'a> {
1498
1496
clean:: TraitItem ( ref t) => item_trait ( fmt, self . cx , self . item , t) ,
1499
1497
clean:: StructItem ( ref s) => item_struct ( fmt, self . item , s) ,
1500
1498
clean:: EnumItem ( ref e) => item_enum ( fmt, self . item , e) ,
1501
- clean:: TypedefItem ( ref t) => item_typedef ( fmt, self . item , t) ,
1499
+ clean:: TypedefItem ( ref t, _ ) => item_typedef ( fmt, self . item , t) ,
1502
1500
clean:: MacroItem ( ref m) => item_macro ( fmt, self . item , m) ,
1503
1501
clean:: PrimitiveItem ( ref p) => item_primitive ( fmt, self . item , p) ,
1504
1502
clean:: StaticItem ( ref i) | clean:: ForeignStaticItem ( ref i) =>
@@ -2310,10 +2308,10 @@ fn render_deref_methods(w: &mut fmt::Formatter, impl_: &Impl) -> fmt::Result {
2310
2308
let deref_type = impl_. impl_ . trait_ . as_ref ( ) . unwrap ( ) ;
2311
2309
let target = impl_. impl_ . items . iter ( ) . filter_map ( |item| {
2312
2310
match item. inner {
2313
- clean:: TypedefItem ( ref t) => Some ( & t. type_ ) ,
2311
+ clean:: TypedefItem ( ref t, true ) => Some ( & t. type_ ) ,
2314
2312
_ => None ,
2315
2313
}
2316
- } ) . next ( ) . unwrap ( ) ;
2314
+ } ) . next ( ) . expect ( "Expected associated type binding" ) ;
2317
2315
let what = AssocItemRender :: DerefFor { trait_ : deref_type, type_ : target } ;
2318
2316
match * target {
2319
2317
clean:: ResolvedPath { did, .. } => render_assoc_items ( w, did, what) ,
@@ -2329,6 +2327,9 @@ fn render_deref_methods(w: &mut fmt::Formatter, impl_: &Impl) -> fmt::Result {
2329
2327
}
2330
2328
}
2331
2329
2330
+ // Render_header is false when we are rendering a `Deref` impl and true
2331
+ // otherwise. If render_header is false, we will avoid rendering static
2332
+ // methods, since they are not accessible for the type implementing `Deref`
2332
2333
fn render_impl ( w : & mut fmt:: Formatter , i : & Impl , link : AssocItemLink ,
2333
2334
render_header : bool ) -> fmt:: Result {
2334
2335
if render_header {
@@ -2348,16 +2349,19 @@ fn render_impl(w: &mut fmt::Formatter, i: &Impl, link: AssocItemLink,
2348
2349
}
2349
2350
2350
2351
fn doctraititem ( w : & mut fmt:: Formatter , item : & clean:: Item ,
2351
- link : AssocItemLink ) -> fmt:: Result {
2352
+ link : AssocItemLink , render_static : bool ) -> fmt:: Result {
2352
2353
match item. inner {
2353
2354
clean:: MethodItem ( ..) | clean:: TyMethodItem ( ..) => {
2354
- try!( write ! ( w, "<h4 id='method.{}' class='{}'><code>" ,
2355
- * item. name. as_ref( ) . unwrap( ) ,
2356
- shortty( item) ) ) ;
2355
+ // Only render when the method is not static or we allow static methods
2356
+ if !is_static_method ( item) || render_static {
2357
+ try!( write ! ( w, "<h4 id='method.{}' class='{}'><code>" ,
2358
+ * item. name. as_ref( ) . unwrap( ) ,
2359
+ shortty( item) ) ) ;
2357
2360
try!( render_assoc_item ( w, item, link) ) ;
2358
- try!( write ! ( w, "</code></h4>\n " ) ) ;
2361
+ try!( write ! ( w, "</code></h4>\n " ) ) ;
2362
+ }
2359
2363
}
2360
- clean:: TypedefItem ( ref tydef) => {
2364
+ clean:: TypedefItem ( ref tydef, _ ) => {
2361
2365
let name = item. name . as_ref ( ) . unwrap ( ) ;
2362
2366
try!( write ! ( w, "<h4 id='assoc_type.{}' class='{}'><code>" ,
2363
2367
* name,
@@ -2389,30 +2393,44 @@ fn render_impl(w: &mut fmt::Formatter, i: &Impl, link: AssocItemLink,
2389
2393
}
2390
2394
_ => panic ! ( "can't make docs for trait item with name {:?}" , item. name)
2391
2395
}
2392
- if let AssocItemLink :: Anchor = link {
2393
- document ( w, item)
2396
+
2397
+ return if let AssocItemLink :: Anchor = link {
2398
+ if is_static_method ( item) && !render_static {
2399
+ Ok ( ( ) )
2400
+ } else {
2401
+ document ( w, item)
2402
+ }
2394
2403
} else {
2395
2404
Ok ( ( ) )
2405
+ } ;
2406
+
2407
+ fn is_static_method ( item : & clean:: Item ) -> bool {
2408
+ match item. inner {
2409
+ clean:: MethodItem ( ref method) => method. self_ == SelfTy :: SelfStatic ,
2410
+ clean:: TyMethodItem ( ref method) => method. self_ == SelfTy :: SelfStatic ,
2411
+ _ => false
2412
+ }
2396
2413
}
2397
2414
}
2398
2415
2399
2416
try!( write ! ( w, "<div class='impl-items'>" ) ) ;
2400
2417
for trait_item in i. impl_ . items . iter ( ) {
2401
- try!( doctraititem ( w, trait_item, link) ) ;
2418
+ try!( doctraititem ( w, trait_item, link, render_header ) ) ;
2402
2419
}
2403
2420
2404
2421
fn render_default_items ( w : & mut fmt:: Formatter ,
2405
2422
did : ast:: DefId ,
2406
2423
t : & clean:: Trait ,
2407
- i : & clean:: Impl ) -> fmt:: Result {
2424
+ i : & clean:: Impl ,
2425
+ render_static : bool ) -> fmt:: Result {
2408
2426
for trait_item in & t. items {
2409
2427
let n = trait_item. name . clone ( ) ;
2410
2428
match i. items . iter ( ) . find ( |m| { m. name == n } ) {
2411
2429
Some ( ..) => continue ,
2412
2430
None => { }
2413
2431
}
2414
2432
2415
- try!( doctraititem ( w, trait_item, AssocItemLink :: GotoSource ( did) ) ) ;
2433
+ try!( doctraititem ( w, trait_item, AssocItemLink :: GotoSource ( did) , render_static ) ) ;
2416
2434
}
2417
2435
Ok ( ( ) )
2418
2436
}
@@ -2423,7 +2441,8 @@ fn render_impl(w: &mut fmt::Formatter, i: &Impl, link: AssocItemLink,
2423
2441
// for them work.
2424
2442
if let Some ( clean:: ResolvedPath { did, .. } ) = i. impl_ . trait_ {
2425
2443
if let Some ( t) = cache ( ) . traits . get ( & did) {
2426
- try!( render_default_items ( w, did, t, & i. impl_ ) ) ;
2444
+ try!( render_default_items ( w, did, t, & i. impl_ , render_header) ) ;
2445
+
2427
2446
}
2428
2447
}
2429
2448
try!( write ! ( w, "</div>" ) ) ;
@@ -2432,10 +2451,11 @@ fn render_impl(w: &mut fmt::Formatter, i: &Impl, link: AssocItemLink,
2432
2451
2433
2452
fn item_typedef ( w : & mut fmt:: Formatter , it : & clean:: Item ,
2434
2453
t : & clean:: Typedef ) -> fmt:: Result {
2435
- try!( write ! ( w, "<pre class='rust typedef'>type {}{} = {};</pre>" ,
2454
+ try!( write ! ( w, "<pre class='rust typedef'>type {}{}{where_clause} = {type_ };</pre>" ,
2436
2455
it. name. as_ref( ) . unwrap( ) ,
2437
2456
t. generics,
2438
- t. type_) ) ;
2457
+ where_clause = WhereClause ( & t. generics) ,
2458
+ type_ = t. type_) ) ;
2439
2459
2440
2460
document ( w, it)
2441
2461
}
0 commit comments