Auto merge of #95884 - cjgillot:assoc-item, r=lcnr
Thin `AssocItem` This PR removes a few fields from `AssocItem` that should be easily computed using other queries. This simplifies some of the metadata decoding.
This commit is contained in:
commit
21de280ccc
61 changed files with 354 additions and 403 deletions
|
@ -1114,7 +1114,7 @@ impl<'a, 'tcx> CrateMetadataRef<'a> {
|
|||
|
||||
fn get_fn_has_self_parameter(self, id: DefIndex) -> bool {
|
||||
match self.kind(id) {
|
||||
EntryKind::AssocFn(data) => data.decode(self).has_self,
|
||||
EntryKind::AssocFn { has_self, .. } => has_self,
|
||||
_ => false,
|
||||
}
|
||||
}
|
||||
|
@ -1134,28 +1134,21 @@ impl<'a, 'tcx> CrateMetadataRef<'a> {
|
|||
}
|
||||
|
||||
fn get_associated_item(self, id: DefIndex) -> ty::AssocItem {
|
||||
let def_key = self.def_key(id);
|
||||
let parent = self.local_def_id(def_key.parent.unwrap());
|
||||
let name = self.item_name(id);
|
||||
|
||||
let (kind, container, has_self) = match self.kind(id) {
|
||||
EntryKind::AssocConst(container) => (ty::AssocKind::Const, container, false),
|
||||
EntryKind::AssocFn(data) => {
|
||||
let data = data.decode(self);
|
||||
(ty::AssocKind::Fn, data.container, data.has_self)
|
||||
}
|
||||
EntryKind::AssocFn { container, has_self } => (ty::AssocKind::Fn, container, has_self),
|
||||
EntryKind::AssocType(container) => (ty::AssocKind::Type, container, false),
|
||||
_ => bug!("cannot get associated-item of `{:?}`", def_key),
|
||||
_ => bug!("cannot get associated-item of `{:?}`", id),
|
||||
};
|
||||
|
||||
ty::AssocItem {
|
||||
name,
|
||||
kind,
|
||||
vis: self.get_visibility(id),
|
||||
defaultness: container.defaultness(),
|
||||
def_id: self.local_def_id(id),
|
||||
trait_item_def_id: self.get_trait_item_def_id(id),
|
||||
container: container.with_def_id(parent),
|
||||
container,
|
||||
fn_has_self_parameter: has_self,
|
||||
}
|
||||
}
|
||||
|
@ -1310,19 +1303,6 @@ impl<'a, 'tcx> CrateMetadataRef<'a> {
|
|||
}
|
||||
}
|
||||
|
||||
fn get_trait_of_item(self, id: DefIndex) -> Option<DefId> {
|
||||
let def_key = self.def_key(id);
|
||||
match def_key.disambiguated_data.data {
|
||||
DefPathData::TypeNs(..) | DefPathData::ValueNs(..) => (),
|
||||
// Not an associated item
|
||||
_ => return None,
|
||||
}
|
||||
def_key.parent.and_then(|parent_index| match self.kind(parent_index) {
|
||||
EntryKind::Trait | EntryKind::TraitAlias => Some(self.local_def_id(parent_index)),
|
||||
_ => None,
|
||||
})
|
||||
}
|
||||
|
||||
fn get_native_libraries(self, sess: &'a Session) -> impl Iterator<Item = NativeLib> + 'a {
|
||||
self.root.native_libraries.decode((self, sess))
|
||||
}
|
||||
|
|
|
@ -235,7 +235,6 @@ provide! { <'tcx> tcx, def_id, other, cdata,
|
|||
inherent_impls => { cdata.get_inherent_implementations_for_type(tcx, def_id.index) }
|
||||
is_foreign_item => { cdata.is_foreign_item(def_id.index) }
|
||||
item_attrs => { tcx.arena.alloc_from_iter(cdata.get_item_attrs(def_id.index, tcx.sess)) }
|
||||
trait_of_item => { cdata.get_trait_of_item(def_id.index) }
|
||||
is_mir_available => { cdata.is_item_mir_available(def_id.index) }
|
||||
is_ctfe_mir_available => { cdata.is_ctfe_mir_available(def_id.index) }
|
||||
|
||||
|
|
|
@ -1212,14 +1212,9 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> {
|
|||
let tcx = self.tcx;
|
||||
|
||||
let ast_item = tcx.hir().expect_trait_item(def_id.expect_local());
|
||||
self.tables.impl_defaultness.set(def_id.index, ast_item.defaultness);
|
||||
let trait_item = tcx.associated_item(def_id);
|
||||
|
||||
let container = match trait_item.defaultness {
|
||||
hir::Defaultness::Default { has_value: true } => AssocContainer::TraitWithDefault,
|
||||
hir::Defaultness::Default { has_value: false } => AssocContainer::TraitRequired,
|
||||
hir::Defaultness::Final => span_bug!(ast_item.span, "traits cannot have final items"),
|
||||
};
|
||||
|
||||
match trait_item.kind {
|
||||
ty::AssocKind::Const => {
|
||||
let rendered = rustc_hir_pretty::to_string(
|
||||
|
@ -1227,7 +1222,7 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> {
|
|||
|s| s.print_trait_item(ast_item),
|
||||
);
|
||||
|
||||
record!(self.tables.kind[def_id] <- EntryKind::AssocConst(container));
|
||||
record!(self.tables.kind[def_id] <- EntryKind::AssocConst(ty::AssocItemContainer::TraitContainer));
|
||||
record!(self.tables.mir_const_qualif[def_id] <- mir::ConstQualifs::default());
|
||||
record!(self.tables.rendered_const[def_id] <- rendered);
|
||||
}
|
||||
|
@ -1243,14 +1238,14 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> {
|
|||
};
|
||||
self.tables.asyncness.set(def_id.index, m_sig.header.asyncness);
|
||||
self.tables.constness.set(def_id.index, hir::Constness::NotConst);
|
||||
record!(self.tables.kind[def_id] <- EntryKind::AssocFn(self.lazy(AssocFnData {
|
||||
container,
|
||||
record!(self.tables.kind[def_id] <- EntryKind::AssocFn {
|
||||
container: ty::AssocItemContainer::TraitContainer,
|
||||
has_self: trait_item.fn_has_self_parameter,
|
||||
})));
|
||||
});
|
||||
}
|
||||
ty::AssocKind::Type => {
|
||||
self.encode_explicit_item_bounds(def_id);
|
||||
record!(self.tables.kind[def_id] <- EntryKind::AssocType(container));
|
||||
record!(self.tables.kind[def_id] <- EntryKind::AssocType(ty::AssocItemContainer::TraitContainer));
|
||||
}
|
||||
}
|
||||
match trait_item.kind {
|
||||
|
@ -1258,7 +1253,7 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> {
|
|||
self.encode_item_type(def_id);
|
||||
}
|
||||
ty::AssocKind::Type => {
|
||||
if trait_item.defaultness.has_value() {
|
||||
if ast_item.defaultness.has_value() {
|
||||
self.encode_item_type(def_id);
|
||||
}
|
||||
}
|
||||
|
@ -1273,23 +1268,16 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> {
|
|||
let tcx = self.tcx;
|
||||
|
||||
let ast_item = self.tcx.hir().expect_impl_item(def_id.expect_local());
|
||||
self.tables.impl_defaultness.set(def_id.index, ast_item.defaultness);
|
||||
let impl_item = self.tcx.associated_item(def_id);
|
||||
|
||||
let container = match impl_item.defaultness {
|
||||
hir::Defaultness::Default { has_value: true } => AssocContainer::ImplDefault,
|
||||
hir::Defaultness::Final => AssocContainer::ImplFinal,
|
||||
hir::Defaultness::Default { has_value: false } => {
|
||||
span_bug!(ast_item.span, "impl items always have values (currently)")
|
||||
}
|
||||
};
|
||||
|
||||
match impl_item.kind {
|
||||
ty::AssocKind::Const => {
|
||||
if let hir::ImplItemKind::Const(_, body_id) = ast_item.kind {
|
||||
let qualifs = self.tcx.at(ast_item.span).mir_const_qualif(def_id);
|
||||
let const_data = self.encode_rendered_const_for_body(body_id);
|
||||
|
||||
record!(self.tables.kind[def_id] <- EntryKind::AssocConst(container));
|
||||
record!(self.tables.kind[def_id] <- EntryKind::AssocConst(ty::AssocItemContainer::ImplContainer));
|
||||
record!(self.tables.mir_const_qualif[def_id] <- qualifs);
|
||||
record!(self.tables.rendered_const[def_id] <- const_data);
|
||||
} else {
|
||||
|
@ -1307,13 +1295,13 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> {
|
|||
hir::Constness::NotConst
|
||||
};
|
||||
self.tables.constness.set(def_id.index, constness);
|
||||
record!(self.tables.kind[def_id] <- EntryKind::AssocFn(self.lazy(AssocFnData {
|
||||
container,
|
||||
record!(self.tables.kind[def_id] <- EntryKind::AssocFn {
|
||||
container: ty::AssocItemContainer::ImplContainer,
|
||||
has_self: impl_item.fn_has_self_parameter,
|
||||
})));
|
||||
});
|
||||
}
|
||||
ty::AssocKind::Type => {
|
||||
record!(self.tables.kind[def_id] <- EntryKind::AssocType(container));
|
||||
record!(self.tables.kind[def_id] <- EntryKind::AssocType(ty::AssocItemContainer::ImplContainer));
|
||||
}
|
||||
}
|
||||
self.encode_item_type(def_id);
|
||||
|
|
|
@ -419,9 +419,9 @@ enum EntryKind {
|
|||
Generator,
|
||||
Trait,
|
||||
Impl,
|
||||
AssocFn(LazyValue<AssocFnData>),
|
||||
AssocType(AssocContainer),
|
||||
AssocConst(AssocContainer),
|
||||
AssocFn { container: ty::AssocItemContainer, has_self: bool },
|
||||
AssocType(ty::AssocItemContainer),
|
||||
AssocConst(ty::AssocItemContainer),
|
||||
TraitAlias,
|
||||
}
|
||||
|
||||
|
@ -434,47 +434,6 @@ struct VariantData {
|
|||
is_non_exhaustive: bool,
|
||||
}
|
||||
|
||||
/// Describes whether the container of an associated item
|
||||
/// is a trait or an impl and whether, in a trait, it has
|
||||
/// a default, or an in impl, whether it's marked "default".
|
||||
#[derive(Copy, Clone, TyEncodable, TyDecodable)]
|
||||
enum AssocContainer {
|
||||
TraitRequired,
|
||||
TraitWithDefault,
|
||||
ImplDefault,
|
||||
ImplFinal,
|
||||
}
|
||||
|
||||
impl AssocContainer {
|
||||
fn with_def_id(&self, def_id: DefId) -> ty::AssocItemContainer {
|
||||
match *self {
|
||||
AssocContainer::TraitRequired | AssocContainer::TraitWithDefault => {
|
||||
ty::TraitContainer(def_id)
|
||||
}
|
||||
|
||||
AssocContainer::ImplDefault | AssocContainer::ImplFinal => ty::ImplContainer(def_id),
|
||||
}
|
||||
}
|
||||
|
||||
fn defaultness(&self) -> hir::Defaultness {
|
||||
match *self {
|
||||
AssocContainer::TraitRequired => hir::Defaultness::Default { has_value: false },
|
||||
|
||||
AssocContainer::TraitWithDefault | AssocContainer::ImplDefault => {
|
||||
hir::Defaultness::Default { has_value: true }
|
||||
}
|
||||
|
||||
AssocContainer::ImplFinal => hir::Defaultness::Final,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(MetadataEncodable, MetadataDecodable)]
|
||||
struct AssocFnData {
|
||||
container: AssocContainer,
|
||||
has_self: bool,
|
||||
}
|
||||
|
||||
#[derive(TyEncodable, TyDecodable)]
|
||||
struct GeneratorData<'tcx> {
|
||||
layout: mir::GeneratorLayout<'tcx>,
|
||||
|
@ -492,7 +451,6 @@ pub fn provide(providers: &mut Providers) {
|
|||
|
||||
trivially_parameterized_over_tcx! {
|
||||
VariantData,
|
||||
AssocFnData,
|
||||
EntryKind,
|
||||
RawDefId,
|
||||
TraitImpls,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue