diff options
| author | Michael Goulet <michael@errs.io> | 2025-07-12 19:31:15 +0000 |
|---|---|---|
| committer | Michael Goulet <michael@errs.io> | 2025-07-12 19:31:15 +0000 |
| commit | 736bfa12de73155633261ca6682b9d5e72d32c6d (patch) | |
| tree | 62418db9b52b125a3af1b7058fe814d1b1fae1b1 /compiler/rustc_middle/src | |
| parent | 47e15d90e13b5238117971298a3573ddebd87a40 (diff) | |
| download | rust-736bfa12de73155633261ca6682b9d5e72d32c6d.tar.gz rust-736bfa12de73155633261ca6682b9d5e72d32c6d.zip | |
Clean up implementation of RPITIT assoc item lowering
Diffstat (limited to 'compiler/rustc_middle/src')
| -rw-r--r-- | compiler/rustc_middle/src/query/mod.rs | 6 | ||||
| -rw-r--r-- | compiler/rustc_middle/src/ty/assoc.rs | 36 | ||||
| -rw-r--r-- | compiler/rustc_middle/src/ty/mod.rs | 3 | ||||
| -rw-r--r-- | compiler/rustc_middle/src/ty/parameterized.rs | 5 |
4 files changed, 27 insertions, 23 deletions
diff --git a/compiler/rustc_middle/src/query/mod.rs b/compiler/rustc_middle/src/query/mod.rs index 3da6c6f5fe1..842d118449a 100644 --- a/compiler/rustc_middle/src/query/mod.rs +++ b/compiler/rustc_middle/src/query/mod.rs @@ -1079,9 +1079,11 @@ rustc_queries! { desc { |tcx| "comparing impl items against trait for `{}`", tcx.def_path_str(impl_id) } } - query associated_types_for_impl_traits_in_trait_or_impl(did: DefId) -> &'tcx ty::AssocTyForImplTraitInTraitOrImpl { + /// Given the `item_def_id` of a trait or impl, return a mapping from associated fn def id + /// to its associated type items that correspond to the RPITITs in its signature. + query associated_types_for_impl_traits_in_trait_or_impl(item_def_id: DefId) -> &'tcx DefIdMap<Vec<DefId>> { arena_cache - desc { |tcx| "creating rpitit for `{}`", tcx.def_path_str(did) } + desc { |tcx| "synthesizing RPITIT items for the opaque types for methods in `{}`", tcx.def_path_str(item_def_id) } separate_provide_extern } diff --git a/compiler/rustc_middle/src/ty/assoc.rs b/compiler/rustc_middle/src/ty/assoc.rs index 99714171c72..9534d45e495 100644 --- a/compiler/rustc_middle/src/ty/assoc.rs +++ b/compiler/rustc_middle/src/ty/assoc.rs @@ -1,5 +1,4 @@ use rustc_attr_data_structures::{AttributeKind, find_attr}; -use rustc_data_structures::fx::FxIndexMap; use rustc_data_structures::sorted_map::SortedIndexMultiMap; use rustc_hir as hir; use rustc_hir::def::{DefKind, Namespace}; @@ -287,22 +286,21 @@ impl AssocItems { } } -#[derive(Debug, Clone, PartialEq, Encodable, Decodable, HashStable)] -pub struct AssocTyForImplTraitInTraitOrImpl(pub FxIndexMap<DefId, Vec<DefId>>); - -/// Given an `fn_def_id` of a trait or a trait implementation: -/// -/// if `fn_def_id` is a function defined inside a trait, then it synthesizes -/// a new def id corresponding to a new associated type for each return- -/// position `impl Trait` in the signature. -/// -/// if `fn_def_id` is a function inside of an impl, then for each synthetic -/// associated type generated for the corresponding trait function described -/// above, synthesize a corresponding associated type in the impl. -pub fn associated_types_for_impl_traits_in_associated_fn( - tcx: TyCtxt<'_>, - fn_def_id: DefId, -) -> &'_ [DefId] { - let parent_def_id = tcx.parent(fn_def_id); - &tcx.associated_types_for_impl_traits_in_trait_or_impl(parent_def_id).0[&fn_def_id] +impl<'tcx> TyCtxt<'tcx> { + /// Given an `fn_def_id` of a trait or a trait implementation: + /// + /// if `fn_def_id` is a function defined inside a trait, then it synthesizes + /// a new def id corresponding to a new associated type for each return- + /// position `impl Trait` in the signature. + /// + /// if `fn_def_id` is a function inside of an impl, then for each synthetic + /// associated type generated for the corresponding trait function described + /// above, synthesize a corresponding associated type in the impl. + pub fn associated_types_for_impl_traits_in_associated_fn( + self, + fn_def_id: DefId, + ) -> &'tcx [DefId] { + let parent_def_id = self.parent(fn_def_id); + &self.associated_types_for_impl_traits_in_trait_or_impl(parent_def_id)[&fn_def_id] + } } diff --git a/compiler/rustc_middle/src/ty/mod.rs b/compiler/rustc_middle/src/ty/mod.rs index e1b11e4f54a..0177a95498b 100644 --- a/compiler/rustc_middle/src/ty/mod.rs +++ b/compiler/rustc_middle/src/ty/mod.rs @@ -2194,7 +2194,8 @@ impl<'tcx> TyCtxt<'tcx> { return false; }; - return !associated_types_for_impl_traits_in_associated_fn(self, trait_item_def_id) + return !self + .associated_types_for_impl_traits_in_associated_fn(trait_item_def_id) .is_empty(); } } diff --git a/compiler/rustc_middle/src/ty/parameterized.rs b/compiler/rustc_middle/src/ty/parameterized.rs index 88f6e717af4..3d601fc0533 100644 --- a/compiler/rustc_middle/src/ty/parameterized.rs +++ b/compiler/rustc_middle/src/ty/parameterized.rs @@ -23,6 +23,10 @@ impl<A: ParameterizedOverTcx, B: ParameterizedOverTcx> ParameterizedOverTcx for type Value<'tcx> = (A::Value<'tcx>, B::Value<'tcx>); } +impl<T: ParameterizedOverTcx> ParameterizedOverTcx for Vec<T> { + type Value<'tcx> = Vec<T::Value<'tcx>>; +} + impl<I: Idx + 'static, T: ParameterizedOverTcx> ParameterizedOverTcx for IndexVec<I, T> { type Value<'tcx> = IndexVec<I, T::Value<'tcx>>; } @@ -67,7 +71,6 @@ trivially_parameterized_over_tcx! { crate::mir::ConstQualifs, ty::AsyncDestructor, ty::AssocItemContainer, - ty::AssocTyForImplTraitInTraitOrImpl, ty::Asyncness, ty::AnonConstKind, ty::DeducedParamAttrs, |
