@@ -49,6 +49,7 @@ use std::sync::Arc;
4949
5050use itertools:: Itertools ;
5151use rustc_ast_pretty:: pprust;
52+ use rustc_attr:: StabilityLevel ;
5253use rustc_data_structures:: flock;
5354use rustc_data_structures:: fx:: { FxHashMap , FxHashSet } ;
5455use rustc_feature:: UnstableFeatures ;
@@ -1984,8 +1985,10 @@ fn item_module(w: &mut Buffer, cx: &Context, item: &clean::Item, items: &[clean:
19841985 let s1 = i1. stability . as_ref ( ) . map ( |s| s. level ) ;
19851986 let s2 = i2. stability . as_ref ( ) . map ( |s| s. level ) ;
19861987 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+ } ,
19891992 _ => { }
19901993 }
19911994 let lhs = i1. name . as_ref ( ) . map_or ( "" , |s| & * * s) ;
@@ -2150,10 +2153,7 @@ fn stability_tags(item: &clean::Item) -> String {
21502153
21512154 // The "rustc_private" crates are permanently unstable so it makes no sense
21522155 // 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)
21572157 == Some ( true )
21582158 {
21592159 tags += & tag_html ( "unstable" , "" , "Experimental" ) ;
@@ -2204,16 +2204,17 @@ fn short_stability(item: &clean::Item, cx: &Context) -> Vec<String> {
22042204
22052205 // Render unstable items. But don't render "rustc_private" crates (internal compiler crates).
22062206 // 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
22082208 . stability
22092209 . 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 ) )
22112212 {
22122213 let mut message =
22132214 "<span class='emoji'>🔬</span> This is a nightly-only experimental API." . to_owned ( ) ;
22142215
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) {
22172218 feature. push_str ( & format ! (
22182219 " <a href=\" {url}{issue}\" >#{issue}</a>" ,
22192220 url = url,
@@ -2223,13 +2224,13 @@ fn short_stability(item: &clean::Item, cx: &Context) -> Vec<String> {
22232224
22242225 message. push_str ( & format ! ( " ({})" , feature) ) ;
22252226
2226- if let Some ( unstable_reason) = & stab . unstable_reason {
2227+ if let Some ( unstable_reason) = reason {
22272228 let mut ids = cx. id_map . borrow_mut ( ) ;
22282229 message = format ! (
22292230 "<details><summary>{}</summary>{}</details>" ,
22302231 message,
22312232 MarkdownHtml (
2232- & unstable_reason,
2233+ & unstable_reason. as_str ( ) ,
22332234 & mut ids,
22342235 error_codes,
22352236 cx. shared. edition,
@@ -2355,7 +2356,7 @@ fn render_implementor(
23552356 implementor,
23562357 AssocItemLink :: Anchor ( None ) ,
23572358 RenderMode :: Normal ,
2358- implementor. impl_item . stable_since ( ) ,
2359+ implementor. impl_item . stable_since ( ) . as_deref ( ) ,
23592360 false ,
23602361 Some ( use_absolute) ,
23612362 false ,
@@ -2384,7 +2385,7 @@ fn render_impls(
23842385 i,
23852386 assoc_link,
23862387 RenderMode :: Normal ,
2387- containing_item. stable_since ( ) ,
2388+ containing_item. stable_since ( ) . as_deref ( ) ,
23882389 true ,
23892390 None ,
23902391 false ,
@@ -2629,7 +2630,7 @@ fn item_trait(w: &mut Buffer, cx: &Context, it: &clean::Item, t: &clean::Trait,
26292630 & implementor,
26302631 assoc_link,
26312632 RenderMode :: Normal ,
2632- implementor. impl_item . stable_since ( ) ,
2633+ implementor. impl_item . stable_since ( ) . as_deref ( ) ,
26332634 false ,
26342635 None ,
26352636 true ,
@@ -2780,7 +2781,11 @@ fn render_stability_since_raw(w: &mut Buffer, ver: Option<&str>, containing_ver:
27802781}
27812782
27822783fn 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+ )
27842789}
27852790
27862791fn render_assoc_item (
@@ -3324,7 +3329,7 @@ fn render_assoc_items(
33243329 i,
33253330 AssocItemLink :: Anchor ( None ) ,
33263331 render_mode,
3327- containing_item. stable_since ( ) ,
3332+ containing_item. stable_since ( ) . as_deref ( ) ,
33283333 true ,
33293334 None ,
33303335 false ,
@@ -3564,8 +3569,11 @@ fn render_impl(
35643569 ) ;
35653570 }
35663571 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) ;
35693577 if let Some ( l) = cx. src_href ( & i. impl_item , cache) {
35703578 write ! ( w, "<a class='srclink' href='{}' title='{}'>[src]</a>" , l, "goto source code" ) ;
35713579 }
@@ -3626,7 +3634,7 @@ fn render_impl(
36263634 write ! ( w, "<code>" ) ;
36273635 render_assoc_item ( w, item, link. anchor ( & id) , ItemType :: Impl ) ;
36283636 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) ;
36303638 if let Some ( l) = cx. src_href ( item, cache) {
36313639 write ! (
36323640 w,
@@ -3648,7 +3656,7 @@ fn render_impl(
36483656 write ! ( w, "<h4 id='{}' class=\" {}{}\" ><code>" , id, item_type, extra_class) ;
36493657 assoc_const ( w, item, ty, default. as_ref ( ) , link. anchor ( & id) , "" ) ;
36503658 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) ;
36523660 if let Some ( l) = cx. src_href ( item, cache) {
36533661 write ! (
36543662 w,
0 commit comments