From 93a713390eb16cd1726ecf165020e1c658ea09cd Mon Sep 17 00:00:00 2001 From: Bryanskiy Date: Tue, 30 Jul 2024 21:38:28 +0300 Subject: [PATCH] Delegation: querify `sig_id` getter --- .../src/collect/generics_of.rs | 2 +- .../src/collect/predicates_of.rs | 2 +- compiler/rustc_hir_analysis/src/delegation.rs | 20 +++++++++++++++++-- compiler/rustc_hir_analysis/src/lib.rs | 5 +---- compiler/rustc_middle/src/hir/map/mod.rs | 15 -------------- compiler/rustc_middle/src/query/mod.rs | 4 ++++ 6 files changed, 25 insertions(+), 23 deletions(-) diff --git a/compiler/rustc_hir_analysis/src/collect/generics_of.rs b/compiler/rustc_hir_analysis/src/collect/generics_of.rs index 80a65aa298851..d9d30dbbdaae9 100644 --- a/compiler/rustc_hir_analysis/src/collect/generics_of.rs +++ b/compiler/rustc_hir_analysis/src/collect/generics_of.rs @@ -55,7 +55,7 @@ pub(super) fn generics_of(tcx: TyCtxt<'_>, def_id: LocalDefId) -> ty::Generics { } // For a delegation item inherit generics from callee. - if let Some(sig_id) = tcx.hir().opt_delegation_sig_id(def_id) + if let Some(sig_id) = tcx.opt_delegation_sig_id(def_id) && let Some(generics) = inherit_generics_for_delegation_item(tcx, def_id, sig_id) { return generics; diff --git a/compiler/rustc_hir_analysis/src/collect/predicates_of.rs b/compiler/rustc_hir_analysis/src/collect/predicates_of.rs index ae52dbd56f9b7..7cb70a74e208f 100644 --- a/compiler/rustc_hir_analysis/src/collect/predicates_of.rs +++ b/compiler/rustc_hir_analysis/src/collect/predicates_of.rs @@ -116,7 +116,7 @@ fn gather_explicit_predicates_of(tcx: TyCtxt<'_>, def_id: LocalDefId) -> ty::Gen } // For a delegation item inherit predicates from callee. - if let Some(sig_id) = tcx.hir().opt_delegation_sig_id(def_id) + if let Some(sig_id) = tcx.opt_delegation_sig_id(def_id) && let Some(predicates) = inherit_predicates_for_delegation_item(tcx, def_id, sig_id) { return predicates; diff --git a/compiler/rustc_hir_analysis/src/delegation.rs b/compiler/rustc_hir_analysis/src/delegation.rs index e21ed55bce3fc..769dee8e1f468 100644 --- a/compiler/rustc_hir_analysis/src/delegation.rs +++ b/compiler/rustc_hir_analysis/src/delegation.rs @@ -1,6 +1,8 @@ use rustc_data_structures::fx::FxHashMap; +use rustc_hir as hir; use rustc_hir::def::DefKind; use rustc_hir::def_id::{DefId, LocalDefId}; +use rustc_middle::query::Providers; use rustc_middle::ty::fold::{TypeFoldable, TypeFolder, TypeSuperFoldable}; use rustc_middle::ty::{self, Ty, TyCtxt}; use rustc_span::ErrorGuaranteed; @@ -217,7 +219,7 @@ fn check_constraints<'tcx>( } if let Some(local_sig_id) = sig_id.as_local() - && tcx.hir().opt_delegation_sig_id(local_sig_id).is_some() + && tcx.opt_delegation_sig_id(local_sig_id).is_some() { emit("recursive delegation is not supported yet"); } @@ -242,7 +244,7 @@ pub(crate) fn inherit_sig_for_delegation_item<'tcx>( tcx: TyCtxt<'tcx>, def_id: LocalDefId, ) -> &'tcx [Ty<'tcx>] { - let sig_id = tcx.hir().delegation_sig_id(def_id); + let sig_id = tcx.opt_delegation_sig_id(def_id).unwrap(); let caller_sig = tcx.fn_sig(sig_id); if let Err(err) = check_constraints(tcx, def_id, sig_id) { let sig_len = caller_sig.instantiate_identity().skip_binder().inputs().len() + 1; @@ -257,3 +259,17 @@ pub(crate) fn inherit_sig_for_delegation_item<'tcx>( let sig_iter = sig.inputs().iter().cloned().chain(std::iter::once(sig.output())); tcx.arena.alloc_from_iter(sig_iter) } + +pub(crate) fn opt_delegation_sig_id<'tcx>(tcx: TyCtxt<'tcx>, def_id: LocalDefId) -> Option { + if let Some(ret) = tcx.hir().get_fn_output(def_id) + && let hir::FnRetTy::Return(ty) = ret + && let hir::TyKind::InferDelegation(sig_id, _) = ty.kind + { + return Some(sig_id); + } + None +} + +pub fn provide(providers: &mut Providers) { + *providers = Providers { inherit_sig_for_delegation_item, opt_delegation_sig_id, ..*providers }; +} diff --git a/compiler/rustc_hir_analysis/src/lib.rs b/compiler/rustc_hir_analysis/src/lib.rs index 061db14ad0a61..fe6991e51b366 100644 --- a/compiler/rustc_hir_analysis/src/lib.rs +++ b/compiler/rustc_hir_analysis/src/lib.rs @@ -147,10 +147,7 @@ pub fn provide(providers: &mut Providers) { variance::provide(providers); outlives::provide(providers); hir_wf_check::provide(providers); - *providers = Providers { - inherit_sig_for_delegation_item: delegation::inherit_sig_for_delegation_item, - ..*providers - }; + delegation::provide(providers); } pub fn check_crate(tcx: TyCtxt<'_>) { diff --git a/compiler/rustc_middle/src/hir/map/mod.rs b/compiler/rustc_middle/src/hir/map/mod.rs index 1705c016437cc..1c223481a0769 100644 --- a/compiler/rustc_middle/src/hir/map/mod.rs +++ b/compiler/rustc_middle/src/hir/map/mod.rs @@ -746,21 +746,6 @@ impl<'hir> Map<'hir> { } } - pub fn opt_delegation_sig_id(self, def_id: LocalDefId) -> Option { - if let Some(ret) = self.get_fn_output(def_id) - && let FnRetTy::Return(ty) = ret - && let TyKind::InferDelegation(sig_id, _) = ty.kind - { - return Some(sig_id); - } - None - } - - #[inline] - pub fn delegation_sig_id(self, def_id: LocalDefId) -> DefId { - self.opt_delegation_sig_id(def_id).unwrap() - } - #[inline] fn opt_ident(self, id: HirId) -> Option { match self.tcx.hir_node(id) { diff --git a/compiler/rustc_middle/src/query/mod.rs b/compiler/rustc_middle/src/query/mod.rs index c22c2e985abba..654c8739dff4c 100644 --- a/compiler/rustc_middle/src/query/mod.rs +++ b/compiler/rustc_middle/src/query/mod.rs @@ -1722,6 +1722,10 @@ rustc_queries! { desc { |tcx| "getting the native library for `{}`", tcx.def_path_str(def_id) } } + query opt_delegation_sig_id(def_id: LocalDefId) -> Option { + desc { "getting the item from which the signature is inherited when delegating" } + } + query inherit_sig_for_delegation_item(def_id: LocalDefId) -> &'tcx [Ty<'tcx>] { desc { "inheriting delegation signature" } }