Auto merge of #138774 - oli-obk:crate-hash-no-hir-crate, r= · rust-lang/rust@2ce3de0 (original) (raw)
`@@ -6,7 +6,7 @@ use rustc_data_structures::svh::Svh;
`
6
6
`use rustc_data_structures::sync::{DynSend, DynSync, par_for_each_in, try_par_for_each_in};
`
7
7
`use rustc_hir::def::{DefKind, Res};
`
8
8
`use rustc_hir::def_id::{DefId, LOCAL_CRATE, LocalDefId, LocalModDefId};
`
9
``
`-
use rustc_hir::definitions::{DefKey, DefPath, DefPathHash};
`
``
9
`+
use rustc_hir::definitions::{DefKey, DefPath, Definitions};
`
10
10
`use rustc_hir::intravisit::Visitor;
`
11
11
`use rustc_hir::*;
`
12
12
`use rustc_hir_pretty as pprust_hir;
`
`@@ -193,12 +193,6 @@ impl<'tcx> TyCtxt<'tcx> {
`
193
193
`self.definitions_untracked().def_path(def_id)
`
194
194
`}
`
195
195
``
196
``
`-
#[inline]
`
197
``
`-
pub fn hir_def_path_hash(self, def_id: LocalDefId) -> DefPathHash {
`
198
``
`-
// Accessing the DefPathHash is ok, it is incr. comp. stable.
`
199
``
`-
self.definitions_untracked().def_path_hash(def_id)
`
200
``
`-
}
`
201
``
-
202
196
`pub fn hir_get_if_local(self, id: DefId) -> Option<Node<'tcx>> {
`
203
197
` id.as_local().map(|id| self.hir_node_by_def_id(id))
`
204
198
`}
`
`@@ -1130,9 +1124,32 @@ impl<'tcx> pprust_hir::PpAnn for TyCtxt<'tcx> {
`
1130
1124
`}
`
1131
1125
`}
`
1132
1126
``
``
1127
`+
/// Compute the hash for the HIR of the full crate.
`
``
1128
`+
/// This hash will then be part of the crate_hash which is stored in the metadata.
`
``
1129
`+
fn compute_hir_hash(tcx: TyCtxt<'_>, definitions: &Definitions) -> Fingerprint {
`
``
1130
`+
let mut hir_body_nodes: Vec<_> = tcx
`
``
1131
`+
.hir_crate_items(())
`
``
1132
`+
.owners()
`
``
1133
`+
.map(|owner_id| {
`
``
1134
`+
let def_path_hash = definitions.def_path_hash(owner_id.def_id);
`
``
1135
`+
let nodes = tcx.opt_hir_owner_nodes(owner_id).unwrap();
`
``
1136
`+
let attrs = tcx.hir_attr_map(owner_id);
`
``
1137
`+
let in_scope_traits_map = tcx.in_scope_traits_map(owner_id).unwrap();
`
``
1138
`+
(def_path_hash, nodes, attrs, in_scope_traits_map)
`
``
1139
`+
})
`
``
1140
`+
.collect();
`
``
1141
`+
hir_body_nodes.sort_unstable_by_key(|bn| bn.0);
`
``
1142
+
``
1143
`+
tcx.with_stable_hashing_context(|mut hcx| {
`
``
1144
`+
let mut stable_hasher = StableHasher::new();
`
``
1145
`+
hir_body_nodes.hash_stable(&mut hcx, &mut stable_hasher);
`
``
1146
`+
stable_hasher.finish()
`
``
1147
`+
})
`
``
1148
`+
}
`
``
1149
+
1133
1150
`pub(super) fn crate_hash(tcx: TyCtxt<'_>, _: LocalCrate) -> Svh {
`
1134
``
`-
let krate = tcx.hir_crate(());
`
1135
``
`-
let hir_body_hash = krate.opt_hir_hash.expect("HIR hash missing while computing crate hash");
`
``
1151
`+
let definitions = tcx.untracked().definitions.freeze();
`
``
1152
`+
let hir_body_hash = compute_hir_hash(tcx, definitions);
`
1136
1153
``
1137
1154
`let upstream_crates = upstream_crates(tcx);
`
1138
1155
``
`@@ -1175,16 +1192,14 @@ pub(super) fn crate_hash(tcx: TyCtxt<'_>, _: LocalCrate) -> Svh {
`
1175
1192
` source_file_names.hash_stable(&mut hcx, &mut stable_hasher);
`
1176
1193
` debugger_visualizers.hash_stable(&mut hcx, &mut stable_hasher);
`
1177
1194
`if tcx.sess.opts.incremental.is_some() {
`
1178
``
`-
let definitions = tcx.untracked().definitions.freeze();
`
1179
``
`-
let mut owner_spans: Vec<_> = krate
`
1180
``
`-
.owners
`
1181
``
`-
.iter_enumerated()
`
1182
``
`-
.filter_map(|(def_id, info)| {
`
1183
``
`-
let _ = info.as_owner()?;
`
``
1195
`+
let mut owner_spans: Vec<_> = tcx
`
``
1196
`+
.hir_crate_items(())
`
``
1197
`+
.definitions()
`
``
1198
`+
.map(|def_id| {
`
1184
1199
`let def_path_hash = definitions.def_path_hash(def_id);
`
1185
1200
`let span = tcx.source_span(def_id);
`
1186
1201
`debug_assert_eq!(span.parent(), None);
`
1187
``
`-
Some((def_path_hash, span))
`
``
1202
`+
(def_path_hash, span)
`
1188
1203
`})
`
1189
1204
`.collect();
`
1190
1205
` owner_spans.sort_unstable_by_key(|bn| bn.0);
`