diff options
| author | Michael Howell <michael@notriddle.com> | 2023-10-05 18:44:48 -0700 |
|---|---|---|
| committer | Michael Howell <michael@notriddle.com> | 2023-10-22 15:55:43 -0700 |
| commit | e701e64d59b8666161ca526a3c1bf3048019c8d9 (patch) | |
| tree | 8a3cf481740761852f048002ab7e1b7788dc5aa5 | |
| parent | 77da7c655ee2583f336f23f61246bc0885beaf5d (diff) | |
| download | rust-e701e64d59b8666161ca526a3c1bf3048019c8d9.tar.gz rust-e701e64d59b8666161ca526a3c1bf3048019c8d9.zip | |
Revert "rustdoc: list matching impls on type aliases"
This reverts commit 19edb3ce808ee2b1190026b9d56cc6187e1ad9b1.
| -rw-r--r-- | src/librustdoc/html/render/mod.rs | 46 | ||||
| -rw-r--r-- | tests/rustdoc/type-alias-impls-32077.rs | 62 |
2 files changed, 4 insertions, 104 deletions
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>. - -// https://github.com/rust-lang/rust/issues/32077 -#![crate_name = "foo"] - -pub struct GenericStruct<T>(T); - -impl<T> GenericStruct<T> { - pub fn on_gen(arg: T) {} -} - -impl GenericStruct<u32> { - pub fn on_u32(arg: u32) {} -} - -pub trait Foo {} -pub trait Bar {} - -impl<T> Foo for GenericStruct<T> {} -impl Bar for GenericStruct<u32> {} - -// @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<T> GenericStruct<T>' -// @has - '//*[@id="method.on_gen"]/h4' 'pub fn on_gen(arg: T)' -// @has - '//*[@id="impl-Foo-for-GenericStruct%3CT%3E"]/h3' 'impl<T> Foo for GenericStruct<T>' -// This trait implementation doesn't match the type alias parameters so shouldn't appear in docs. -// @!has - '//h3' 'impl Bar for GenericStruct<u32> {}' -// Same goes for the `Deref` impl. -// @!has - '//h2' 'Methods from Deref<Target = u32>' -pub type TypedefStruct = GenericStruct<u8>; - -impl TypedefStruct { - pub fn on_alias() {} -} - -impl std::ops::Deref for GenericStruct<u32> { - type Target = u32; - - fn deref(&self) -> &Self::Target { - &self.0 - } -} - -pub struct Wrap<T>(GenericStruct<T>); - -// @has 'foo/type.Alias.html' -// @has - '//h2' 'Methods from Deref<Target = u32>' -// @has - '//*[@id="impl-Deref-for-Wrap%3CT%3E"]/h3' 'impl<T> Deref for Wrap<T>' -pub type Alias = Wrap<u32>; - -impl<T> std::ops::Deref for Wrap<T> { - type Target = GenericStruct<T>; - - fn deref(&self) -> &Self::Target { - &self.0 - } -} |
