Skip to content
This repository was archived by the owner on May 28, 2025. It is now read-only.

Commit 22df322

Browse files
committed
Encode Impl separately.
1 parent 45a9a54 commit 22df322

File tree

1 file changed

+31
-24
lines changed

1 file changed

+31
-24
lines changed

compiler/rustc_metadata/src/rmeta/encoder.rs

Lines changed: 31 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1434,6 +1434,9 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> {
14341434
self.encode_info_for_assoc_item(def_id);
14351435
}
14361436
}
1437+
if let DefKind::Impl { of_trait } = def_kind {
1438+
self.encode_info_for_impl(def_id, of_trait)
1439+
}
14371440
if let DefKind::Enum | DefKind::Struct | DefKind::Union = def_kind {
14381441
self.encode_info_for_adt(local_id);
14391442
}
@@ -1705,32 +1708,9 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> {
17051708
matches!(opaque.origin, hir::OpaqueTyOrigin::TyAlias { .. }),
17061709
);
17071710
}
1708-
hir::ItemKind::Impl(hir::Impl { defaultness, .. }) => {
1709-
self.tables.defaultness.set_some(def_id.index, *defaultness);
1710-
self.tables.impl_polarity.set_some(def_id.index, self.tcx.impl_polarity(def_id));
1711-
1712-
if let Some(trait_ref) = self.tcx.impl_trait_ref(def_id) {
1713-
record!(self.tables.impl_trait_ref[def_id] <- trait_ref);
1714-
1715-
let trait_ref = trait_ref.skip_binder();
1716-
let trait_def = self.tcx.trait_def(trait_ref.def_id);
1717-
if let Ok(mut an) = trait_def.ancestors(self.tcx, def_id) {
1718-
if let Some(specialization_graph::Node::Impl(parent)) = an.nth(1) {
1719-
self.tables.impl_parent.set_some(def_id.index, parent.into());
1720-
}
1721-
}
1722-
1723-
// if this is an impl of `CoerceUnsized`, create its
1724-
// "unsized info", else just store None
1725-
if Some(trait_ref.def_id) == self.tcx.lang_items().coerce_unsized_trait() {
1726-
let coerce_unsized_info =
1727-
self.tcx.at(item.span).coerce_unsized_info(def_id);
1728-
record!(self.tables.coerce_unsized_info[def_id] <- coerce_unsized_info);
1729-
}
1730-
}
1731-
}
17321711
hir::ItemKind::ExternCrate(_)
17331712
| hir::ItemKind::Use(..)
1713+
| hir::ItemKind::Impl(..)
17341714
| hir::ItemKind::Trait(..)
17351715
| hir::ItemKind::TraitAlias(..)
17361716
| hir::ItemKind::Static(..)
@@ -1745,6 +1725,33 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> {
17451725
}
17461726
}
17471727

1728+
#[tracing::instrument(level = "debug", skip(self))]
1729+
fn encode_info_for_impl(&mut self, def_id: DefId, of_trait: bool) {
1730+
let tcx = self.tcx;
1731+
1732+
self.tables.defaultness.set_some(def_id.index, tcx.defaultness(def_id));
1733+
self.tables.impl_polarity.set_some(def_id.index, tcx.impl_polarity(def_id));
1734+
1735+
if of_trait && let Some(trait_ref) = tcx.impl_trait_ref(def_id) {
1736+
record!(self.tables.impl_trait_ref[def_id] <- trait_ref);
1737+
1738+
let trait_def_id = trait_ref.skip_binder().def_id;
1739+
let trait_def = tcx.trait_def(trait_def_id);
1740+
if let Some(mut an) = trait_def.ancestors(tcx, def_id).ok() {
1741+
if let Some(specialization_graph::Node::Impl(parent)) = an.nth(1) {
1742+
self.tables.impl_parent.set_some(def_id.index, parent.into());
1743+
}
1744+
}
1745+
1746+
// if this is an impl of `CoerceUnsized`, create its
1747+
// "unsized info", else just store None
1748+
if Some(trait_def_id) == tcx.lang_items().coerce_unsized_trait() {
1749+
let coerce_unsized_info = tcx.coerce_unsized_info(def_id);
1750+
record!(self.tables.coerce_unsized_info[def_id] <- coerce_unsized_info);
1751+
}
1752+
}
1753+
}
1754+
17481755
#[instrument(level = "debug", skip(self))]
17491756
fn encode_info_for_generator(&mut self, def_id: LocalDefId) {
17501757
let typeck_result: &'tcx ty::TypeckResults<'tcx> = self.tcx.typeck(def_id);

0 commit comments

Comments
 (0)