11use rustc_data_structures:: stable_hasher:: HashStable ;
22use rustc_data_structures:: stable_hasher:: StableHasher ;
3- use rustc_serialize:: { Decodable , Decoder , Encodable } ;
43use std:: fmt;
54
6- use crate :: {
7- DebruijnIndex , DebugWithInfcx , HashStableContext , InferCtxtLike , Interner , TyDecoder ,
8- TyEncoder , WithInfcx ,
9- } ;
5+ use crate :: { DebruijnIndex , DebugWithInfcx , HashStableContext , InferCtxtLike , Interner , WithInfcx } ;
106
117use self :: ConstKind :: * ;
128
@@ -20,6 +16,7 @@ use self::ConstKind::*;
2016 Ord = "feature_allow_slow_enum" ,
2117 Hash ( bound = "" )
2218) ]
19+ #[ derive( TyEncodable , TyDecodable ) ]
2320pub enum ConstKind < I : Interner > {
2421 /// A const generic parameter.
2522 Param ( I :: ParamConst ) ,
9289 }
9390}
9491
95- impl < I : Interner , D : TyDecoder < I = I > > Decodable < D > for ConstKind < I >
96- where
97- I :: ParamConst : Decodable < D > ,
98- I :: InferConst : Decodable < D > ,
99- I :: BoundConst : Decodable < D > ,
100- I :: PlaceholderConst : Decodable < D > ,
101- I :: AliasConst : Decodable < D > ,
102- I :: ValueConst : Decodable < D > ,
103- I :: ErrorGuaranteed : Decodable < D > ,
104- I :: ExprConst : Decodable < D > ,
105- {
106- fn decode ( d : & mut D ) -> Self {
107- match Decoder :: read_usize ( d) {
108- 0 => Param ( Decodable :: decode ( d) ) ,
109- 1 => Infer ( Decodable :: decode ( d) ) ,
110- 2 => Bound ( Decodable :: decode ( d) , Decodable :: decode ( d) ) ,
111- 3 => Placeholder ( Decodable :: decode ( d) ) ,
112- 4 => Unevaluated ( Decodable :: decode ( d) ) ,
113- 5 => Value ( Decodable :: decode ( d) ) ,
114- 6 => Error ( Decodable :: decode ( d) ) ,
115- 7 => Expr ( Decodable :: decode ( d) ) ,
116- _ => panic ! (
117- "{}" ,
118- format!(
119- "invalid enum variant tag while decoding `{}`, expected 0..{}" ,
120- "ConstKind" , 8 ,
121- )
122- ) ,
123- }
124- }
125- }
126-
127- impl < I : Interner , E : TyEncoder < I = I > > Encodable < E > for ConstKind < I >
128- where
129- I :: ParamConst : Encodable < E > ,
130- I :: InferConst : Encodable < E > ,
131- I :: BoundConst : Encodable < E > ,
132- I :: PlaceholderConst : Encodable < E > ,
133- I :: AliasConst : Encodable < E > ,
134- I :: ValueConst : Encodable < E > ,
135- I :: ErrorGuaranteed : Encodable < E > ,
136- I :: ExprConst : Encodable < E > ,
137- {
138- fn encode ( & self , e : & mut E ) {
139- let disc = const_kind_discriminant ( self ) ;
140- match self {
141- Param ( p) => e. emit_enum_variant ( disc, |e| p. encode ( e) ) ,
142- Infer ( i) => e. emit_enum_variant ( disc, |e| i. encode ( e) ) ,
143- Bound ( d, b) => e. emit_enum_variant ( disc, |e| {
144- d. encode ( e) ;
145- b. encode ( e) ;
146- } ) ,
147- Placeholder ( p) => e. emit_enum_variant ( disc, |e| p. encode ( e) ) ,
148- Unevaluated ( u) => e. emit_enum_variant ( disc, |e| u. encode ( e) ) ,
149- Value ( v) => e. emit_enum_variant ( disc, |e| v. encode ( e) ) ,
150- Error ( er) => e. emit_enum_variant ( disc, |e| er. encode ( e) ) ,
151- Expr ( ex) => e. emit_enum_variant ( disc, |e| ex. encode ( e) ) ,
152- }
153- }
154- }
155-
15692impl < I : Interner > PartialEq for ConstKind < I > {
15793 fn eq ( & self , other : & Self ) -> bool {
15894 match ( self , other) {
0 commit comments