Skip to content

Commit 704ddc4

Browse files
committed
rustdoc: be more strict about "Methods from Deref"
Note that this does not yet fix the sidebar logic.
1 parent d497e43 commit 704ddc4

File tree

1 file changed

+14
-2
lines changed
  • src/librustdoc/html/render

1 file changed

+14
-2
lines changed

src/librustdoc/html/render/mod.rs

+14-2
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ pub(crate) fn ensure_trailing_slash(v: &str) -> impl fmt::Display {
8989

9090
/// Specifies whether rendering directly implemented trait items or ones from a certain Deref
9191
/// impl.
92-
#[derive(Copy, Clone)]
92+
#[derive(Copy, Clone, Debug)]
9393
pub(crate) enum AssocItemRender<'a> {
9494
All,
9595
DerefFor { trait_: &'a clean::Path, type_: &'a clean::Type, deref_mut_: bool },
@@ -1296,7 +1296,8 @@ fn render_assoc_items_inner(
12961296
info!("Documenting associated items of {:?}", containing_item.name);
12971297
let cache = &cx.shared.cache;
12981298
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<_>, _) =
1300+
v.iter().partition(|i| i.inner_impl().trait_.is_none());
13001301
if !non_trait.is_empty() {
13011302
let mut close_tags = <Vec<&str>>::with_capacity(1);
13021303
let mut tmp_buf = String::new();
@@ -1314,6 +1315,16 @@ fn render_assoc_items_inner(
13141315
AssocItemRender::DerefFor { trait_, type_, deref_mut_ } => {
13151316
let id =
13161317
cx.derive_id(small_url_encode(format!("deref-methods-{:#}", type_.print(cx))));
1318+
// the `impls.get` above only looks at the outermost type,
1319+
// and the Deref impl may only be implemented for certain
1320+
// values of generic parameters.
1321+
// for example, if an item impls `Deref<[u8]>`,
1322+
// we should not show methods from `[MaybeUninit<u8>]`.
1323+
// this `retain` filters out any instances where
1324+
// the types do not line up perfectly.
1325+
non_trait.retain(|impl_| {
1326+
type_.is_doc_subtype_of(&impl_.inner_impl().for_, &cx.shared.cache)
1327+
});
13171328
let derived_id = cx.derive_id(&id);
13181329
close_tags.push("</details>");
13191330
write_str(
@@ -1392,6 +1403,7 @@ fn render_assoc_items_inner(
13921403
}
13931404
}
13941405

1406+
/// `derefs` is the set of all deref targets that have already been handled.
13951407
fn render_deref_methods(
13961408
mut w: impl Write,
13971409
cx: &Context<'_>,

0 commit comments

Comments
 (0)