From e11dd4750301e55f6e0af1726001c7a7589a9cf9 Mon Sep 17 00:00:00 2001 From: Eduard-Mihai Burtescu Date: Thu, 31 Oct 2019 15:32:07 +0200 Subject: [PATCH] rustc: use LocalDefId instead of DefIndex for query keys. --- src/librustc/dep_graph/dep_node.rs | 10 +++++----- src/librustc/query/mod.rs | 10 +++++----- src/librustc/ty/context.rs | 17 ++++++++++------- src/librustc/ty/query/keys.rs | 10 +++++----- src/librustc/ty/query/mod.rs | 4 ++-- .../borrow_check/universal_regions.rs | 2 +- src/librustc_resolve/late/lifetimes.rs | 17 +++-------------- 7 files changed, 31 insertions(+), 39 deletions(-) diff --git a/src/librustc/dep_graph/dep_node.rs b/src/librustc/dep_graph/dep_node.rs index e3df9d5d04b..bee85c014e7 100644 --- a/src/librustc/dep_graph/dep_node.rs +++ b/src/librustc/dep_graph/dep_node.rs @@ -63,7 +63,7 @@ use crate::ty::subst::SubstsRef; use crate::ty::{self, ParamEnvAnd, Ty, TyCtxt}; use rustc_data_structures::stable_hasher::{HashStable, StableHasher}; -use rustc_hir::def_id::{CrateNum, DefId, DefIndex, CRATE_DEF_INDEX}; +use rustc_hir::def_id::{CrateNum, DefId, LocalDefId, CRATE_DEF_INDEX}; use rustc_hir::HirId; use rustc_span::symbol::Symbol; use std::fmt; @@ -413,19 +413,19 @@ impl<'tcx> DepNodeParams<'tcx> for DefId { } } -impl<'tcx> DepNodeParams<'tcx> for DefIndex { +impl<'tcx> DepNodeParams<'tcx> for LocalDefId { const CAN_RECONSTRUCT_QUERY_KEY: bool = true; fn to_fingerprint(&self, tcx: TyCtxt<'_>) -> Fingerprint { - tcx.hir().definitions().def_path_hash(*self).0 + self.to_def_id().to_fingerprint(tcx) } fn to_debug_str(&self, tcx: TyCtxt<'tcx>) -> String { - tcx.def_path_str(DefId::local(*self)) + self.to_def_id().to_debug_str(tcx) } fn recover(tcx: TyCtxt<'tcx>, dep_node: &DepNode) -> Option { - dep_node.extract_def_id(tcx).map(|id| id.index) + dep_node.extract_def_id(tcx).map(|id| id.to_local()) } } diff --git a/src/librustc/query/mod.rs b/src/librustc/query/mod.rs index ff3a82e5363..f47d22fdffb 100644 --- a/src/librustc/query/mod.rs +++ b/src/librustc/query/mod.rs @@ -11,7 +11,7 @@ use crate::ty::query::queries; use crate::ty::query::QueryDescription; use crate::ty::subst::SubstsRef; use crate::ty::{self, ParamEnvAnd, Ty, TyCtxt}; -use rustc_hir::def_id::{CrateNum, DefId, DefIndex}; +use rustc_hir::def_id::{CrateNum, DefId, LocalDefId}; use rustc_span::symbol::Symbol; use std::borrow::Cow; @@ -791,7 +791,7 @@ rustc_queries! { query specializes(_: (DefId, DefId)) -> bool { desc { "computing whether impls specialize one another" } } - query in_scope_traits_map(_: DefIndex) + query in_scope_traits_map(_: LocalDefId) -> Option<&'tcx FxHashMap>> { eval_always desc { "traits in scope at a block" } @@ -948,15 +948,15 @@ rustc_queries! { query resolve_lifetimes(_: CrateNum) -> &'tcx ResolveLifetimes { desc { "resolving lifetimes" } } - query named_region_map(_: DefIndex) -> + query named_region_map(_: LocalDefId) -> Option<&'tcx FxHashMap> { desc { "looking up a named region" } } - query is_late_bound_map(_: DefIndex) -> + query is_late_bound_map(_: LocalDefId) -> Option<&'tcx FxHashSet> { desc { "testing if a region is late bound" } } - query object_lifetime_defaults_map(_: DefIndex) + query object_lifetime_defaults_map(_: LocalDefId) -> Option<&'tcx FxHashMap>> { desc { "looking up lifetime defaults for a region" } } diff --git a/src/librustc/ty/context.rs b/src/librustc/ty/context.rs index d7a259cc870..25c442a8207 100644 --- a/src/librustc/ty/context.rs +++ b/src/librustc/ty/context.rs @@ -55,7 +55,7 @@ use rustc_data_structures::stable_hasher::{ use rustc_data_structures::sync::{self, Lock, Lrc, WorkerLocal}; use rustc_hir as hir; use rustc_hir::def::{DefKind, Res}; -use rustc_hir::def_id::{CrateNum, DefId, DefIdMap, DefIdSet, DefIndex, LOCAL_CRATE}; +use rustc_hir::def_id::{CrateNum, DefId, DefIdMap, DefIdSet, LocalDefId, LOCAL_CRATE}; use rustc_hir::{HirId, Node, TraitCandidate}; use rustc_hir::{ItemKind, ItemLocalId, ItemLocalMap, ItemLocalSet}; use rustc_index::vec::{Idx, IndexVec}; @@ -958,7 +958,7 @@ pub struct GlobalCtxt<'tcx> { /// Map indicating what traits are in scope for places where this /// is relevant; generated by resolve. - trait_map: FxHashMap>>, + trait_map: FxHashMap>>, /// Export map produced by name resolution. export_map: FxHashMap>>, @@ -1153,7 +1153,7 @@ impl<'tcx> TyCtxt<'tcx> { let mut trait_map: FxHashMap<_, FxHashMap<_, _>> = FxHashMap::default(); for (k, v) in resolutions.trait_map { let hir_id = definitions.node_to_hir_id(k); - let map = trait_map.entry(hir_id.owner).or_default(); + let map = trait_map.entry(hir_id.owner_local_def_id()).or_default(); let v = v .into_iter() .map(|tc| tc.map_import_ids(|id| definitions.node_to_hir_id(id))) @@ -2631,19 +2631,22 @@ impl<'tcx> TyCtxt<'tcx> { } pub fn in_scope_traits(self, id: HirId) -> Option<&'tcx StableVec> { - self.in_scope_traits_map(id.owner).and_then(|map| map.get(&id.local_id)) + self.in_scope_traits_map(id.owner_local_def_id()).and_then(|map| map.get(&id.local_id)) } pub fn named_region(self, id: HirId) -> Option { - self.named_region_map(id.owner).and_then(|map| map.get(&id.local_id).cloned()) + self.named_region_map(id.owner_local_def_id()) + .and_then(|map| map.get(&id.local_id).cloned()) } pub fn is_late_bound(self, id: HirId) -> bool { - self.is_late_bound_map(id.owner).map(|set| set.contains(&id.local_id)).unwrap_or(false) + self.is_late_bound_map(id.owner_local_def_id()) + .map(|set| set.contains(&id.local_id)) + .unwrap_or(false) } pub fn object_lifetime_defaults(self, id: HirId) -> Option<&'tcx [ObjectLifetimeDefault]> { - self.object_lifetime_defaults_map(id.owner) + self.object_lifetime_defaults_map(id.owner_local_def_id()) .and_then(|map| map.get(&id.local_id).map(|v| &**v)) } } diff --git a/src/librustc/ty/query/keys.rs b/src/librustc/ty/query/keys.rs index 09fb307a1ce..6073d3a545f 100644 --- a/src/librustc/ty/query/keys.rs +++ b/src/librustc/ty/query/keys.rs @@ -7,7 +7,7 @@ use crate::ty::fast_reject::SimplifiedType; use crate::ty::query::caches::DefaultCacheSelector; use crate::ty::subst::SubstsRef; use crate::ty::{self, Ty, TyCtxt}; -use rustc_hir::def_id::{CrateNum, DefId, DefIndex, LOCAL_CRATE}; +use rustc_hir::def_id::{CrateNum, DefId, LocalDefId, LOCAL_CRATE}; use rustc_span::symbol::Symbol; use rustc_span::{Span, DUMMY_SP}; @@ -84,14 +84,14 @@ impl Key for CrateNum { } } -impl Key for DefIndex { +impl Key for LocalDefId { type CacheSelector = DefaultCacheSelector; fn query_crate(&self) -> CrateNum { - LOCAL_CRATE + self.to_def_id().query_crate() } - fn default_span(&self, _tcx: TyCtxt<'_>) -> Span { - DUMMY_SP + fn default_span(&self, tcx: TyCtxt<'_>) -> Span { + self.to_def_id().default_span(tcx) } } diff --git a/src/librustc/ty/query/mod.rs b/src/librustc/ty/query/mod.rs index e3859ed12a2..7ac8358c78a 100644 --- a/src/librustc/ty/query/mod.rs +++ b/src/librustc/ty/query/mod.rs @@ -44,7 +44,7 @@ use rustc_data_structures::svh::Svh; use rustc_data_structures::sync::Lrc; use rustc_hir as hir; use rustc_hir::def::DefKind; -use rustc_hir::def_id::{CrateNum, DefId, DefIdMap, DefIdSet, DefIndex}; +use rustc_hir::def_id::{CrateNum, DefId, DefIdMap, DefIdSet, LocalDefId}; use rustc_hir::{Crate, HirIdSet, ItemLocalId, TraitCandidate}; use rustc_index::vec::IndexVec; use rustc_session::config::{EntryFnType, OptLevel, OutputFilenames, SymbolManglingVersion}; @@ -147,7 +147,7 @@ rustc_query_append! { [define_queries!][<'tcx>] } /// /// When you implement a new query, it will likely have a corresponding new /// `DepKind`, and you'll have to support it here in `force_from_dep_node()`. As -/// a rule of thumb, if your query takes a `DefId` or `DefIndex` as sole parameter, +/// a rule of thumb, if your query takes a `DefId` or `LocalDefId` as sole parameter, /// then `force_from_dep_node()` should not fail for it. Otherwise, you can just /// add it to the "We don't have enough information to reconstruct..." group in /// the match below. diff --git a/src/librustc_mir/borrow_check/universal_regions.rs b/src/librustc_mir/borrow_check/universal_regions.rs index 67b00e9ffdd..4cc2a2d45a6 100644 --- a/src/librustc_mir/borrow_check/universal_regions.rs +++ b/src/librustc_mir/borrow_check/universal_regions.rs @@ -774,7 +774,7 @@ fn for_each_late_bound_region_defined_on<'tcx>( fn_def_id: DefId, mut f: impl FnMut(ty::Region<'tcx>), ) { - if let Some(late_bounds) = tcx.is_late_bound_map(fn_def_id.index) { + if let Some(late_bounds) = tcx.is_late_bound_map(fn_def_id.to_local()) { for late_bound in late_bounds.iter() { let hir_id = HirId { owner: fn_def_id.index, local_id: *late_bound }; let name = tcx.hir().name(hir_id); diff --git a/src/librustc_resolve/late/lifetimes.rs b/src/librustc_resolve/late/lifetimes.rs index 47d04964842..5e8b08167a4 100644 --- a/src/librustc_resolve/late/lifetimes.rs +++ b/src/librustc_resolve/late/lifetimes.rs @@ -17,7 +17,7 @@ use rustc_data_structures::fx::{FxHashMap, FxHashSet}; use rustc_errors::{struct_span_err, Applicability, DiagnosticBuilder}; use rustc_hir as hir; use rustc_hir::def::{DefKind, Res}; -use rustc_hir::def_id::{CrateNum, DefId, DefIdMap, LocalDefId, LOCAL_CRATE}; +use rustc_hir::def_id::{CrateNum, DefId, DefIdMap, LOCAL_CRATE}; use rustc_hir::intravisit::{self, NestedVisitorMap, Visitor}; use rustc_hir::{GenericArg, GenericParam, LifetimeName, Node, ParamName, QPath}; use rustc_hir::{GenericParamKind, HirIdMap, HirIdSet, LifetimeParamKind}; @@ -280,25 +280,14 @@ pub fn provide(providers: &mut ty::query::Providers<'_>) { *providers = ty::query::Providers { resolve_lifetimes, - named_region_map: |tcx, id| { - let id = LocalDefId::from_def_id(DefId::local(id)); // (*) - tcx.resolve_lifetimes(LOCAL_CRATE).defs.get(&id) - }, - - is_late_bound_map: |tcx, id| { - let id = LocalDefId::from_def_id(DefId::local(id)); // (*) - tcx.resolve_lifetimes(LOCAL_CRATE).late_bound.get(&id) - }, - + named_region_map: |tcx, id| tcx.resolve_lifetimes(LOCAL_CRATE).defs.get(&id), + is_late_bound_map: |tcx, id| tcx.resolve_lifetimes(LOCAL_CRATE).late_bound.get(&id), object_lifetime_defaults_map: |tcx, id| { - let id = LocalDefId::from_def_id(DefId::local(id)); // (*) tcx.resolve_lifetimes(LOCAL_CRATE).object_lifetime_defaults.get(&id) }, ..*providers }; - - // (*) FIXME the query should be defined to take a LocalDefId } /// Computes the `ResolveLifetimes` map that contains data for the