@@ -270,6 +270,18 @@ impl FromClean<hir::ConstStability> for Stability {
270270 }
271271}
272272
273+ impl FromClean < hir:: DefaultBodyStability > for Box < ProvidedDefaultUnstable > {
274+ fn from_clean ( stab : & hir:: DefaultBodyStability , _renderer : & JsonRenderer < ' _ > ) -> Self {
275+ let hir:: StabilityLevel :: Unstable { .. } = stab. level else {
276+ bug ! (
277+ "unexpected stable default-body stability, \
278+ there's no stable equivalent of `#[rustc_default_body_unstable]`"
279+ )
280+ } ;
281+ Box :: new ( ProvidedDefaultUnstable { feature : stab. feature . to_string ( ) } )
282+ }
283+ }
284+
273285impl FromClean < clean:: GenericArgs > for Option < Box < GenericArgs > > {
274286 fn from_clean ( generic_args : & clean:: GenericArgs , renderer : & JsonRenderer < ' _ > ) -> Self {
275287 use clean:: GenericArgs :: * ;
@@ -353,18 +365,23 @@ fn from_clean_item(item: &clean::Item, renderer: &JsonRenderer<'_>) -> ItemEnum
353365 EnumItem ( e) => ItemEnum :: Enum ( e. into_json ( renderer) ) ,
354366 VariantItem ( v) => ItemEnum :: Variant ( v. into_json ( renderer) ) ,
355367 FunctionItem ( f) => {
356- ItemEnum :: Function ( from_clean_function ( f, true , header. unwrap ( ) , renderer) )
368+ ItemEnum :: Function ( from_clean_function ( f, true , None , header. unwrap ( ) , renderer) )
357369 }
358370 ForeignFunctionItem ( f, _) => {
359- ItemEnum :: Function ( from_clean_function ( f, false , header. unwrap ( ) , renderer) )
371+ ItemEnum :: Function ( from_clean_function ( f, false , None , header. unwrap ( ) , renderer) )
360372 }
361373 TraitItem ( t) => ItemEnum :: Trait ( t. into_json ( renderer) ) ,
362374 TraitAliasItem ( t) => ItemEnum :: TraitAlias ( t. into_json ( renderer) ) ,
363- MethodItem ( m, _) => {
364- ItemEnum :: Function ( from_clean_function ( m, true , header. unwrap ( ) , renderer) )
365- }
375+ MethodItem ( m, _) => ItemEnum :: Function ( from_clean_function (
376+ m,
377+ true ,
378+ default_body_stability_for_def_id ( renderer. tcx , item. item_id . expect_def_id ( ) )
379+ . map ( |stab| stab. into_json ( renderer) ) ,
380+ header. unwrap ( ) ,
381+ renderer,
382+ ) ) ,
366383 RequiredMethodItem ( m, _) => {
367- ItemEnum :: Function ( from_clean_function ( m, false , header. unwrap ( ) , renderer) )
384+ ItemEnum :: Function ( from_clean_function ( m, false , None , header. unwrap ( ) , renderer) )
368385 }
369386 ImplItem ( i) => ItemEnum :: Impl ( i. into_json ( renderer) ) ,
370387 StaticItem ( s) => ItemEnum :: Static ( from_clean_static ( s, rustc_hir:: Safety :: Safe , renderer) ) ,
@@ -385,23 +402,41 @@ fn from_clean_item(item: &clean::Item, renderer: &JsonRenderer<'_>) -> ItemEnum
385402 } )
386403 }
387404 // FIXME(generic_const_items): Add support for generic associated consts.
388- RequiredAssocConstItem ( _generics, ty) => {
389- ItemEnum :: AssocConst { type_ : ty. into_json ( renderer) , value : None }
390- }
405+ RequiredAssocConstItem ( _generics, ty) => ItemEnum :: AssocConst {
406+ type_ : ty. into_json ( renderer) ,
407+ value : None ,
408+ default_unstable : None ,
409+ } ,
391410 // FIXME(generic_const_items): Add support for generic associated consts.
392- ProvidedAssocConstItem ( ci) | ImplAssocConstItem ( ci ) => ItemEnum :: AssocConst {
411+ ProvidedAssocConstItem ( ci) => ItemEnum :: AssocConst {
393412 type_ : ci. type_ . into_json ( renderer) ,
394413 value : Some ( ci. kind . expr ( renderer. tcx ) ) ,
414+ default_unstable : default_body_stability_for_def_id (
415+ renderer. tcx ,
416+ item. item_id . expect_def_id ( ) ,
417+ )
418+ . map ( |stab| stab. into_json ( renderer) ) ,
419+ } ,
420+ ImplAssocConstItem ( ci) => ItemEnum :: AssocConst {
421+ type_ : ci. type_ . into_json ( renderer) ,
422+ value : Some ( ci. kind . expr ( renderer. tcx ) ) ,
423+ default_unstable : None ,
395424 } ,
396425 RequiredAssocTypeItem ( g, b) => ItemEnum :: AssocType {
397426 generics : g. into_json ( renderer) ,
398427 bounds : b. into_json ( renderer) ,
399428 type_ : None ,
429+ default_unstable : None ,
400430 } ,
401431 AssocTypeItem ( t, b) => ItemEnum :: AssocType {
402432 generics : t. generics . into_json ( renderer) ,
403433 bounds : b. into_json ( renderer) ,
404434 type_ : Some ( t. item_type . as_ref ( ) . unwrap_or ( & t. type_ ) . into_json ( renderer) ) ,
435+ default_unstable : default_body_stability_for_def_id (
436+ renderer. tcx ,
437+ item. item_id . expect_def_id ( ) ,
438+ )
439+ . map ( |stab| stab. into_json ( renderer) ) ,
405440 } ,
406441 // `convert_item` early returns `None` for stripped items, keywords, attributes and
407442 // "special" macro rules.
@@ -815,6 +850,7 @@ impl FromClean<clean::Impl> for Impl {
815850pub ( crate ) fn from_clean_function (
816851 clean:: Function { decl, generics } : & clean:: Function ,
817852 has_body : bool ,
853+ default_unstable : Option < Box < ProvidedDefaultUnstable > > ,
818854 header : rustc_hir:: FnHeader ,
819855 renderer : & JsonRenderer < ' _ > ,
820856) -> Function {
@@ -823,6 +859,7 @@ pub(crate) fn from_clean_function(
823859 generics : generics. into_json ( renderer) ,
824860 header : header. into_json ( renderer) ,
825861 has_body,
862+ default_unstable,
826863 }
827864}
828865
@@ -972,6 +1009,17 @@ impl FromClean<ItemType> for ItemKind {
9721009 }
9731010}
9741011
1012+ fn default_body_stability_for_def_id (
1013+ tcx : TyCtxt < ' _ > ,
1014+ def_id : DefId ,
1015+ ) -> Option < hir:: DefaultBodyStability > {
1016+ let stability = tcx. lookup_default_body_stability ( def_id) ?;
1017+ match stability. level {
1018+ hir:: StabilityLevel :: Unstable { .. } => Some ( stability) ,
1019+ hir:: StabilityLevel :: Stable { .. } => None ,
1020+ }
1021+ }
1022+
9751023fn const_stability_for_def_id ( tcx : TyCtxt < ' _ > , def_id : DefId ) -> Option < hir:: ConstStability > {
9761024 if !tcx. is_conditionally_const ( def_id) {
9771025 // The item cannot be conditionally-const. No const stability here.
@@ -1040,6 +1088,7 @@ fn maybe_from_hir_attr(attr: &hir::Attribute, item_id: ItemId, tcx: TyCtxt<'_>)
10401088 AK :: Deprecated { .. } => return Vec :: new( ) , // Handled separately into Item::deprecation.
10411089 AK :: Stability { .. } => return Vec :: new( ) , // Handled separately into Item::stability
10421090 AK :: RustcConstStability { .. } => return Vec :: new( ) , // Handled separately into Item::const_stability.
1091+ AK :: RustcBodyStability { .. } => return Vec :: new( ) , // Handled separately by `default_unstable`.
10431092
10441093 AK :: DocComment { .. } => unreachable!( "doc comments stripped out earlier" ) ,
10451094
0 commit comments