diff options
| author | Oliver Scherer <github35764891676564198441@oli-obk.de> | 2018-11-07 11:01:18 +0100 |
|---|---|---|
| committer | Oliver Scherer <github35764891676564198441@oli-obk.de> | 2018-11-12 10:29:53 +0100 |
| commit | a1d89266e5f96a2232c7202bf812dee1f845ae02 (patch) | |
| tree | fd062f78e2a8ec0c792db4c3c3e50e31c87fd1ff | |
| parent | 39a0969e64c06e7c6e5447b5633b02e4e4e931df (diff) | |
| download | rust-a1d89266e5f96a2232c7202bf812dee1f845ae02.tar.gz rust-a1d89266e5f96a2232c7202bf812dee1f845ae02.zip | |
Turn `HirLocalId` into a `newtype_index`
| -rw-r--r-- | src/librustc/dep_graph/dep_node.rs | 6 | ||||
| -rw-r--r-- | src/librustc/hir/lowering.rs | 4 | ||||
| -rw-r--r-- | src/librustc/hir/map/hir_id_validator.rs | 4 | ||||
| -rw-r--r-- | src/librustc/hir/mod.rs | 45 | ||||
| -rw-r--r-- | src/librustc/ich/impls_hir.rs | 11 | ||||
| -rw-r--r-- | src/librustc_driver/pretty.rs | 8 |
6 files changed, 36 insertions, 42 deletions
diff --git a/src/librustc/dep_graph/dep_node.rs b/src/librustc/dep_graph/dep_node.rs index 61996b5a8a7..3ff2545f78d 100644 --- a/src/librustc/dep_graph/dep_node.rs +++ b/src/librustc/dep_graph/dep_node.rs @@ -63,7 +63,7 @@ use mir::interpret::GlobalId; use hir::def_id::{CrateNum, DefId, DefIndex, CRATE_DEF_INDEX}; use hir::map::DefPathHash; -use hir::{HirId, ItemLocalId}; +use hir::HirId; use ich::{Fingerprint, StableHashingContext}; use rustc_data_structures::stable_hasher::{StableHasher, HashStable}; @@ -790,11 +790,11 @@ impl<'a, 'gcx: 'tcx + 'a, 'tcx: 'a> DepNodeParams<'a, 'gcx, 'tcx> for HirId { fn to_fingerprint(&self, tcx: TyCtxt<'_, '_, '_>) -> Fingerprint { let HirId { owner, - local_id: ItemLocalId(local_id), + local_id, } = *self; let def_path_hash = tcx.def_path_hash(DefId::local(owner)); - let local_id = Fingerprint::from_smaller_hash(local_id as u64); + let local_id = Fingerprint::from_smaller_hash(local_id.as_u32().into()); def_path_hash.0.combine(local_id) } diff --git a/src/librustc/hir/lowering.rs b/src/librustc/hir/lowering.rs index dd5d4b8f6af..e532b50a28b 100644 --- a/src/librustc/hir/lowering.rs +++ b/src/librustc/hir/lowering.rs @@ -588,7 +588,7 @@ impl<'a> LoweringContext<'a> { *local_id_counter += 1; hir::HirId { owner: def_index, - local_id: hir::ItemLocalId(local_id), + local_id: hir::ItemLocalId::from_u32(local_id), } }) } @@ -616,7 +616,7 @@ impl<'a> LoweringContext<'a> { hir::HirId { owner: def_index, - local_id: hir::ItemLocalId(local_id), + local_id: hir::ItemLocalId::from_u32(local_id), } }) } diff --git a/src/librustc/hir/map/hir_id_validator.rs b/src/librustc/hir/map/hir_id_validator.rs index 501c17867f0..ac4119dc372 100644 --- a/src/librustc/hir/map/hir_id_validator.rs +++ b/src/librustc/hir/map/hir_id_validator.rs @@ -101,7 +101,7 @@ impl<'a, 'hir: 'a> HirIdValidator<'a, 'hir> { if max != self.hir_ids_seen.len() - 1 { // Collect the missing ItemLocalIds let missing: Vec<_> = (0 .. max as u32 + 1) - .filter(|&i| !self.hir_ids_seen.contains_key(&ItemLocalId(i))) + .filter(|&i| !self.hir_ids_seen.contains_key(&ItemLocalId::from_u32(i))) .collect(); // Try to map those to something more useful @@ -110,7 +110,7 @@ impl<'a, 'hir: 'a> HirIdValidator<'a, 'hir> { for local_id in missing { let hir_id = HirId { owner: owner_def_index, - local_id: ItemLocalId(local_id as u32), + local_id: ItemLocalId::from_u32(local_id), }; trace!("missing hir id {:#?}", hir_id); diff --git a/src/librustc/hir/mod.rs b/src/librustc/hir/mod.rs index f57e3ff913b..bfe16493805 100644 --- a/src/librustc/hir/mod.rs +++ b/src/librustc/hir/mod.rs @@ -37,7 +37,6 @@ use syntax::util::parser::ExprPrecedence; use ty::AdtKind; use ty::query::Providers; -use rustc_data_structures::indexed_vec; use rustc_data_structures::sync::{ParallelIterator, par_iter, Send, Sync, scope}; use rustc_data_structures::thin_vec::ThinVec; @@ -121,40 +120,28 @@ impl serialize::UseSpecializedDecodable for HirId { } } - -/// An `ItemLocalId` uniquely identifies something within a given "item-like", -/// that is within a hir::Item, hir::TraitItem, or hir::ImplItem. There is no -/// guarantee that the numerical value of a given `ItemLocalId` corresponds to -/// the node's position within the owning item in any way, but there is a -/// guarantee that the `LocalItemId`s within an owner occupy a dense range of -/// integers starting at zero, so a mapping that maps all or most nodes within -/// an "item-like" to something else can be implement by a `Vec` instead of a -/// tree or hash map. -#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Debug, - RustcEncodable, RustcDecodable)] -pub struct ItemLocalId(pub u32); - -impl ItemLocalId { - pub fn as_usize(&self) -> usize { - self.0 as usize +// hack to ensure that we don't try to access the private parts of `NodeId` in this module +mod item_local_id_inner { + use rustc_data_structures::indexed_vec::Idx; + /// An `ItemLocalId` uniquely identifies something within a given "item-like", + /// that is within a hir::Item, hir::TraitItem, or hir::ImplItem. There is no + /// guarantee that the numerical value of a given `ItemLocalId` corresponds to + /// the node's position within the owning item in any way, but there is a + /// guarantee that the `LocalItemId`s within an owner occupy a dense range of + /// integers starting at zero, so a mapping that maps all or most nodes within + /// an "item-like" to something else can be implement by a `Vec` instead of a + /// tree or hash map. + newtype_index! { + pub struct ItemLocalId { .. } } } -impl indexed_vec::Idx for ItemLocalId { - fn new(idx: usize) -> Self { - debug_assert!((idx as u32) as usize == idx); - ItemLocalId(idx as u32) - } - - fn index(self) -> usize { - self.0 as usize - } -} +pub use self::item_local_id_inner::ItemLocalId; /// The `HirId` corresponding to CRATE_NODE_ID and CRATE_DEF_INDEX pub const CRATE_HIR_ID: HirId = HirId { owner: CRATE_DEF_INDEX, - local_id: ItemLocalId(0) + local_id: ItemLocalId::from_u32_const(0) }; pub const DUMMY_HIR_ID: HirId = HirId { @@ -162,7 +149,7 @@ pub const DUMMY_HIR_ID: HirId = HirId { local_id: DUMMY_ITEM_LOCAL_ID, }; -pub const DUMMY_ITEM_LOCAL_ID: ItemLocalId = ItemLocalId(!0); +pub const DUMMY_ITEM_LOCAL_ID: ItemLocalId = ItemLocalId::MAX; #[derive(Clone, RustcEncodable, RustcDecodable, Copy)] pub struct Label { diff --git a/src/librustc/ich/impls_hir.rs b/src/librustc/ich/impls_hir.rs index b220634d0d9..ae0d78d2958 100644 --- a/src/librustc/ich/impls_hir.rs +++ b/src/librustc/ich/impls_hir.rs @@ -79,7 +79,14 @@ impl<'a> ToStableHashKey<StableHashingContext<'a>> for CrateNum { } } -impl_stable_hash_for!(tuple_struct hir::ItemLocalId { index }); +impl<'a> HashStable<StableHashingContext<'a>> for hir::ItemLocalId { + #[inline] + fn hash_stable<W: StableHasherResult>(&self, + hcx: &mut StableHashingContext<'a>, + hasher: &mut StableHasher<W>) { + self.as_u32().hash_stable(hcx, hasher); + } +} impl<'a> ToStableHashKey<StableHashingContext<'a>> for hir::ItemLocalId { @@ -800,7 +807,7 @@ impl<'a> HashStable<StableHashingContext<'a>> for hir::Mod { .iter() .map(|id| { let (def_path_hash, local_id) = id.id.to_stable_hash_key(hcx); - debug_assert_eq!(local_id, hir::ItemLocalId(0)); + debug_assert_eq!(local_id, hir::ItemLocalId::from_u32(0)); def_path_hash.0 }).fold(Fingerprint::ZERO, |a, b| { a.combine_commutative(b) diff --git a/src/librustc_driver/pretty.rs b/src/librustc_driver/pretty.rs index b26d4fd09e9..c7ba31e3395 100644 --- a/src/librustc_driver/pretty.rs +++ b/src/librustc_driver/pretty.rs @@ -425,7 +425,7 @@ impl<'hir> pprust_hir::PpAnn for IdentifiedAnnotation<'hir> { pprust_hir::AnnNode::Item(item) => { s.s.space()?; s.synth_comment(format!("node_id: {} hir local_id: {}", - item.id, item.hir_id.local_id.0)) + item.id, item.hir_id.local_id.as_u32())) } pprust_hir::AnnNode::SubItem(id) => { s.s.space()?; @@ -434,18 +434,18 @@ impl<'hir> pprust_hir::PpAnn for IdentifiedAnnotation<'hir> { pprust_hir::AnnNode::Block(blk) => { s.s.space()?; s.synth_comment(format!("block node_id: {} hir local_id: {}", - blk.id, blk.hir_id.local_id.0)) + blk.id, blk.hir_id.local_id.as_u32())) } pprust_hir::AnnNode::Expr(expr) => { s.s.space()?; s.synth_comment(format!("node_id: {} hir local_id: {}", - expr.id, expr.hir_id.local_id.0))?; + expr.id, expr.hir_id.local_id.as_u32()))?; s.pclose() } pprust_hir::AnnNode::Pat(pat) => { s.s.space()?; s.synth_comment(format!("pat node_id: {} hir local_id: {}", - pat.id, pat.hir_id.local_id.0)) + pat.id, pat.hir_id.local_id.as_u32())) } } } |
