@@ -41,7 +41,7 @@ use std::collections::{BTreeMap, HashMap, HashSet};
41
41
use std:: default:: Default ;
42
42
use std:: error;
43
43
use std:: fmt:: { self , Display , Formatter } ;
44
- use std:: fs:: { self , File } ;
44
+ use std:: fs:: { self , File , OpenOptions } ;
45
45
use std:: io:: prelude:: * ;
46
46
use std:: io:: { self , BufWriter , BufReader } ;
47
47
use std:: iter:: repeat;
@@ -1409,11 +1409,23 @@ impl Context {
1409
1409
self . render_item ( & mut buf, & item, true ) . unwrap ( ) ;
1410
1410
// buf will be empty if the item is stripped and there is no redirect for it
1411
1411
if !buf. is_empty ( ) {
1412
- let joint_dst = self . dst . join ( & item_path ( item_type ( & item) ,
1413
- item. name . as_ref ( ) . unwrap ( ) ) ) ;
1412
+ let name = item. name . as_ref ( ) . unwrap ( ) ;
1413
+ let item_type = item_type ( & item) ;
1414
+ let file_name = & item_path ( item_type, name) ;
1415
+ let joint_dst = self . dst . join ( file_name) ;
1414
1416
try_err ! ( fs:: create_dir_all( & self . dst) , & self . dst) ;
1415
1417
let mut dst = try_err ! ( File :: create( & joint_dst) , & joint_dst) ;
1416
1418
try_err ! ( dst. write_all( & buf) , & joint_dst) ;
1419
+
1420
+ // Redirect from a sane URL using the namespace to Rustdoc's
1421
+ // URL for the page.
1422
+ let redir_name = format ! ( "{}.{}.html" , name, item_type. name_space( ) ) ;
1423
+ let redir_dst = self . dst . join ( redir_name) ;
1424
+ if let Ok ( mut redirect_out) = OpenOptions :: new ( ) . create_new ( true )
1425
+ . write ( true )
1426
+ . open ( & redir_dst) {
1427
+ try_err ! ( layout:: redirect( & mut redirect_out, file_name) , & redir_dst) ;
1428
+ }
1417
1429
}
1418
1430
}
1419
1431
Ok ( ( ) )
@@ -2270,9 +2282,12 @@ fn item_struct(w: &mut fmt::Formatter, cx: &Context, it: &clean::Item,
2270
2282
if fields. peek ( ) . is_some ( ) {
2271
2283
write ! ( w, "<h2 class='fields'>Fields</h2>" ) ?;
2272
2284
for ( field, ty) in fields {
2273
- write ! ( w, "<span id='{item_type}.{name}' class='{item_type}'><code>{name}: {ty}</code>
2274
- </span><span class='stab {stab}'></span>" ,
2285
+ write ! ( w, "<span id='{item_type}.{name}' class='{item_type}'>
2286
+ <a id='{name}.{name_space}'>
2287
+ <code>{name}: {ty}</code>
2288
+ </a></span><span class='stab {stab}'></span>" ,
2275
2289
item_type = ItemType :: StructField ,
2290
+ name_space = ItemType :: StructField . name_space( ) ,
2276
2291
stab = field. stability_class( ) ,
2277
2292
name = field. name. as_ref( ) . unwrap( ) ,
2278
2293
ty = ty) ?;
@@ -2341,8 +2356,10 @@ fn item_enum(w: &mut fmt::Formatter, cx: &Context, it: &clean::Item,
2341
2356
if !e. variants . is_empty ( ) {
2342
2357
write ! ( w, "<h2 class='variants'>Variants</h2>\n " ) ?;
2343
2358
for variant in & e. variants {
2344
- write ! ( w, "<span id='{item_type}.{name}' class='variant'><code>{name}" ,
2359
+ write ! ( w, "<span id='{item_type}.{name}' class='variant'>\
2360
+ <a id='{name}.{name_space}'><code>{name}",
2345
2361
item_type = ItemType :: Variant ,
2362
+ name_space = ItemType :: Variant . name_space( ) ,
2346
2363
name = variant. name. as_ref( ) . unwrap( ) ) ?;
2347
2364
if let clean:: VariantItem ( ref var) = variant. inner {
2348
2365
if let clean:: TupleVariant ( ref tys) = var. kind {
@@ -2356,7 +2373,7 @@ fn item_enum(w: &mut fmt::Formatter, cx: &Context, it: &clean::Item,
2356
2373
write ! ( w, ")" ) ?;
2357
2374
}
2358
2375
}
2359
- write ! ( w, "</code></span>" ) ?;
2376
+ write ! ( w, "</code></a></ span>" ) ?;
2360
2377
document ( w, cx, variant) ?;
2361
2378
2362
2379
use clean:: { Variant , StructVariant } ;
@@ -2368,9 +2385,12 @@ fn item_enum(w: &mut fmt::Formatter, cx: &Context, it: &clean::Item,
2368
2385
if let StructFieldItem ( ref ty) = field. inner {
2369
2386
write ! ( w, "<tr><td \
2370
2387
id='variant.{v}.field.{f}'>\
2371
- <code>{f}: {t}</code></td><td>",
2388
+ <a id='{v}.{vns}.{f}.{fns}'>\
2389
+ <code>{f}: {t}</code></a></td><td>",
2372
2390
v = variant. name. as_ref( ) . unwrap( ) ,
2373
2391
f = field. name. as_ref( ) . unwrap( ) ,
2392
+ vns = ItemType :: Variant . name_space( ) ,
2393
+ fns = ItemType :: StructField . name_space( ) ,
2374
2394
t = * ty) ?;
2375
2395
document ( w, cx, field) ?;
2376
2396
write ! ( w, "</td></tr>" ) ?;
@@ -2605,36 +2625,41 @@ fn render_impl(w: &mut fmt::Formatter, cx: &Context, i: &Impl, link: AssocItemLi
2605
2625
if !is_static || render_static {
2606
2626
let id = derive_id ( format ! ( "{}.{}" , item_type, name) ) ;
2607
2627
write ! ( w, "<h4 id='{}' class='{}'>" , id, item_type) ?;
2628
+ write ! ( w, "<a id='{}.{}'>" , name, item_type. name_space( ) ) ?;
2608
2629
write ! ( w, "<code>" ) ?;
2609
2630
render_assoc_item ( w, item, link. anchor ( & id) ) ?;
2610
2631
write ! ( w, "</code>" ) ?;
2611
2632
render_stability_since_raw ( w, item. stable_since ( ) , outer_version) ?;
2612
- write ! ( w, "</h4>\n " ) ?;
2633
+ write ! ( w, "</a></ h4>\n " ) ?;
2613
2634
}
2614
2635
}
2615
2636
clean:: TypedefItem ( ref tydef, _) => {
2616
2637
let id = derive_id ( format ! ( "{}.{}" , ItemType :: AssociatedType , name) ) ;
2617
- write ! ( w, "<h4 id='{}' class='{}'><code>" , id, item_type) ?;
2638
+ write ! ( w, "<h4 id='{}' class='{}'>" , id, item_type) ?;
2639
+ write ! ( w, "<a id='{}.{}'><code>" , name, item_type. name_space( ) ) ?;
2618
2640
assoc_type ( w, item, & Vec :: new ( ) , Some ( & tydef. type_ ) , link. anchor ( & id) ) ?;
2619
- write ! ( w, "</code></h4>\n " ) ?;
2641
+ write ! ( w, "</code></a></ h4>\n " ) ?;
2620
2642
}
2621
2643
clean:: AssociatedConstItem ( ref ty, ref default) => {
2622
2644
let id = derive_id ( format ! ( "{}.{}" , item_type, name) ) ;
2623
- write ! ( w, "<h4 id='{}' class='{}'><code>" , id, item_type) ?;
2645
+ write ! ( w, "<h4 id='{}' class='{}'>" , id, item_type) ?;
2646
+ write ! ( w, "<a id='{}.{}'><code>" , name, item_type. name_space( ) ) ?;
2624
2647
assoc_const ( w, item, ty, default. as_ref ( ) , link. anchor ( & id) ) ?;
2625
- write ! ( w, "</code></h4>\n " ) ?;
2648
+ write ! ( w, "</code></a></ h4>\n " ) ?;
2626
2649
}
2627
2650
clean:: ConstantItem ( ref c) => {
2628
2651
let id = derive_id ( format ! ( "{}.{}" , item_type, name) ) ;
2629
- write ! ( w, "<h4 id='{}' class='{}'><code>" , id, item_type) ?;
2652
+ write ! ( w, "<h4 id='{}' class='{}'>" , id, item_type) ?;
2653
+ write ! ( w, "<a id='{}.{}'><code>" , name, item_type. name_space( ) ) ?;
2630
2654
assoc_const ( w, item, & c. type_ , Some ( & c. expr ) , link. anchor ( & id) ) ?;
2631
- write ! ( w, "</code></h4>\n " ) ?;
2655
+ write ! ( w, "</code></a></ h4>\n " ) ?;
2632
2656
}
2633
2657
clean:: AssociatedTypeItem ( ref bounds, ref default) => {
2634
2658
let id = derive_id ( format ! ( "{}.{}" , item_type, name) ) ;
2635
- write ! ( w, "<h4 id='{}' class='{}'><code>" , id, item_type) ?;
2659
+ write ! ( w, "<h4 id='{}' class='{}'>" , id, item_type) ?;
2660
+ write ! ( w, "<a id='{}.{}'><code>" , name, item_type. name_space( ) ) ?;
2636
2661
assoc_type ( w, item, bounds, default. as_ref ( ) , link. anchor ( & id) ) ?;
2637
- write ! ( w, "</code></h4>\n " ) ?;
2662
+ write ! ( w, "</code></a></ h4>\n " ) ?;
2638
2663
}
2639
2664
clean:: StrippedItem ( ..) => return Ok ( ( ) ) ,
2640
2665
_ => panic ! ( "can't make docs for trait item with name {:?}" , item. name)
0 commit comments