@@ -66,7 +66,7 @@ crate fn collect_trait_impls(krate: Crate, cx: &mut DocContext<'_>) -> Crate {
6666 debug ! ( "add_deref_target: type {:?}, target {:?}" , type_did, target) ;
6767 if let Some ( target_prim) = target. primitive_type ( ) {
6868 cleaner. prims . insert ( target_prim) ;
69- } else if let Some ( target_did) = target. def_id ( ) {
69+ } else if let Some ( target_did) = target. def_id_no_primitives ( ) {
7070 // `impl Deref<Target = S> for S`
7171 if target_did == type_did {
7272 // Avoid infinite cycles
@@ -82,7 +82,7 @@ crate fn collect_trait_impls(krate: Crate, cx: &mut DocContext<'_>) -> Crate {
8282 for it in & new_items {
8383 if let ImplItem ( Impl { ref for_, ref trait_, ref items, .. } ) = * it. kind {
8484 if trait_. as_ref ( ) . map ( |t| t. def_id ( ) ) == cx. tcx . lang_items ( ) . deref_trait ( )
85- && cleaner. keep_impl ( for_)
85+ && cleaner. keep_impl ( for_, true )
8686 {
8787 let target = items
8888 . iter ( )
@@ -97,7 +97,7 @@ crate fn collect_trait_impls(krate: Crate, cx: &mut DocContext<'_>) -> Crate {
9797 } else if let Some ( did) = target. def_id ( & cx. cache ) {
9898 cleaner. items . insert ( did. into ( ) ) ;
9999 }
100- if let Some ( for_did) = for_. def_id ( ) {
100+ if let Some ( for_did) = for_. def_id_no_primitives ( ) {
101101 if type_did_to_deref_target. insert ( for_did, target) . is_none ( ) {
102102 // Since only the `DefId` portion of the `Type` instances is known to be same for both the
103103 // `Deref` target type and the impl for type positions, this map of types is keyed by
@@ -113,10 +113,10 @@ crate fn collect_trait_impls(krate: Crate, cx: &mut DocContext<'_>) -> Crate {
113113
114114 new_items. retain ( |it| {
115115 if let ImplItem ( Impl { ref for_, ref trait_, ref blanket_impl, .. } ) = * it. kind {
116- cleaner. keep_impl ( for_ )
117- || trait_
118- . as_ref ( )
119- . map_or ( false , |t| cleaner. keep_impl_with_def_id ( t. def_id ( ) . into ( ) ) )
116+ cleaner. keep_impl (
117+ for_ ,
118+ trait_ . as_ref ( ) . map ( |t| t . def_id ( ) ) == cx . tcx . lang_items ( ) . deref_trait ( ) ,
119+ ) || trait_ . as_ref ( ) . map_or ( false , |t| cleaner. keep_impl_with_def_id ( t. def_id ( ) . into ( ) ) )
120120 || blanket_impl. is_some ( )
121121 } else {
122122 true
@@ -215,17 +215,14 @@ struct BadImplStripper {
215215}
216216
217217impl BadImplStripper {
218- fn keep_impl ( & self , ty : & Type ) -> bool {
218+ fn keep_impl ( & self , ty : & Type , is_deref : bool ) -> bool {
219219 if let Generic ( _) = ty {
220220 // keep impls made on generics
221221 true
222222 } else if let Some ( prim) = ty. primitive_type ( ) {
223223 self . prims . contains ( & prim)
224- } else if ty. def_id_no_primitives ( ) . is_some ( ) {
225- // We want to keep *ALL* deref implementations in case some of them are used in
226- // the current crate.
227- // FIXME: Try to filter the one actually used...
228- true
224+ } else if let Some ( did) = ty. def_id_no_primitives ( ) {
225+ is_deref || self . keep_impl_with_def_id ( did. into ( ) )
229226 } else {
230227 false
231228 }
0 commit comments