// except according to those terms.
use hir::def_id::DefId;
-use ty::{self, Ty, TyCtxt};
+use ich::StableHashingContext;
+use rustc_data_structures::stable_hasher::{StableHasher, StableHasherResult,
+ HashStable};
+use std::fmt::Debug;
+use std::hash::Hash;
+use std::mem;
use syntax::ast;
+use ty::{self, Ty, TyCtxt};
-use self::SimplifiedType::*;
+use self::SimplifiedTypeGen::*;
-/// See `simplify_type
-#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
-pub enum SimplifiedType {
+pub type SimplifiedType = SimplifiedTypeGen<DefId>;
+
+/// See `simplify_type`
+///
+/// Note that we keep this type generic over the type of identifier it uses
+/// because we sometimes need to use SimplifiedTypeGen values as stable sorting
+/// keys (in which case we use a DefPathHash as id-type) but in the general case
+/// the non-stable but fast to construct DefId-version is the better choice.
+#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
+pub enum SimplifiedTypeGen<D>
+ where D: Copy + Debug + Ord + Eq + Hash
+{
BoolSimplifiedType,
CharSimplifiedType,
IntSimplifiedType(ast::IntTy),
UintSimplifiedType(ast::UintTy),
FloatSimplifiedType(ast::FloatTy),
- AdtSimplifiedType(DefId),
+ AdtSimplifiedType(D),
StrSimplifiedType,
ArraySimplifiedType,
PtrSimplifiedType,
NeverSimplifiedType,
TupleSimplifiedType(usize),
- TraitSimplifiedType(DefId),
- ClosureSimplifiedType(DefId),
- AnonSimplifiedType(DefId),
+ TraitSimplifiedType(D),
+ ClosureSimplifiedType(D),
+ GeneratorSimplifiedType(D),
+ AnonSimplifiedType(D),
FunctionSimplifiedType(usize),
ParameterSimplifiedType,
}
ty::TyClosure(def_id, _) => {
Some(ClosureSimplifiedType(def_id))
}
+ ty::TyGenerator(def_id, _, _) => {
+ Some(GeneratorSimplifiedType(def_id))
+ }
ty::TyNever => Some(NeverSimplifiedType),
ty::TyTuple(ref tys, _) => {
Some(TupleSimplifiedType(tys.len()))
ty::TyInfer(_) | ty::TyError => None,
}
}
+
+impl<D: Copy + Debug + Ord + Eq + Hash> SimplifiedTypeGen<D> {
+ pub fn map_def<U, F>(self, map: F) -> SimplifiedTypeGen<U>
+ where F: Fn(D) -> U,
+ U: Copy + Debug + Ord + Eq + Hash,
+ {
+ match self {
+ BoolSimplifiedType => BoolSimplifiedType,
+ CharSimplifiedType => CharSimplifiedType,
+ IntSimplifiedType(t) => IntSimplifiedType(t),
+ UintSimplifiedType(t) => UintSimplifiedType(t),
+ FloatSimplifiedType(t) => FloatSimplifiedType(t),
+ AdtSimplifiedType(d) => AdtSimplifiedType(map(d)),
+ StrSimplifiedType => StrSimplifiedType,
+ ArraySimplifiedType => ArraySimplifiedType,
+ PtrSimplifiedType => PtrSimplifiedType,
+ NeverSimplifiedType => NeverSimplifiedType,
+ TupleSimplifiedType(n) => TupleSimplifiedType(n),
+ TraitSimplifiedType(d) => TraitSimplifiedType(map(d)),
+ ClosureSimplifiedType(d) => ClosureSimplifiedType(map(d)),
+ GeneratorSimplifiedType(d) => GeneratorSimplifiedType(map(d)),
+ AnonSimplifiedType(d) => AnonSimplifiedType(map(d)),
+ FunctionSimplifiedType(n) => FunctionSimplifiedType(n),
+ ParameterSimplifiedType => ParameterSimplifiedType,
+ }
+ }
+}
+
+impl<'gcx, D> HashStable<StableHashingContext<'gcx>> for SimplifiedTypeGen<D>
+ where D: Copy + Debug + Ord + Eq + Hash +
+ HashStable<StableHashingContext<'gcx>>,
+{
+ fn hash_stable<W: StableHasherResult>(&self,
+ hcx: &mut StableHashingContext<'gcx>,
+ hasher: &mut StableHasher<W>) {
+ mem::discriminant(self).hash_stable(hcx, hasher);
+ match *self {
+ BoolSimplifiedType |
+ CharSimplifiedType |
+ StrSimplifiedType |
+ ArraySimplifiedType |
+ PtrSimplifiedType |
+ NeverSimplifiedType |
+ ParameterSimplifiedType => {
+ // nothing to do
+ }
+ IntSimplifiedType(t) => t.hash_stable(hcx, hasher),
+ UintSimplifiedType(t) => t.hash_stable(hcx, hasher),
+ FloatSimplifiedType(t) => t.hash_stable(hcx, hasher),
+ AdtSimplifiedType(d) => d.hash_stable(hcx, hasher),
+ TupleSimplifiedType(n) => n.hash_stable(hcx, hasher),
+ TraitSimplifiedType(d) => d.hash_stable(hcx, hasher),
+ ClosureSimplifiedType(d) => d.hash_stable(hcx, hasher),
+ GeneratorSimplifiedType(d) => d.hash_stable(hcx, hasher),
+ AnonSimplifiedType(d) => d.hash_stable(hcx, hasher),
+ FunctionSimplifiedType(n) => n.hash_stable(hcx, hasher),
+ }
+ }
+}