Don't opt_rpitit_info as a separate query
This commit is contained in:
parent
f1b1ed7e18
commit
ce8dae5800
@ -1338,6 +1338,7 @@ impl<'tcx> Pick<'tcx> {
|
|||||||
container: _,
|
container: _,
|
||||||
trait_item_def_id: _,
|
trait_item_def_id: _,
|
||||||
fn_has_self_parameter: _,
|
fn_has_self_parameter: _,
|
||||||
|
opt_rpitit_info: _,
|
||||||
},
|
},
|
||||||
kind: _,
|
kind: _,
|
||||||
import_ids: _,
|
import_ids: _,
|
||||||
|
@ -1096,6 +1096,8 @@ impl<'a, 'tcx> CrateMetadataRef<'a> {
|
|||||||
trait_item_def_id: self.get_trait_item_def_id(id),
|
trait_item_def_id: self.get_trait_item_def_id(id),
|
||||||
container,
|
container,
|
||||||
fn_has_self_parameter: has_self,
|
fn_has_self_parameter: has_self,
|
||||||
|
// FIXME(-Zlower-impl-trait-in-trait-to-assoc-ty): We need to encode this
|
||||||
|
opt_rpitit_info: None,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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_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.all_local_trait_impls = |tcx, ()| &tcx.resolutions(()).trait_impls;
|
||||||
providers.expn_that_defined = |tcx, id| {
|
providers.expn_that_defined = |tcx, id| {
|
||||||
let id = id.expect_local();
|
let id = id.expect_local();
|
||||||
|
@ -1161,14 +1161,6 @@ rustc_queries! {
|
|||||||
feedable
|
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.
|
/// Gets the span for the definition.
|
||||||
query def_span(def_id: DefId) -> Span {
|
query def_span(def_id: DefId) -> Span {
|
||||||
desc { |tcx| "looking up span for `{}`", tcx.def_path_str(def_id) }
|
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
|
/// Whether this is a method with an explicit self
|
||||||
/// as its first parameter, allowing method calls.
|
/// as its first parameter, allowing method calls.
|
||||||
pub fn_has_self_parameter: bool,
|
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 {
|
impl AssocItem {
|
||||||
|
@ -2452,7 +2452,7 @@ impl<'tcx> TyCtxt<'tcx> {
|
|||||||
|
|
||||||
pub fn is_impl_trait_in_trait(self, def_id: DefId) -> bool {
|
pub fn is_impl_trait_in_trait(self, def_id: DefId) -> bool {
|
||||||
if self.lower_impl_trait_in_trait_to_assoc_ty() {
|
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 {
|
} else {
|
||||||
self.def_kind(def_id) == DefKind::ImplTraitPlaceholder
|
self.def_kind(def_id) == DefKind::ImplTraitPlaceholder
|
||||||
}
|
}
|
||||||
|
@ -2070,7 +2070,9 @@ pub enum ImplOverlapKind {
|
|||||||
Issue33140,
|
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 {
|
pub enum ImplTraitInTraitData {
|
||||||
Trait { fn_def_id: DefId, opaque_def_id: DefId },
|
Trait { fn_def_id: DefId, opaque_def_id: DefId },
|
||||||
Impl { fn_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> {
|
pub fn find_field_index(self, ident: Ident, variant: &VariantDef) -> Option<usize> {
|
||||||
variant
|
variant
|
||||||
.fields
|
.fields
|
||||||
|
@ -244,7 +244,7 @@ impl<'tcx> MarkSymbolVisitor<'tcx> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Avoid accessing the HIR for the synthesized associated type generated for RPITITs.
|
// Avoid accessing the HIR for the synthesized associated type generated for RPITITs.
|
||||||
if self.tcx.opt_rpitit_info(id).is_some() {
|
if self.tcx.opt_rpitit_info(id.to_def_id()).is_some() {
|
||||||
self.live_symbols.insert(id);
|
self.live_symbols.insert(id);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@ -153,6 +153,7 @@ fn associated_item_from_trait_item_ref(trait_item_ref: &hir::TraitItemRef) -> ty
|
|||||||
trait_item_def_id: Some(owner_id.to_def_id()),
|
trait_item_def_id: Some(owner_id.to_def_id()),
|
||||||
container: ty::TraitContainer,
|
container: ty::TraitContainer,
|
||||||
fn_has_self_parameter: has_self,
|
fn_has_self_parameter: has_self,
|
||||||
|
opt_rpitit_info: None,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -171,6 +172,7 @@ fn associated_item_from_impl_item_ref(impl_item_ref: &hir::ImplItemRef) -> ty::A
|
|||||||
trait_item_def_id: impl_item_ref.trait_item_def_id,
|
trait_item_def_id: impl_item_ref.trait_item_def_id,
|
||||||
container: ty::ImplContainer,
|
container: ty::ImplContainer,
|
||||||
fn_has_self_parameter: has_self,
|
fn_has_self_parameter: has_self,
|
||||||
|
opt_rpitit_info: None,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -262,12 +264,6 @@ fn associated_item_for_impl_trait_in_trait(
|
|||||||
// Copy span of the opaque.
|
// Copy span of the opaque.
|
||||||
trait_assoc_ty.def_ident_span(Some(span));
|
trait_assoc_ty.def_ident_span(Some(span));
|
||||||
|
|
||||||
// Add the def_id of the function and opaque that generated this synthesized associated type.
|
|
||||||
trait_assoc_ty.opt_rpitit_info(Some(ImplTraitInTraitData::Trait {
|
|
||||||
fn_def_id,
|
|
||||||
opaque_def_id: opaque_ty_def_id.to_def_id(),
|
|
||||||
}));
|
|
||||||
|
|
||||||
trait_assoc_ty.associated_item(ty::AssocItem {
|
trait_assoc_ty.associated_item(ty::AssocItem {
|
||||||
name: kw::Empty,
|
name: kw::Empty,
|
||||||
kind: ty::AssocKind::Type,
|
kind: ty::AssocKind::Type,
|
||||||
@ -275,6 +271,10 @@ fn associated_item_for_impl_trait_in_trait(
|
|||||||
trait_item_def_id: None,
|
trait_item_def_id: None,
|
||||||
container: ty::TraitContainer,
|
container: ty::TraitContainer,
|
||||||
fn_has_self_parameter: false,
|
fn_has_self_parameter: false,
|
||||||
|
opt_rpitit_info: Some(ImplTraitInTraitData::Trait {
|
||||||
|
fn_def_id,
|
||||||
|
opaque_def_id: opaque_ty_def_id.to_def_id(),
|
||||||
|
}),
|
||||||
});
|
});
|
||||||
|
|
||||||
// Copy visility of the containing function.
|
// Copy visility of the containing function.
|
||||||
@ -328,11 +328,6 @@ fn impl_associated_item_for_impl_trait_in_trait(
|
|||||||
// `opt_local_def_id_to_hir_id` with `None`.
|
// `opt_local_def_id_to_hir_id` with `None`.
|
||||||
impl_assoc_ty.opt_local_def_id_to_hir_id(None);
|
impl_assoc_ty.opt_local_def_id_to_hir_id(None);
|
||||||
|
|
||||||
// Add the def_id of the function that generated this synthesized associated type.
|
|
||||||
impl_assoc_ty.opt_rpitit_info(Some(ImplTraitInTraitData::Impl {
|
|
||||||
fn_def_id: impl_fn_def_id.to_def_id(),
|
|
||||||
}));
|
|
||||||
|
|
||||||
impl_assoc_ty.associated_item(ty::AssocItem {
|
impl_assoc_ty.associated_item(ty::AssocItem {
|
||||||
name: kw::Empty,
|
name: kw::Empty,
|
||||||
kind: ty::AssocKind::Type,
|
kind: ty::AssocKind::Type,
|
||||||
@ -340,6 +335,7 @@ fn impl_associated_item_for_impl_trait_in_trait(
|
|||||||
trait_item_def_id: Some(trait_assoc_def_id.to_def_id()),
|
trait_item_def_id: Some(trait_assoc_def_id.to_def_id()),
|
||||||
container: ty::ImplContainer,
|
container: ty::ImplContainer,
|
||||||
fn_has_self_parameter: false,
|
fn_has_self_parameter: false,
|
||||||
|
opt_rpitit_info: Some(ImplTraitInTraitData::Impl { fn_def_id: impl_fn_def_id.to_def_id() }),
|
||||||
});
|
});
|
||||||
|
|
||||||
// Copy param_env of the containing function. The synthesized associated type doesn't have
|
// Copy param_env of the containing function. The synthesized associated type doesn't have
|
||||||
|
Loading…
x
Reference in New Issue
Block a user