@@ -49,6 +49,7 @@ use std::sync::Arc;
49
49
50
50
use itertools:: Itertools ;
51
51
use rustc_ast_pretty:: pprust;
52
+ use rustc_attr:: StabilityLevel ;
52
53
use rustc_data_structures:: flock;
53
54
use rustc_data_structures:: fx:: { FxHashMap , FxHashSet } ;
54
55
use rustc_feature:: UnstableFeatures ;
@@ -1984,8 +1985,10 @@ fn item_module(w: &mut Buffer, cx: &Context, item: &clean::Item, items: &[clean:
1984
1985
let s1 = i1. stability . as_ref ( ) . map ( |s| s. level ) ;
1985
1986
let s2 = i2. stability . as_ref ( ) . map ( |s| s. level ) ;
1986
1987
match ( s1, s2) {
1987
- ( Some ( stability:: Unstable ) , Some ( stability:: Stable ) ) => return Ordering :: Greater ,
1988
- ( Some ( stability:: Stable ) , Some ( stability:: Unstable ) ) => return Ordering :: Less ,
1988
+ ( Some ( a) , Some ( b) ) => match a. partial_cmp ( & b) {
1989
+ Some ( Ordering :: Equal ) | None => { }
1990
+ Some ( other) => return other,
1991
+ } ,
1989
1992
_ => { }
1990
1993
}
1991
1994
let lhs = i1. name . as_ref ( ) . map_or ( "" , |s| & * * s) ;
@@ -2150,10 +2153,7 @@ fn stability_tags(item: &clean::Item) -> String {
2150
2153
2151
2154
// The "rustc_private" crates are permanently unstable so it makes no sense
2152
2155
// to render "unstable" everywhere.
2153
- if item
2154
- . stability
2155
- . as_ref ( )
2156
- . map ( |s| s. level == stability:: Unstable && s. feature != "rustc_private" )
2156
+ if item. stability . as_ref ( ) . map ( |s| s. level . is_unstable ( ) && s. feature != sym:: rustc_private)
2157
2157
== Some ( true )
2158
2158
{
2159
2159
tags += & tag_html ( "unstable" , "" , "Experimental" ) ;
@@ -2204,16 +2204,17 @@ fn short_stability(item: &clean::Item, cx: &Context) -> Vec<String> {
2204
2204
2205
2205
// Render unstable items. But don't render "rustc_private" crates (internal compiler crates).
2206
2206
// Those crates are permanently unstable so it makes no sense to render "unstable" everywhere.
2207
- if let Some ( stab ) = item
2207
+ if let Some ( ( StabilityLevel :: Unstable { reason , issue , .. } , feature ) ) = item
2208
2208
. stability
2209
2209
. as_ref ( )
2210
- . filter ( |stab| stab. level == stability:: Unstable && stab. feature != "rustc_private" )
2210
+ . filter ( |stab| stab. feature != sym:: rustc_private)
2211
+ . map ( |stab| ( stab. level , stab. feature ) )
2211
2212
{
2212
2213
let mut message =
2213
2214
"<span class='emoji'>🔬</span> This is a nightly-only experimental API." . to_owned ( ) ;
2214
2215
2215
- let mut feature = format ! ( "<code>{}</code>" , Escape ( & stab . feature) ) ;
2216
- if let ( Some ( url) , Some ( issue) ) = ( & cx. shared . issue_tracker_base_url , stab . issue ) {
2216
+ let mut feature = format ! ( "<code>{}</code>" , Escape ( & feature. as_str ( ) ) ) ;
2217
+ if let ( Some ( url) , Some ( issue) ) = ( & cx. shared . issue_tracker_base_url , issue) {
2217
2218
feature. push_str ( & format ! (
2218
2219
" <a href=\" {url}{issue}\" >#{issue}</a>" ,
2219
2220
url = url,
@@ -2223,13 +2224,13 @@ fn short_stability(item: &clean::Item, cx: &Context) -> Vec<String> {
2223
2224
2224
2225
message. push_str ( & format ! ( " ({})" , feature) ) ;
2225
2226
2226
- if let Some ( unstable_reason) = & stab . unstable_reason {
2227
+ if let Some ( unstable_reason) = reason {
2227
2228
let mut ids = cx. id_map . borrow_mut ( ) ;
2228
2229
message = format ! (
2229
2230
"<details><summary>{}</summary>{}</details>" ,
2230
2231
message,
2231
2232
MarkdownHtml (
2232
- & unstable_reason,
2233
+ & unstable_reason. as_str ( ) ,
2233
2234
& mut ids,
2234
2235
error_codes,
2235
2236
cx. shared. edition,
@@ -2355,7 +2356,7 @@ fn render_implementor(
2355
2356
implementor,
2356
2357
AssocItemLink :: Anchor ( None ) ,
2357
2358
RenderMode :: Normal ,
2358
- implementor. impl_item . stable_since ( ) ,
2359
+ implementor. impl_item . stable_since ( ) . as_deref ( ) ,
2359
2360
false ,
2360
2361
Some ( use_absolute) ,
2361
2362
false ,
@@ -2384,7 +2385,7 @@ fn render_impls(
2384
2385
i,
2385
2386
assoc_link,
2386
2387
RenderMode :: Normal ,
2387
- containing_item. stable_since ( ) ,
2388
+ containing_item. stable_since ( ) . as_deref ( ) ,
2388
2389
true ,
2389
2390
None ,
2390
2391
false ,
@@ -2629,7 +2630,7 @@ fn item_trait(w: &mut Buffer, cx: &Context, it: &clean::Item, t: &clean::Trait,
2629
2630
& implementor,
2630
2631
assoc_link,
2631
2632
RenderMode :: Normal ,
2632
- implementor. impl_item . stable_since ( ) ,
2633
+ implementor. impl_item . stable_since ( ) . as_deref ( ) ,
2633
2634
false ,
2634
2635
None ,
2635
2636
true ,
@@ -2780,7 +2781,11 @@ fn render_stability_since_raw(w: &mut Buffer, ver: Option<&str>, containing_ver:
2780
2781
}
2781
2782
2782
2783
fn render_stability_since ( w : & mut Buffer , item : & clean:: Item , containing_item : & clean:: Item ) {
2783
- render_stability_since_raw ( w, item. stable_since ( ) , containing_item. stable_since ( ) )
2784
+ render_stability_since_raw (
2785
+ w,
2786
+ item. stable_since ( ) . as_deref ( ) ,
2787
+ containing_item. stable_since ( ) . as_deref ( ) ,
2788
+ )
2784
2789
}
2785
2790
2786
2791
fn render_assoc_item (
@@ -3324,7 +3329,7 @@ fn render_assoc_items(
3324
3329
i,
3325
3330
AssocItemLink :: Anchor ( None ) ,
3326
3331
render_mode,
3327
- containing_item. stable_since ( ) ,
3332
+ containing_item. stable_since ( ) . as_deref ( ) ,
3328
3333
true ,
3329
3334
None ,
3330
3335
false ,
@@ -3564,8 +3569,11 @@ fn render_impl(
3564
3569
) ;
3565
3570
}
3566
3571
write ! ( w, "<a href='#{}' class='anchor'></a>" , id) ;
3567
- let since = i. impl_item . stability . as_ref ( ) . map ( |s| & s. since [ ..] ) ;
3568
- render_stability_since_raw ( w, since, outer_version) ;
3572
+ let since = i. impl_item . stability . as_ref ( ) . and_then ( |s| match s. level {
3573
+ StabilityLevel :: Stable { since } => Some ( since. as_str ( ) ) ,
3574
+ StabilityLevel :: Unstable { .. } => None ,
3575
+ } ) ;
3576
+ render_stability_since_raw ( w, since. as_deref ( ) , outer_version) ;
3569
3577
if let Some ( l) = cx. src_href ( & i. impl_item , cache) {
3570
3578
write ! ( w, "<a class='srclink' href='{}' title='{}'>[src]</a>" , l, "goto source code" ) ;
3571
3579
}
@@ -3626,7 +3634,7 @@ fn render_impl(
3626
3634
write ! ( w, "<code>" ) ;
3627
3635
render_assoc_item ( w, item, link. anchor ( & id) , ItemType :: Impl ) ;
3628
3636
write ! ( w, "</code>" ) ;
3629
- render_stability_since_raw ( w, item. stable_since ( ) , outer_version) ;
3637
+ render_stability_since_raw ( w, item. stable_since ( ) . as_deref ( ) , outer_version) ;
3630
3638
if let Some ( l) = cx. src_href ( item, cache) {
3631
3639
write ! (
3632
3640
w,
@@ -3648,7 +3656,7 @@ fn render_impl(
3648
3656
write ! ( w, "<h4 id='{}' class=\" {}{}\" ><code>" , id, item_type, extra_class) ;
3649
3657
assoc_const ( w, item, ty, default. as_ref ( ) , link. anchor ( & id) , "" ) ;
3650
3658
write ! ( w, "</code>" ) ;
3651
- render_stability_since_raw ( w, item. stable_since ( ) , outer_version) ;
3659
+ render_stability_since_raw ( w, item. stable_since ( ) . as_deref ( ) , outer_version) ;
3652
3660
if let Some ( l) = cx. src_href ( item, cache) {
3653
3661
write ! (
3654
3662
w,
0 commit comments