Rollup merge of #139669 - nnethercote:overhaul-AssocItem, r=oli-obk
Overhaul `AssocItem` `AssocItem` has multiple fields that only make sense some of the time. E.g. the `name` can be empty if it's an RPITIT associated type. It's clearer and less error prone if these fields are moved to the relevant `kind` variants. r? ``@fee1-dead``
This commit is contained in:
commit
13cd5256ac
86 changed files with 609 additions and 546 deletions
|
@ -1332,29 +1332,30 @@ impl<'a> CrateMetadataRef<'a> {
|
|||
}
|
||||
|
||||
fn get_associated_item(self, id: DefIndex, sess: &'a Session) -> ty::AssocItem {
|
||||
let name = if self.root.tables.opt_rpitit_info.get(self, id).is_some() {
|
||||
kw::Empty
|
||||
} else {
|
||||
self.item_name(id)
|
||||
};
|
||||
let (kind, has_self) = match self.def_kind(id) {
|
||||
DefKind::AssocConst => (ty::AssocKind::Const, false),
|
||||
DefKind::AssocFn => (ty::AssocKind::Fn, self.get_fn_has_self_parameter(id, sess)),
|
||||
DefKind::AssocTy => (ty::AssocKind::Type, false),
|
||||
let kind = match self.def_kind(id) {
|
||||
DefKind::AssocConst => ty::AssocKind::Const { name: self.item_name(id) },
|
||||
DefKind::AssocFn => ty::AssocKind::Fn {
|
||||
name: self.item_name(id),
|
||||
has_self: self.get_fn_has_self_parameter(id, sess),
|
||||
},
|
||||
DefKind::AssocTy => {
|
||||
let data = if let Some(rpitit_info) = self.root.tables.opt_rpitit_info.get(self, id)
|
||||
{
|
||||
ty::AssocTypeData::Rpitit(rpitit_info.decode(self))
|
||||
} else {
|
||||
ty::AssocTypeData::Normal(self.item_name(id))
|
||||
};
|
||||
ty::AssocKind::Type { data }
|
||||
}
|
||||
_ => bug!("cannot get associated-item of `{:?}`", self.def_key(id)),
|
||||
};
|
||||
let container = self.root.tables.assoc_container.get(self, id).unwrap();
|
||||
let opt_rpitit_info =
|
||||
self.root.tables.opt_rpitit_info.get(self, id).map(|d| d.decode(self));
|
||||
|
||||
ty::AssocItem {
|
||||
name,
|
||||
kind,
|
||||
def_id: self.local_def_id(id),
|
||||
trait_item_def_id: self.get_trait_item_def_id(id),
|
||||
container,
|
||||
fn_has_self_parameter: has_self,
|
||||
opt_rpitit_info,
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -1338,7 +1338,7 @@ fn should_encode_const(def_kind: DefKind) -> bool {
|
|||
fn should_encode_fn_impl_trait_in_trait<'tcx>(tcx: TyCtxt<'tcx>, def_id: DefId) -> bool {
|
||||
if let Some(assoc_item) = tcx.opt_associated_item(def_id)
|
||||
&& assoc_item.container == ty::AssocItemContainer::Trait
|
||||
&& assoc_item.kind == ty::AssocKind::Fn
|
||||
&& assoc_item.is_fn()
|
||||
{
|
||||
true
|
||||
} else {
|
||||
|
@ -1691,7 +1691,7 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> {
|
|||
|
||||
match item.container {
|
||||
AssocItemContainer::Trait => {
|
||||
if let ty::AssocKind::Type = item.kind {
|
||||
if item.is_type() {
|
||||
self.encode_explicit_item_bounds(def_id);
|
||||
self.encode_explicit_item_self_bounds(def_id);
|
||||
if tcx.is_conditionally_const(def_id) {
|
||||
|
@ -1706,7 +1706,7 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> {
|
|||
}
|
||||
}
|
||||
}
|
||||
if let Some(rpitit_info) = item.opt_rpitit_info {
|
||||
if let ty::AssocKind::Type { data: ty::AssocTypeData::Rpitit(rpitit_info) } = item.kind {
|
||||
record!(self.tables.opt_rpitit_info[def_id] <- rpitit_info);
|
||||
if matches!(rpitit_info, ty::ImplTraitInTraitData::Trait { .. }) {
|
||||
record_array!(
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue