use std::fmt;
rustc_index::newtype_index! {
- pub struct CrateId {
+ pub struct CrateNum {
ENCODABLE = custom
+ DEBUG_FORMAT = "crate{}"
}
}
-#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
-pub enum CrateNum {
- /// A special `CrateNum` that we use for the `tcx.rcache` when decoding from
- /// the incr. comp. cache.
- ReservedForIncrCompCache,
- Index(CrateId),
-}
-
/// Item definitions in the currently-compiled crate would have the `CrateNum`
/// `LOCAL_CRATE` in their `DefId`.
-pub const LOCAL_CRATE: CrateNum = CrateNum::Index(CrateId::from_u32(0));
-
-impl Idx for CrateNum {
- #[inline]
- fn new(value: usize) -> Self {
- CrateNum::Index(Idx::new(value))
- }
-
- #[inline]
- fn index(self) -> usize {
- match self {
- CrateNum::Index(idx) => Idx::index(idx),
- _ => panic!("Tried to get crate index of {:?}", self),
- }
- }
-}
+pub const LOCAL_CRATE: CrateNum = CrateNum::from_u32(0);
impl CrateNum {
+ #[inline]
pub fn new(x: usize) -> CrateNum {
CrateNum::from_usize(x)
}
- pub fn from_usize(x: usize) -> CrateNum {
- CrateNum::Index(CrateId::from_usize(x))
- }
-
- pub fn from_u32(x: u32) -> CrateNum {
- CrateNum::Index(CrateId::from_u32(x))
- }
-
- pub fn as_usize(self) -> usize {
- match self {
- CrateNum::Index(id) => id.as_usize(),
- _ => panic!("tried to get index of non-standard crate {:?}", self),
- }
- }
-
- pub fn as_u32(self) -> u32 {
- match self {
- CrateNum::Index(id) => id.as_u32(),
- _ => panic!("tried to get index of non-standard crate {:?}", self),
- }
- }
-
+ #[inline]
pub fn as_def_id(&self) -> DefId {
DefId { krate: *self, index: CRATE_DEF_INDEX }
}
impl fmt::Display for CrateNum {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
- match self {
- CrateNum::Index(id) => fmt::Display::fmt(&id.private, f),
- CrateNum::ReservedForIncrCompCache => write!(f, "crate for decoding incr comp cache"),
- }
+ fmt::Display::fmt(&self.private, f)
}
}
}
}
-impl ::std::fmt::Debug for CrateNum {
- fn fmt(&self, fmt: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
- match self {
- CrateNum::Index(id) => write!(fmt, "crate{}", id.private),
- CrateNum::ReservedForIncrCompCache => write!(fmt, "crate for decoding incr comp cache"),
- }
- }
-}
-
/// A `DefPathHash` is a fixed-size representation of a `DefPath` that is
/// stable across crate and compilation session boundaries. It consists of two
/// separate 64-bit hashes. The first uniquely identifies the crate this
impl<E: Encoder> Encodable<E> for DefId {
default fn encode(&self, s: &mut E) -> Result<(), E::Error> {
- s.emit_struct("DefId", 2, |s| {
- s.emit_struct_field("krate", 0, |s| self.krate.encode(s))?;
+ s.emit_struct(false, |s| {
+ s.emit_struct_field("krate", true, |s| self.krate.encode(s))?;
- s.emit_struct_field("index", 1, |s| self.index.encode(s))
+ s.emit_struct_field("index", false, |s| self.index.encode(s))
})
}
}
impl<D: Decoder> Decodable<D> for DefId {
default fn decode(d: &mut D) -> Result<DefId, D::Error> {
- d.read_struct("DefId", 2, |d| {
+ d.read_struct(|d| {
Ok(DefId {
- krate: d.read_struct_field("krate", 0, Decodable::decode)?,
- index: d.read_struct_field("index", 1, Decodable::decode)?,
+ krate: d.read_struct_field("krate", Decodable::decode)?,
+ index: d.read_struct_field("index", Decodable::decode)?,
})
})
}