@@ -89,7 +89,7 @@ pub(crate) fn ensure_trailing_slash(v: &str) -> impl fmt::Display {
89
89
90
90
/// Specifies whether rendering directly implemented trait items or ones from a certain Deref
91
91
/// impl.
92
- #[ derive( Copy , Clone ) ]
92
+ #[ derive( Copy , Clone , Debug ) ]
93
93
pub ( crate ) enum AssocItemRender < ' a > {
94
94
All ,
95
95
DerefFor { trait_ : & ' a clean:: Path , type_ : & ' a clean:: Type , deref_mut_ : bool } ,
@@ -1296,7 +1296,7 @@ fn render_assoc_items_inner(
1296
1296
info ! ( "Documenting associated items of {:?}" , containing_item. name) ;
1297
1297
let cache = & cx. shared . cache ;
1298
1298
let Some ( v) = cache. impls . get ( & it) else { return } ;
1299
- let ( non_trait, traits) : ( Vec < _ > , _ ) = v. iter ( ) . partition ( |i| i. inner_impl ( ) . trait_ . is_none ( ) ) ;
1299
+ let ( mut non_trait, traits) : ( Vec < _ > , _ ) = v. iter ( ) . partition ( |i| i. inner_impl ( ) . trait_ . is_none ( ) ) ;
1300
1300
if !non_trait. is_empty ( ) {
1301
1301
let mut close_tags = <Vec < & str > >:: with_capacity ( 1 ) ;
1302
1302
let mut tmp_buf = String :: new ( ) ;
@@ -1314,6 +1314,16 @@ fn render_assoc_items_inner(
1314
1314
AssocItemRender :: DerefFor { trait_, type_, deref_mut_ } => {
1315
1315
let id =
1316
1316
cx. derive_id ( small_url_encode ( format ! ( "deref-methods-{:#}" , type_. print( cx) ) ) ) ;
1317
+ // the `impls.get` above only looks at the outermost type,
1318
+ // and the Deref impl may only be implemented for certain
1319
+ // values of generic parameters.
1320
+ // for example, if an item impls `Deref<[u8]>`,
1321
+ // we should not show methods from `[MaybeUninit<u8>]`.
1322
+ // this `retain` filters out any instances where
1323
+ // the types do not line up perfectly.
1324
+ non_trait. retain ( |impl_| {
1325
+ type_. is_doc_subtype_of ( & impl_. inner_impl ( ) . for_ , & cx. shared . cache )
1326
+ } ) ;
1317
1327
let derived_id = cx. derive_id ( & id) ;
1318
1328
close_tags. push ( "</details>" ) ;
1319
1329
write_str (
@@ -1392,6 +1402,7 @@ fn render_assoc_items_inner(
1392
1402
}
1393
1403
}
1394
1404
1405
+ /// `derefs` is the set of all deref targets that have already been handled.
1395
1406
fn render_deref_methods (
1396
1407
mut w : impl Write ,
1397
1408
cx : & Context < ' _ > ,
0 commit comments