@@ -1067,63 +1067,68 @@ impl Clean<TypeKind> for hir::def::DefKind {
1067
1067
impl Clean < Item > for hir:: TraitItem < ' _ > {
1068
1068
fn clean ( & self , cx : & DocContext < ' _ > ) -> Item {
1069
1069
let local_did = cx. tcx . hir ( ) . local_def_id ( self . hir_id ) . to_def_id ( ) ;
1070
- let inner = match self . kind {
1071
- hir:: TraitItemKind :: Const ( ref ty, default) => {
1072
- AssocConstItem ( ty. clean ( cx) , default. map ( |e| print_const_expr ( cx, e) ) )
1073
- }
1074
- hir:: TraitItemKind :: Fn ( ref sig, hir:: TraitFn :: Provided ( body) ) => {
1075
- let mut m = ( sig, & self . generics , body) . clean ( cx) ;
1076
- if m. header . constness == hir:: Constness :: Const
1077
- && is_unstable_const_fn ( cx. tcx , local_did) . is_some ( )
1078
- {
1079
- m. header . constness = hir:: Constness :: NotConst ;
1070
+ cx. with_param_env ( local_did, || {
1071
+ let inner = match self . kind {
1072
+ hir:: TraitItemKind :: Const ( ref ty, default) => {
1073
+ AssocConstItem ( ty. clean ( cx) , default. map ( |e| print_const_expr ( cx, e) ) )
1080
1074
}
1081
- MethodItem ( m, None )
1082
- }
1083
- hir:: TraitItemKind :: Fn ( ref sig, hir:: TraitFn :: Required ( ref names) ) => {
1084
- let ( generics, decl) = enter_impl_trait ( cx, || {
1085
- ( self . generics . clean ( cx) , ( & * sig. decl , & names[ ..] ) . clean ( cx) )
1086
- } ) ;
1087
- let ( all_types, ret_types) = get_all_types ( & generics, & decl, cx) ;
1088
- let mut t = Function { header : sig. header , decl, generics, all_types, ret_types } ;
1089
- if t. header . constness == hir:: Constness :: Const
1090
- && is_unstable_const_fn ( cx. tcx , local_did) . is_some ( )
1091
- {
1092
- t. header . constness = hir:: Constness :: NotConst ;
1075
+ hir:: TraitItemKind :: Fn ( ref sig, hir:: TraitFn :: Provided ( body) ) => {
1076
+ let mut m = ( sig, & self . generics , body) . clean ( cx) ;
1077
+ if m. header . constness == hir:: Constness :: Const
1078
+ && is_unstable_const_fn ( cx. tcx , local_did) . is_some ( )
1079
+ {
1080
+ m. header . constness = hir:: Constness :: NotConst ;
1081
+ }
1082
+ MethodItem ( m, None )
1093
1083
}
1094
- TyMethodItem ( t)
1095
- }
1096
- hir:: TraitItemKind :: Type ( ref bounds, ref default) => {
1097
- AssocTypeItem ( bounds. clean ( cx) , default. clean ( cx) )
1098
- }
1099
- } ;
1100
- Item :: from_def_id_and_parts ( local_did, Some ( self . ident . name ) , inner, cx)
1084
+ hir:: TraitItemKind :: Fn ( ref sig, hir:: TraitFn :: Required ( ref names) ) => {
1085
+ let ( generics, decl) = enter_impl_trait ( cx, || {
1086
+ ( self . generics . clean ( cx) , ( & * sig. decl , & names[ ..] ) . clean ( cx) )
1087
+ } ) ;
1088
+ let ( all_types, ret_types) = get_all_types ( & generics, & decl, cx) ;
1089
+ let mut t =
1090
+ Function { header : sig. header , decl, generics, all_types, ret_types } ;
1091
+ if t. header . constness == hir:: Constness :: Const
1092
+ && is_unstable_const_fn ( cx. tcx , local_did) . is_some ( )
1093
+ {
1094
+ t. header . constness = hir:: Constness :: NotConst ;
1095
+ }
1096
+ TyMethodItem ( t)
1097
+ }
1098
+ hir:: TraitItemKind :: Type ( ref bounds, ref default) => {
1099
+ AssocTypeItem ( bounds. clean ( cx) , default. clean ( cx) )
1100
+ }
1101
+ } ;
1102
+ Item :: from_def_id_and_parts ( local_did, Some ( self . ident . name ) , inner, cx)
1103
+ } )
1101
1104
}
1102
1105
}
1103
1106
1104
1107
impl Clean < Item > for hir:: ImplItem < ' _ > {
1105
1108
fn clean ( & self , cx : & DocContext < ' _ > ) -> Item {
1106
1109
let local_did = cx. tcx . hir ( ) . local_def_id ( self . hir_id ) . to_def_id ( ) ;
1107
- let inner = match self . kind {
1108
- hir:: ImplItemKind :: Const ( ref ty, expr) => {
1109
- AssocConstItem ( ty. clean ( cx) , Some ( print_const_expr ( cx, expr) ) )
1110
- }
1111
- hir:: ImplItemKind :: Fn ( ref sig, body) => {
1112
- let mut m = ( sig, & self . generics , body) . clean ( cx) ;
1113
- if m. header . constness == hir:: Constness :: Const
1114
- && is_unstable_const_fn ( cx. tcx , local_did) . is_some ( )
1115
- {
1116
- m. header . constness = hir:: Constness :: NotConst ;
1110
+ cx. with_param_env ( local_did, || {
1111
+ let inner = match self . kind {
1112
+ hir:: ImplItemKind :: Const ( ref ty, expr) => {
1113
+ AssocConstItem ( ty. clean ( cx) , Some ( print_const_expr ( cx, expr) ) )
1117
1114
}
1118
- MethodItem ( m, Some ( self . defaultness ) )
1119
- }
1120
- hir:: ImplItemKind :: TyAlias ( ref ty) => {
1121
- let type_ = ty. clean ( cx) ;
1122
- let item_type = type_. def_id ( ) . and_then ( |did| inline:: build_ty ( cx, did) ) ;
1123
- TypedefItem ( Typedef { type_, generics : Generics :: default ( ) , item_type } , true )
1124
- }
1125
- } ;
1126
- Item :: from_def_id_and_parts ( local_did, Some ( self . ident . name ) , inner, cx)
1115
+ hir:: ImplItemKind :: Fn ( ref sig, body) => {
1116
+ let mut m = ( sig, & self . generics , body) . clean ( cx) ;
1117
+ if m. header . constness == hir:: Constness :: Const
1118
+ && is_unstable_const_fn ( cx. tcx , local_did) . is_some ( )
1119
+ {
1120
+ m. header . constness = hir:: Constness :: NotConst ;
1121
+ }
1122
+ MethodItem ( m, Some ( self . defaultness ) )
1123
+ }
1124
+ hir:: ImplItemKind :: TyAlias ( ref ty) => {
1125
+ let type_ = ty. clean ( cx) ;
1126
+ let item_type = type_. def_id ( ) . and_then ( |did| inline:: build_ty ( cx, did) ) ;
1127
+ TypedefItem ( Typedef { type_, generics : Generics :: default ( ) , item_type } , true )
1128
+ }
1129
+ } ;
1130
+ Item :: from_def_id_and_parts ( local_did, Some ( self . ident . name ) , inner, cx)
1131
+ } )
1127
1132
}
1128
1133
}
1129
1134
@@ -1396,7 +1401,7 @@ fn clean_qpath(hir_ty: &hir::Ty<'_>, cx: &DocContext<'_>) -> Type {
1396
1401
hir:: QPath :: Resolved ( Some ( ref qself) , ref p) => {
1397
1402
// Try to normalize `<X as Y>::T` to a type
1398
1403
let ty = hir_ty_to_ty ( cx. tcx , hir_ty) ;
1399
- if let Some ( normalized_value) = normalize ( cx. tcx , ty) {
1404
+ if let Some ( normalized_value) = normalize ( cx, ty) {
1400
1405
return normalized_value. clean ( cx) ;
1401
1406
}
1402
1407
@@ -1498,21 +1503,16 @@ impl Clean<Type> for hir::Ty<'_> {
1498
1503
}
1499
1504
1500
1505
/// Returns `None` if the type could not be normalized
1501
- fn normalize ( tcx : TyCtxt < ' tcx > , ty : Ty < ' tcx > ) -> Option < Ty < ' tcx > > {
1506
+ fn normalize ( cx : & DocContext < ' tcx > , ty : Ty < ' tcx > ) -> Option < Ty < ' tcx > > {
1502
1507
use crate :: rustc_trait_selection:: infer:: TyCtxtInferExt ;
1503
1508
use crate :: rustc_trait_selection:: traits:: query:: normalize:: AtExt ;
1504
1509
use rustc_middle:: traits:: ObligationCause ;
1505
- use rustc_middle:: ty:: ParamEnv ;
1506
1510
1507
1511
// Try to normalize `<X as Y>::T` to a type
1508
- // FIXME: rustdoc won't be able to perform 'partial' normalization
1509
- // until this param env is actually correct
1510
- // 'partial': `<Vec<T> as IntoIterator>::IntoIter>` -> `vec::IntoIter<T>`
1511
- let param_env = ParamEnv :: empty ( ) ;
1512
- let lifted = ty. lift_to_tcx ( tcx) . unwrap ( ) ;
1513
- let normalized = tcx. infer_ctxt ( ) . enter ( |infcx| {
1512
+ let lifted = ty. lift_to_tcx ( cx. tcx ) . unwrap ( ) ;
1513
+ let normalized = cx. tcx . infer_ctxt ( ) . enter ( |infcx| {
1514
1514
infcx
1515
- . at ( & ObligationCause :: dummy ( ) , param_env)
1515
+ . at ( & ObligationCause :: dummy ( ) , cx . param_env . get ( ) )
1516
1516
. normalize ( lifted)
1517
1517
. map ( |resolved| infcx. resolve_vars_if_possible ( resolved. value ) )
1518
1518
} ) ;
@@ -1531,7 +1531,7 @@ fn normalize(tcx: TyCtxt<'tcx>, ty: Ty<'tcx>) -> Option<Ty<'tcx>> {
1531
1531
impl < ' tcx > Clean < Type > for Ty < ' tcx > {
1532
1532
fn clean ( & self , cx : & DocContext < ' _ > ) -> Type {
1533
1533
debug ! ( "cleaning type: {:?}" , self ) ;
1534
- let ty = normalize ( cx. tcx , self . lift_to_tcx ( cx. tcx ) . unwrap ( ) ) . unwrap_or ( self ) ;
1534
+ let ty = normalize ( cx, self . lift_to_tcx ( cx. tcx ) . unwrap ( ) ) . unwrap_or ( self ) ;
1535
1535
match * ty. kind ( ) {
1536
1536
ty:: Never => Never ,
1537
1537
ty:: Bool => Primitive ( PrimitiveType :: Bool ) ,
@@ -1984,77 +1984,81 @@ impl Clean<Vec<Item>> for (&hir::Item<'_>, Option<Ident>) {
1984
1984
Some ( ident) => ident. name ,
1985
1985
None => cx. tcx . hir ( ) . name ( item. hir_id ) ,
1986
1986
} ;
1987
- let kind = match item. kind {
1988
- ItemKind :: Static ( ty, mutability, body_id) => StaticItem ( Static {
1989
- type_ : ty. clean ( cx) ,
1990
- mutability,
1991
- expr : print_const_expr ( cx, body_id) ,
1992
- } ) ,
1993
- ItemKind :: Const ( ty, body_id) => ConstantItem ( Constant {
1994
- type_ : ty. clean ( cx) ,
1995
- expr : print_const_expr ( cx, body_id) ,
1996
- value : print_evaluated_const ( cx, def_id) ,
1997
- is_literal : is_literal_expr ( cx, body_id. hir_id ) ,
1998
- } ) ,
1999
- ItemKind :: OpaqueTy ( ref ty) => OpaqueTyItem ( OpaqueTy {
2000
- bounds : ty. bounds . clean ( cx) ,
2001
- generics : ty. generics . clean ( cx) ,
2002
- } ) ,
2003
- ItemKind :: TyAlias ( ty, ref generics) => {
2004
- let rustdoc_ty = ty. clean ( cx) ;
2005
- let item_type = rustdoc_ty. def_id ( ) . and_then ( |did| inline:: build_ty ( cx, did) ) ;
2006
- TypedefItem (
2007
- Typedef { type_ : rustdoc_ty, generics : generics. clean ( cx) , item_type } ,
2008
- false ,
2009
- )
2010
- }
2011
- ItemKind :: Enum ( ref def, ref generics) => EnumItem ( Enum {
2012
- variants : def. variants . iter ( ) . map ( |v| v. clean ( cx) ) . collect ( ) ,
2013
- generics : generics. clean ( cx) ,
2014
- variants_stripped : false ,
2015
- } ) ,
2016
- ItemKind :: TraitAlias ( ref generics, bounds) => TraitAliasItem ( TraitAlias {
2017
- generics : generics. clean ( cx) ,
2018
- bounds : bounds. clean ( cx) ,
2019
- } ) ,
2020
- ItemKind :: Union ( ref variant_data, ref generics) => UnionItem ( Union {
2021
- struct_type : doctree:: struct_type_from_def ( & variant_data) ,
2022
- generics : generics. clean ( cx) ,
2023
- fields : variant_data. fields ( ) . clean ( cx) ,
2024
- fields_stripped : false ,
2025
- } ) ,
2026
- ItemKind :: Struct ( ref variant_data, ref generics) => StructItem ( Struct {
2027
- struct_type : doctree:: struct_type_from_def ( & variant_data) ,
2028
- generics : generics. clean ( cx) ,
2029
- fields : variant_data. fields ( ) . clean ( cx) ,
2030
- fields_stripped : false ,
2031
- } ) ,
2032
- ItemKind :: Impl { .. } => return clean_impl ( item, cx) ,
2033
- // proc macros can have a name set by attributes
2034
- ItemKind :: Fn ( ref sig, ref generics, body_id) => {
2035
- clean_fn_or_proc_macro ( item, sig, generics, body_id, & mut name, cx)
2036
- }
2037
- hir:: ItemKind :: Trait ( is_auto, unsafety, ref generics, ref bounds, ref item_ids) => {
2038
- let items =
2039
- item_ids. iter ( ) . map ( |ti| cx. tcx . hir ( ) . trait_item ( ti. id ) . clean ( cx) ) . collect ( ) ;
2040
- let attrs = item. attrs . clean ( cx) ;
2041
- let is_spotlight = attrs. has_doc_flag ( sym:: spotlight) ;
2042
- TraitItem ( Trait {
2043
- unsafety,
2044
- items,
1987
+ cx. with_param_env ( def_id, || {
1988
+ let kind = match item. kind {
1989
+ ItemKind :: Static ( ty, mutability, body_id) => StaticItem ( Static {
1990
+ type_ : ty. clean ( cx) ,
1991
+ mutability,
1992
+ expr : print_const_expr ( cx, body_id) ,
1993
+ } ) ,
1994
+ ItemKind :: Const ( ty, body_id) => ConstantItem ( Constant {
1995
+ type_ : ty. clean ( cx) ,
1996
+ expr : print_const_expr ( cx, body_id) ,
1997
+ value : print_evaluated_const ( cx, def_id) ,
1998
+ is_literal : is_literal_expr ( cx, body_id. hir_id ) ,
1999
+ } ) ,
2000
+ ItemKind :: OpaqueTy ( ref ty) => OpaqueTyItem ( OpaqueTy {
2001
+ bounds : ty. bounds . clean ( cx) ,
2002
+ generics : ty. generics . clean ( cx) ,
2003
+ } ) ,
2004
+ ItemKind :: TyAlias ( ty, ref generics) => {
2005
+ let rustdoc_ty = ty. clean ( cx) ;
2006
+ let item_type = rustdoc_ty. def_id ( ) . and_then ( |did| inline:: build_ty ( cx, did) ) ;
2007
+ TypedefItem (
2008
+ Typedef { type_ : rustdoc_ty, generics : generics. clean ( cx) , item_type } ,
2009
+ false ,
2010
+ )
2011
+ }
2012
+ ItemKind :: Enum ( ref def, ref generics) => EnumItem ( Enum {
2013
+ variants : def. variants . iter ( ) . map ( |v| v. clean ( cx) ) . collect ( ) ,
2014
+ generics : generics. clean ( cx) ,
2015
+ variants_stripped : false ,
2016
+ } ) ,
2017
+ ItemKind :: TraitAlias ( ref generics, bounds) => TraitAliasItem ( TraitAlias {
2045
2018
generics : generics. clean ( cx) ,
2046
2019
bounds : bounds. clean ( cx) ,
2047
- is_spotlight,
2048
- is_auto : is_auto. clean ( cx) ,
2049
- } )
2050
- }
2051
- ItemKind :: ExternCrate ( orig_name) => {
2052
- return clean_extern_crate ( item, name, orig_name, cx) ;
2053
- }
2054
- _ => unreachable ! ( "not yet converted" ) ,
2055
- } ;
2020
+ } ) ,
2021
+ ItemKind :: Union ( ref variant_data, ref generics) => UnionItem ( Union {
2022
+ struct_type : doctree:: struct_type_from_def ( & variant_data) ,
2023
+ generics : generics. clean ( cx) ,
2024
+ fields : variant_data. fields ( ) . clean ( cx) ,
2025
+ fields_stripped : false ,
2026
+ } ) ,
2027
+ ItemKind :: Struct ( ref variant_data, ref generics) => StructItem ( Struct {
2028
+ struct_type : doctree:: struct_type_from_def ( & variant_data) ,
2029
+ generics : generics. clean ( cx) ,
2030
+ fields : variant_data. fields ( ) . clean ( cx) ,
2031
+ fields_stripped : false ,
2032
+ } ) ,
2033
+ ItemKind :: Impl { .. } => return clean_impl ( item, cx) ,
2034
+ // proc macros can have a name set by attributes
2035
+ ItemKind :: Fn ( ref sig, ref generics, body_id) => {
2036
+ clean_fn_or_proc_macro ( item, sig, generics, body_id, & mut name, cx)
2037
+ }
2038
+ hir:: ItemKind :: Trait ( is_auto, unsafety, ref generics, ref bounds, ref item_ids) => {
2039
+ let items = item_ids
2040
+ . iter ( )
2041
+ . map ( |ti| cx. tcx . hir ( ) . trait_item ( ti. id ) . clean ( cx) )
2042
+ . collect ( ) ;
2043
+ let attrs = item. attrs . clean ( cx) ;
2044
+ let is_spotlight = attrs. has_doc_flag ( sym:: spotlight) ;
2045
+ TraitItem ( Trait {
2046
+ unsafety,
2047
+ items,
2048
+ generics : generics. clean ( cx) ,
2049
+ bounds : bounds. clean ( cx) ,
2050
+ is_spotlight,
2051
+ is_auto : is_auto. clean ( cx) ,
2052
+ } )
2053
+ }
2054
+ ItemKind :: ExternCrate ( orig_name) => {
2055
+ return clean_extern_crate ( item, name, orig_name, cx) ;
2056
+ }
2057
+ _ => unreachable ! ( "not yet converted" ) ,
2058
+ } ;
2056
2059
2057
- vec ! [ Item :: from_def_id_and_parts( def_id, Some ( name) , kind, cx) ]
2060
+ vec ! [ Item :: from_def_id_and_parts( def_id, Some ( name) , kind, cx) ]
2061
+ } )
2058
2062
}
2059
2063
}
2060
2064
@@ -2272,32 +2276,42 @@ impl Clean<Vec<Item>> for doctree::Import<'_> {
2272
2276
impl Clean < Item > for ( & hir:: ForeignItem < ' _ > , Option < Ident > ) {
2273
2277
fn clean ( & self , cx : & DocContext < ' _ > ) -> Item {
2274
2278
let ( item, renamed) = self ;
2275
- let kind = match item. kind {
2276
- hir:: ForeignItemKind :: Fn ( ref decl, ref names, ref generics) => {
2277
- let abi = cx. tcx . hir ( ) . get_foreign_abi ( item. hir_id ) ;
2278
- let ( generics, decl) =
2279
- enter_impl_trait ( cx, || ( generics. clean ( cx) , ( & * * decl, & names[ ..] ) . clean ( cx) ) ) ;
2280
- let ( all_types, ret_types) = get_all_types ( & generics, & decl, cx) ;
2281
- ForeignFunctionItem ( Function {
2282
- decl,
2283
- generics,
2284
- header : hir:: FnHeader {
2285
- unsafety : hir:: Unsafety :: Unsafe ,
2286
- abi,
2287
- constness : hir:: Constness :: NotConst ,
2288
- asyncness : hir:: IsAsync :: NotAsync ,
2289
- } ,
2290
- all_types,
2291
- ret_types,
2292
- } )
2293
- }
2294
- hir:: ForeignItemKind :: Static ( ref ty, mutability) => {
2295
- ForeignStaticItem ( Static { type_ : ty. clean ( cx) , mutability, expr : String :: new ( ) } )
2296
- }
2297
- hir:: ForeignItemKind :: Type => ForeignTypeItem ,
2298
- } ;
2279
+ cx. with_param_env ( cx. tcx . hir ( ) . local_def_id ( item. hir_id ) . to_def_id ( ) , || {
2280
+ let kind = match item. kind {
2281
+ hir:: ForeignItemKind :: Fn ( ref decl, ref names, ref generics) => {
2282
+ let abi = cx. tcx . hir ( ) . get_foreign_abi ( item. hir_id ) ;
2283
+ let ( generics, decl) = enter_impl_trait ( cx, || {
2284
+ ( generics. clean ( cx) , ( & * * decl, & names[ ..] ) . clean ( cx) )
2285
+ } ) ;
2286
+ let ( all_types, ret_types) = get_all_types ( & generics, & decl, cx) ;
2287
+ ForeignFunctionItem ( Function {
2288
+ decl,
2289
+ generics,
2290
+ header : hir:: FnHeader {
2291
+ unsafety : hir:: Unsafety :: Unsafe ,
2292
+ abi,
2293
+ constness : hir:: Constness :: NotConst ,
2294
+ asyncness : hir:: IsAsync :: NotAsync ,
2295
+ } ,
2296
+ all_types,
2297
+ ret_types,
2298
+ } )
2299
+ }
2300
+ hir:: ForeignItemKind :: Static ( ref ty, mutability) => ForeignStaticItem ( Static {
2301
+ type_ : ty. clean ( cx) ,
2302
+ mutability,
2303
+ expr : String :: new ( ) ,
2304
+ } ) ,
2305
+ hir:: ForeignItemKind :: Type => ForeignTypeItem ,
2306
+ } ;
2299
2307
2300
- Item :: from_hir_id_and_parts ( item. hir_id , Some ( renamed. unwrap_or ( item. ident ) . name ) , kind, cx)
2308
+ Item :: from_hir_id_and_parts (
2309
+ item. hir_id ,
2310
+ Some ( renamed. unwrap_or ( item. ident ) . name ) ,
2311
+ kind,
2312
+ cx,
2313
+ )
2314
+ } )
2301
2315
}
2302
2316
}
2303
2317
0 commit comments