@@ -53,15 +53,12 @@ use rustc_data_structures::captures::Captures;
5353use rustc_data_structures:: fx:: { FxHashMap , FxHashSet } ;
5454use rustc_hir:: def_id:: { DefId , DefIdSet } ;
5555use rustc_hir:: Mutability ;
56- use rustc_infer:: infer:: TyCtxtInferExt ;
57- use rustc_infer:: traits:: { Obligation , ObligationCause } ;
5856use rustc_middle:: middle:: stability;
59- use rustc_middle:: ty:: { ParamEnv , TyCtxt } ;
57+ use rustc_middle:: ty:: TyCtxt ;
6058use rustc_span:: {
6159 symbol:: { sym, Symbol } ,
6260 BytePos , FileName , RealFileName ,
6361} ;
64- use rustc_trait_selection:: traits:: ObligationCtxt ;
6562use serde:: ser:: { SerializeMap , SerializeSeq } ;
6663use serde:: { Serialize , Serializer } ;
6764
@@ -1115,76 +1112,28 @@ fn render_assoc_items<'a, 'cx: 'a>(
11151112 containing_item : & ' a clean:: Item ,
11161113 it : DefId ,
11171114 what : AssocItemRender < ' a > ,
1118- aliased_type : Option < DefId > ,
11191115) -> impl fmt:: Display + ' a + Captures < ' cx > {
11201116 let mut derefs = DefIdSet :: default ( ) ;
11211117 derefs. insert ( it) ;
11221118 display_fn ( move |f| {
1123- render_assoc_items_inner ( f, cx, containing_item, it, what, & mut derefs, aliased_type ) ;
1119+ render_assoc_items_inner ( f, cx, containing_item, it, what, & mut derefs) ;
11241120 Ok ( ( ) )
11251121 } )
11261122}
11271123
1128- /// Check whether `impl_def_id` may apply to *some instantiation* of `item_def_id`.
1129- fn is_valid_impl_for ( tcx : TyCtxt < ' _ > , item_def_id : DefId , impl_def_id : DefId ) -> bool {
1130- let infcx = tcx. infer_ctxt ( ) . intercrate ( true ) . build ( ) ;
1131- let ocx = ObligationCtxt :: new ( & infcx) ;
1132- let param_env = ParamEnv :: empty ( ) ;
1133-
1134- let alias_substs = infcx. fresh_substs_for_item ( rustc_span:: DUMMY_SP , item_def_id) ;
1135- let alias_ty = tcx. type_of ( item_def_id) . subst ( tcx, alias_substs) ;
1136- let alias_bounds = tcx. predicates_of ( item_def_id) . instantiate ( tcx, alias_substs) ;
1137-
1138- let impl_substs = infcx. fresh_substs_for_item ( rustc_span:: DUMMY_SP , impl_def_id) ;
1139- let impl_self_ty = tcx. type_of ( impl_def_id) . subst ( tcx, impl_substs) ;
1140- let impl_bounds = tcx. predicates_of ( impl_def_id) . instantiate ( tcx, impl_substs) ;
1141-
1142- if ocx. eq ( & ObligationCause :: dummy ( ) , param_env, impl_self_ty, alias_ty) . is_err ( ) {
1143- return false ;
1144- }
1145- ocx. register_obligations (
1146- alias_bounds
1147- . iter ( )
1148- . chain ( impl_bounds)
1149- . map ( |( p, _) | Obligation :: new ( tcx, ObligationCause :: dummy ( ) , param_env, p) ) ,
1150- ) ;
1151-
1152- let errors = ocx. select_where_possible ( ) ;
1153- errors. is_empty ( )
1154- }
1155-
1156- // If `aliased_type` is `Some`, it means `it` is a type alias and `aliased_type` is the "actual"
1157- // type aliased behind `it`. It is used to check whether or not the implementation of the aliased
1158- // type can be displayed on the alias doc page.
11591124fn render_assoc_items_inner (
11601125 mut w : & mut dyn fmt:: Write ,
11611126 cx : & mut Context < ' _ > ,
11621127 containing_item : & clean:: Item ,
11631128 it : DefId ,
11641129 what : AssocItemRender < ' _ > ,
11651130 derefs : & mut DefIdSet ,
1166- aliased_type : Option < DefId > ,
11671131) {
11681132 info ! ( "Documenting associated items of {:?}" , containing_item. name) ;
11691133 let shared = Rc :: clone ( & cx. shared ) ;
11701134 let cache = & shared. cache ;
1171- let empty = Vec :: new ( ) ;
1172- let v = match cache. impls . get ( & it) {
1173- Some ( v) => v,
1174- None => & empty,
1175- } ;
1176- let v2 = match aliased_type {
1177- Some ( aliased_type) => cache. impls . get ( & aliased_type) . unwrap_or ( & empty) ,
1178- None => & empty,
1179- } ;
1180- if v. is_empty ( ) && v2. is_empty ( ) {
1181- return ;
1182- }
1183- let mut saw_impls = FxHashSet :: default ( ) ;
1184- let ( non_trait, traits) : ( Vec < _ > , _ ) =
1185- v. iter ( ) . chain ( v2) . partition ( |i| i. inner_impl ( ) . trait_ . is_none ( ) ) ;
1186- let tcx = cx. tcx ( ) ;
1187- let is_alias = aliased_type. is_some ( ) ;
1135+ let Some ( v) = cache. impls . get ( & it) else { return } ;
1136+ let ( non_trait, traits) : ( Vec < _ > , _ ) = v. iter ( ) . partition ( |i| i. inner_impl ( ) . trait_ . is_none ( ) ) ;
11881137 if !non_trait. is_empty ( ) {
11891138 let mut tmp_buf = Buffer :: html ( ) ;
11901139 let ( render_mode, id, class_html) = match what {
@@ -1216,12 +1165,6 @@ fn render_assoc_items_inner(
12161165 } ;
12171166 let mut impls_buf = Buffer :: html ( ) ;
12181167 for i in & non_trait {
1219- if !saw_impls. insert ( i. def_id ( ) ) {
1220- continue ;
1221- }
1222- if is_alias && !is_valid_impl_for ( tcx, it, i. def_id ( ) ) {
1223- continue ;
1224- }
12251168 render_impl (
12261169 & mut impls_buf,
12271170 cx,
@@ -1250,14 +1193,9 @@ fn render_assoc_items_inner(
12501193 if !traits. is_empty ( ) {
12511194 let deref_impl =
12521195 traits. iter ( ) . find ( |t| t. trait_did ( ) == cx. tcx ( ) . lang_items ( ) . deref_trait ( ) ) ;
1253- if let Some ( impl_) = deref_impl &&
1254- ( !is_alias || is_valid_impl_for ( tcx, it, impl_. def_id ( ) ) )
1255- {
1196+ if let Some ( impl_) = deref_impl {
12561197 let has_deref_mut =
1257- traits. iter ( ) . any ( |t| {
1258- t. trait_did ( ) == cx. tcx ( ) . lang_items ( ) . deref_mut_trait ( ) &&
1259- ( !is_alias || is_valid_impl_for ( tcx, it, t. def_id ( ) ) )
1260- } ) ;
1198+ traits. iter ( ) . any ( |t| t. trait_did ( ) == cx. tcx ( ) . lang_items ( ) . deref_mut_trait ( ) ) ;
12611199 render_deref_methods ( & mut w, cx, impl_, containing_item, has_deref_mut, derefs) ;
12621200 }
12631201
@@ -1267,14 +1205,10 @@ fn render_assoc_items_inner(
12671205 return ;
12681206 }
12691207
1270- let ( synthetic, concrete) : ( Vec < & Impl > , Vec < & Impl > ) = traits
1271- . into_iter ( )
1272- . filter ( |t| saw_impls. insert ( t. def_id ( ) ) )
1273- . partition ( |t| t. inner_impl ( ) . kind . is_auto ( ) ) ;
1274- let ( blanket_impl, concrete) : ( Vec < & Impl > , _ ) = concrete
1275- . into_iter ( )
1276- . filter ( |t| !is_alias || is_valid_impl_for ( tcx, it, t. def_id ( ) ) )
1277- . partition ( |t| t. inner_impl ( ) . kind . is_blanket ( ) ) ;
1208+ let ( synthetic, concrete) : ( Vec < & Impl > , Vec < & Impl > ) =
1209+ traits. into_iter ( ) . partition ( |t| t. inner_impl ( ) . kind . is_auto ( ) ) ;
1210+ let ( blanket_impl, concrete) : ( Vec < & Impl > , _ ) =
1211+ concrete. into_iter ( ) . partition ( |t| t. inner_impl ( ) . kind . is_blanket ( ) ) ;
12781212
12791213 render_all_impls ( w, cx, containing_item, & concrete, & synthetic, & blanket_impl) ;
12801214 }
@@ -1313,10 +1247,10 @@ fn render_deref_methods(
13131247 return ;
13141248 }
13151249 }
1316- render_assoc_items_inner ( & mut w, cx, container_item, did, what, derefs, None ) ;
1250+ render_assoc_items_inner ( & mut w, cx, container_item, did, what, derefs) ;
13171251 } else if let Some ( prim) = target. primitive_type ( ) {
13181252 if let Some ( & did) = cache. primitive_locations . get ( & prim) {
1319- render_assoc_items_inner ( & mut w, cx, container_item, did, what, derefs, None ) ;
1253+ render_assoc_items_inner ( & mut w, cx, container_item, did, what, derefs) ;
13201254 }
13211255 }
13221256}
0 commit comments