Don't opt_rpitit_info as a separate query
This commit is contained in:
parent
f1b1ed7e18
commit
ce8dae5800
9 changed files with 31 additions and 23 deletions
|
@ -177,7 +177,6 @@ pub fn provide(providers: &mut Providers) {
|
|||
}
|
||||
};
|
||||
providers.opt_def_kind = |tcx, def_id| tcx.hir().opt_def_kind(def_id.expect_local());
|
||||
providers.opt_rpitit_info = |_, _| None;
|
||||
providers.all_local_trait_impls = |tcx, ()| &tcx.resolutions(()).trait_impls;
|
||||
providers.expn_that_defined = |tcx, id| {
|
||||
let id = id.expect_local();
|
||||
|
|
|
@ -1161,14 +1161,6 @@ rustc_queries! {
|
|||
feedable
|
||||
}
|
||||
|
||||
/// The `opt_rpitit_info` query returns the pair of the def id of the function where the RPIT
|
||||
/// is defined and the opaque def id if any.
|
||||
query opt_rpitit_info(def_id: DefId) -> Option<ty::ImplTraitInTraitData> {
|
||||
desc { |tcx| "opt_rpitit_info `{}`", tcx.def_path_str(def_id) }
|
||||
cache_on_disk_if { def_id.is_local() }
|
||||
feedable
|
||||
}
|
||||
|
||||
/// Gets the span for the definition.
|
||||
query def_span(def_id: DefId) -> Span {
|
||||
desc { |tcx| "looking up span for `{}`", tcx.def_path_str(def_id) }
|
||||
|
|
|
@ -30,6 +30,11 @@ pub struct AssocItem {
|
|||
/// Whether this is a method with an explicit self
|
||||
/// as its first parameter, allowing method calls.
|
||||
pub fn_has_self_parameter: bool,
|
||||
|
||||
/// `Some` if the associated item (an associated type) comes from the
|
||||
/// return-position `impl Trait` in trait desugaring. The `ImplTraitInTraitData`
|
||||
/// provides additional information about its source.
|
||||
pub opt_rpitit_info: Option<ty::ImplTraitInTraitData>,
|
||||
}
|
||||
|
||||
impl AssocItem {
|
||||
|
|
|
@ -2452,7 +2452,7 @@ impl<'tcx> TyCtxt<'tcx> {
|
|||
|
||||
pub fn is_impl_trait_in_trait(self, def_id: DefId) -> bool {
|
||||
if self.lower_impl_trait_in_trait_to_assoc_ty() {
|
||||
self.def_kind(def_id) == DefKind::AssocTy && self.opt_rpitit_info(def_id).is_some()
|
||||
self.opt_rpitit_info(def_id).is_some()
|
||||
} else {
|
||||
self.def_kind(def_id) == DefKind::ImplTraitPlaceholder
|
||||
}
|
||||
|
|
|
@ -2070,7 +2070,9 @@ pub enum ImplOverlapKind {
|
|||
Issue33140,
|
||||
}
|
||||
|
||||
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, TyEncodable, TyDecodable, HashStable)]
|
||||
/// Useful source information about where a desugared associated type for an
|
||||
/// RPITIT originated from.
|
||||
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, Encodable, Decodable, HashStable)]
|
||||
pub enum ImplTraitInTraitData {
|
||||
Trait { fn_def_id: DefId, opaque_def_id: DefId },
|
||||
Impl { fn_def_id: DefId },
|
||||
|
@ -2213,6 +2215,17 @@ impl<'tcx> TyCtxt<'tcx> {
|
|||
}
|
||||
}
|
||||
|
||||
/// If the def-id is an associated type that was desugared from a
|
||||
/// return-position `impl Trait` from a trait, then provide the source info
|
||||
/// about where that RPITIT came from.
|
||||
pub fn opt_rpitit_info(self, def_id: DefId) -> Option<ImplTraitInTraitData> {
|
||||
if let DefKind::AssocTy = self.def_kind(def_id) {
|
||||
self.associated_item(def_id).opt_rpitit_info
|
||||
} else {
|
||||
None
|
||||
}
|
||||
}
|
||||
|
||||
pub fn find_field_index(self, ident: Ident, variant: &VariantDef) -> Option<usize> {
|
||||
variant
|
||||
.fields
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue