From e701e64d59b8666161ca526a3c1bf3048019c8d9 Mon Sep 17 00:00:00 2001 From: Michael Howell Date: Thu, 5 Oct 2023 18:44:48 -0700 Subject: [PATCH] Revert "rustdoc: list matching impls on type aliases" This reverts commit 19edb3ce808ee2b1190026b9d56cc6187e1ad9b1. --- src/librustdoc/html/render/mod.rs | 46 ++---------------- tests/rustdoc/type-alias-impls-32077.rs | 62 ------------------------- 2 files changed, 4 insertions(+), 104 deletions(-) delete mode 100644 tests/rustdoc/type-alias-impls-32077.rs diff --git a/src/librustdoc/html/render/mod.rs b/src/librustdoc/html/render/mod.rs index 029ad750f5b..51cc836cd15 100644 --- a/src/librustdoc/html/render/mod.rs +++ b/src/librustdoc/html/render/mod.rs @@ -63,7 +63,6 @@ use rustc_span::{ use serde::ser::{SerializeMap, SerializeSeq}; use serde::{Serialize, Serializer}; -use crate::clean::types::TypeAliasItem; use crate::clean::{self, ItemId, RenderedLink, SelfTy}; use crate::error::Error; use crate::formats::cache::Cache; @@ -1156,40 +1155,8 @@ fn render_assoc_items_inner( info!("Documenting associated items of {:?}", containing_item.name); let shared = Rc::clone(&cx.shared); let cache = &shared.cache; - let tcx = cx.tcx(); - let av = if let TypeAliasItem(ait) = &*containing_item.kind && - let aliased_clean_type = ait.item_type.as_ref().unwrap_or(&ait.type_) && - let Some(aliased_type_defid) = aliased_clean_type.def_id(cache) && - let Some(mut av) = cache.impls.get(&aliased_type_defid).cloned() && - let Some(alias_def_id) = containing_item.item_id.as_def_id() - { - // This branch of the compiler compares types structually, but does - // not check trait bounds. That's probably fine, since type aliases - // don't normally constrain on them anyway. - // https://github.com/rust-lang/rust/issues/21903 - // - // If that changes, then this will need to check them with type - // unification. - let aliased_ty = tcx.type_of(alias_def_id).skip_binder(); - let reject_cx = DeepRejectCtxt { - treat_obligation_params: TreatParams::AsCandidateKey, - }; - av.retain(|impl_| { - if let Some(impl_def_id) = impl_.impl_item.item_id.as_def_id() { - reject_cx.types_may_unify(aliased_ty, tcx.type_of(impl_def_id).skip_binder()) - } else { - false - } - }); - av - } else { - Vec::new() - }; - let blank = Vec::new(); - let v = cache.impls.get(&it).unwrap_or(&blank); - let (non_trait, traits): (Vec<_>, _) = - v.iter().chain(&av[..]).partition(|i| i.inner_impl().trait_.is_none()); - let mut saw_impls = FxHashSet::default(); + let Some(v) = cache.impls.get(&it) else { return }; + let (non_trait, traits): (Vec<_>, _) = v.iter().partition(|i| i.inner_impl().trait_.is_none()); if !non_trait.is_empty() { let mut tmp_buf = Buffer::html(); let (render_mode, id, class_html) = match what { @@ -1218,9 +1185,6 @@ fn render_assoc_items_inner( }; let mut impls_buf = Buffer::html(); for i in &non_trait { - if !saw_impls.insert(i.def_id()) { - continue; - } render_impl( &mut impls_buf, cx, @@ -1266,10 +1230,8 @@ fn render_assoc_items_inner( let (synthetic, concrete): (Vec<&Impl>, Vec<&Impl>) = traits.into_iter().partition(|t| t.inner_impl().kind.is_auto()); - let (blanket_impl, concrete): (Vec<&Impl>, _) = concrete - .into_iter() - .filter(|t| saw_impls.insert(t.def_id())) - .partition(|t| t.inner_impl().kind.is_blanket()); + let (blanket_impl, concrete): (Vec<&Impl>, _) = + concrete.into_iter().partition(|t| t.inner_impl().kind.is_blanket()); render_all_impls(w, cx, containing_item, &concrete, &synthetic, &blanket_impl); } diff --git a/tests/rustdoc/type-alias-impls-32077.rs b/tests/rustdoc/type-alias-impls-32077.rs deleted file mode 100644 index 2108749d1a6..00000000000 --- a/tests/rustdoc/type-alias-impls-32077.rs +++ /dev/null @@ -1,62 +0,0 @@ -// Regression test for . - -// https://github.com/rust-lang/rust/issues/32077 -#![crate_name = "foo"] - -pub struct GenericStruct(T); - -impl GenericStruct { - pub fn on_gen(arg: T) {} -} - -impl GenericStruct { - pub fn on_u32(arg: u32) {} -} - -pub trait Foo {} -pub trait Bar {} - -impl Foo for GenericStruct {} -impl Bar for GenericStruct {} - -// @has 'foo/type.TypedefStruct.html' -// We check that "Aliased type" is also present as a title in the sidebar. -// @has - '//*[@class="sidebar-elems"]//h3/a[@href="#aliased-type"]' 'Aliased type' -// We check that we have the implementation of the type alias itself. -// @has - '//*[@id="impl-GenericStruct%3Cu8%3E"]/h3' 'impl TypedefStruct' -// @has - '//*[@id="method.on_alias"]/h4' 'pub fn on_alias()' -// @has - '//*[@id="impl-GenericStruct%3CT%3E"]/h3' 'impl GenericStruct' -// @has - '//*[@id="method.on_gen"]/h4' 'pub fn on_gen(arg: T)' -// @has - '//*[@id="impl-Foo-for-GenericStruct%3CT%3E"]/h3' 'impl Foo for GenericStruct' -// This trait implementation doesn't match the type alias parameters so shouldn't appear in docs. -// @!has - '//h3' 'impl Bar for GenericStruct {}' -// Same goes for the `Deref` impl. -// @!has - '//h2' 'Methods from Deref' -pub type TypedefStruct = GenericStruct; - -impl TypedefStruct { - pub fn on_alias() {} -} - -impl std::ops::Deref for GenericStruct { - type Target = u32; - - fn deref(&self) -> &Self::Target { - &self.0 - } -} - -pub struct Wrap(GenericStruct); - -// @has 'foo/type.Alias.html' -// @has - '//h2' 'Methods from Deref' -// @has - '//*[@id="impl-Deref-for-Wrap%3CT%3E"]/h3' 'impl Deref for Wrap' -pub type Alias = Wrap; - -impl std::ops::Deref for Wrap { - type Target = GenericStruct; - - fn deref(&self) -> &Self::Target { - &self.0 - } -}