|
2 | 2 |
|
3 | 3 | use rustc_data_structures::stable_hasher::{HashStable, StableHasher};
|
4 | 4 | use rustc_data_structures::unify::{EqUnifyValue, UnifyKey};
|
5 |
| -use rustc_serialize::{Decodable, Decoder, Encodable}; |
6 | 5 | use std::fmt;
|
7 | 6 | use std::mem::discriminant;
|
8 | 7 |
|
9 | 8 | use crate::HashStableContext;
|
10 | 9 | use crate::Interner;
|
11 |
| -use crate::TyDecoder; |
12 |
| -use crate::TyEncoder; |
13 | 10 | use crate::{DebruijnIndex, DebugWithInfcx, InferCtxtLike, WithInfcx};
|
14 | 11 |
|
15 | 12 | use self::TyKind::*;
|
@@ -122,6 +119,7 @@ pub enum AliasKind {
|
122 | 119 | Ord = "feature_allow_slow_enum",
|
123 | 120 | Hash(bound = "")
|
124 | 121 | )]
|
| 122 | +#[derive(TyEncodable, TyDecodable)] |
125 | 123 | pub enum TyKind<I: Interner> {
|
126 | 124 | /// The primitive boolean type. Written as `bool`.
|
127 | 125 | Bool,
|
@@ -472,178 +470,6 @@ impl<I: Interner> fmt::Debug for TyKind<I> {
|
472 | 470 | }
|
473 | 471 | }
|
474 | 472 |
|
475 |
| -// This is manually implemented because a derive would require `I: Encodable` |
476 |
| -impl<I: Interner, E: TyEncoder<I = I>> Encodable<E> for TyKind<I> |
477 |
| -where |
478 |
| - I::ErrorGuaranteed: Encodable<E>, |
479 |
| - I::AdtDef: Encodable<E>, |
480 |
| - I::GenericArgs: Encodable<E>, |
481 |
| - I::DefId: Encodable<E>, |
482 |
| - I::Ty: Encodable<E>, |
483 |
| - I::Const: Encodable<E>, |
484 |
| - I::Region: Encodable<E>, |
485 |
| - I::TypeAndMut: Encodable<E>, |
486 |
| - I::PolyFnSig: Encodable<E>, |
487 |
| - I::BoundExistentialPredicates: Encodable<E>, |
488 |
| - I::Tys: Encodable<E>, |
489 |
| - I::AliasTy: Encodable<E>, |
490 |
| - I::ParamTy: Encodable<E>, |
491 |
| - I::BoundTy: Encodable<E>, |
492 |
| - I::PlaceholderTy: Encodable<E>, |
493 |
| - I::InferTy: Encodable<E>, |
494 |
| - I::AllocId: Encodable<E>, |
495 |
| -{ |
496 |
| - fn encode(&self, e: &mut E) { |
497 |
| - let disc = tykind_discriminant(self); |
498 |
| - match self { |
499 |
| - Bool => e.emit_enum_variant(disc, |_| {}), |
500 |
| - Char => e.emit_enum_variant(disc, |_| {}), |
501 |
| - Int(i) => e.emit_enum_variant(disc, |e| { |
502 |
| - i.encode(e); |
503 |
| - }), |
504 |
| - Uint(u) => e.emit_enum_variant(disc, |e| { |
505 |
| - u.encode(e); |
506 |
| - }), |
507 |
| - Float(f) => e.emit_enum_variant(disc, |e| { |
508 |
| - f.encode(e); |
509 |
| - }), |
510 |
| - Adt(adt, args) => e.emit_enum_variant(disc, |e| { |
511 |
| - adt.encode(e); |
512 |
| - args.encode(e); |
513 |
| - }), |
514 |
| - Foreign(def_id) => e.emit_enum_variant(disc, |e| { |
515 |
| - def_id.encode(e); |
516 |
| - }), |
517 |
| - Str => e.emit_enum_variant(disc, |_| {}), |
518 |
| - Array(t, c) => e.emit_enum_variant(disc, |e| { |
519 |
| - t.encode(e); |
520 |
| - c.encode(e); |
521 |
| - }), |
522 |
| - Slice(t) => e.emit_enum_variant(disc, |e| { |
523 |
| - t.encode(e); |
524 |
| - }), |
525 |
| - RawPtr(tam) => e.emit_enum_variant(disc, |e| { |
526 |
| - tam.encode(e); |
527 |
| - }), |
528 |
| - Ref(r, t, m) => e.emit_enum_variant(disc, |e| { |
529 |
| - r.encode(e); |
530 |
| - t.encode(e); |
531 |
| - m.encode(e); |
532 |
| - }), |
533 |
| - FnDef(def_id, args) => e.emit_enum_variant(disc, |e| { |
534 |
| - def_id.encode(e); |
535 |
| - args.encode(e); |
536 |
| - }), |
537 |
| - FnPtr(polyfnsig) => e.emit_enum_variant(disc, |e| { |
538 |
| - polyfnsig.encode(e); |
539 |
| - }), |
540 |
| - Dynamic(l, r, repr) => e.emit_enum_variant(disc, |e| { |
541 |
| - l.encode(e); |
542 |
| - r.encode(e); |
543 |
| - repr.encode(e); |
544 |
| - }), |
545 |
| - Closure(def_id, args) => e.emit_enum_variant(disc, |e| { |
546 |
| - def_id.encode(e); |
547 |
| - args.encode(e); |
548 |
| - }), |
549 |
| - Coroutine(def_id, args, m) => e.emit_enum_variant(disc, |e| { |
550 |
| - def_id.encode(e); |
551 |
| - args.encode(e); |
552 |
| - m.encode(e); |
553 |
| - }), |
554 |
| - CoroutineWitness(def_id, args) => e.emit_enum_variant(disc, |e| { |
555 |
| - def_id.encode(e); |
556 |
| - args.encode(e); |
557 |
| - }), |
558 |
| - Never => e.emit_enum_variant(disc, |_| {}), |
559 |
| - Tuple(args) => e.emit_enum_variant(disc, |e| { |
560 |
| - args.encode(e); |
561 |
| - }), |
562 |
| - Alias(k, p) => e.emit_enum_variant(disc, |e| { |
563 |
| - k.encode(e); |
564 |
| - p.encode(e); |
565 |
| - }), |
566 |
| - Param(p) => e.emit_enum_variant(disc, |e| { |
567 |
| - p.encode(e); |
568 |
| - }), |
569 |
| - Bound(d, b) => e.emit_enum_variant(disc, |e| { |
570 |
| - d.encode(e); |
571 |
| - b.encode(e); |
572 |
| - }), |
573 |
| - Placeholder(p) => e.emit_enum_variant(disc, |e| { |
574 |
| - p.encode(e); |
575 |
| - }), |
576 |
| - Infer(i) => e.emit_enum_variant(disc, |e| { |
577 |
| - i.encode(e); |
578 |
| - }), |
579 |
| - Error(d) => e.emit_enum_variant(disc, |e| { |
580 |
| - d.encode(e); |
581 |
| - }), |
582 |
| - } |
583 |
| - } |
584 |
| -} |
585 |
| - |
586 |
| -// This is manually implemented because a derive would require `I: Decodable` |
587 |
| -impl<I: Interner, D: TyDecoder<I = I>> Decodable<D> for TyKind<I> |
588 |
| -where |
589 |
| - I::ErrorGuaranteed: Decodable<D>, |
590 |
| - I::AdtDef: Decodable<D>, |
591 |
| - I::GenericArgs: Decodable<D>, |
592 |
| - I::DefId: Decodable<D>, |
593 |
| - I::Ty: Decodable<D>, |
594 |
| - I::Const: Decodable<D>, |
595 |
| - I::Region: Decodable<D>, |
596 |
| - I::TypeAndMut: Decodable<D>, |
597 |
| - I::PolyFnSig: Decodable<D>, |
598 |
| - I::BoundExistentialPredicates: Decodable<D>, |
599 |
| - I::Tys: Decodable<D>, |
600 |
| - I::AliasTy: Decodable<D>, |
601 |
| - I::ParamTy: Decodable<D>, |
602 |
| - I::AliasTy: Decodable<D>, |
603 |
| - I::BoundTy: Decodable<D>, |
604 |
| - I::PlaceholderTy: Decodable<D>, |
605 |
| - I::InferTy: Decodable<D>, |
606 |
| - I::AllocId: Decodable<D>, |
607 |
| -{ |
608 |
| - fn decode(d: &mut D) -> Self { |
609 |
| - match Decoder::read_usize(d) { |
610 |
| - 0 => Bool, |
611 |
| - 1 => Char, |
612 |
| - 2 => Int(Decodable::decode(d)), |
613 |
| - 3 => Uint(Decodable::decode(d)), |
614 |
| - 4 => Float(Decodable::decode(d)), |
615 |
| - 5 => Adt(Decodable::decode(d), Decodable::decode(d)), |
616 |
| - 6 => Foreign(Decodable::decode(d)), |
617 |
| - 7 => Str, |
618 |
| - 8 => Array(Decodable::decode(d), Decodable::decode(d)), |
619 |
| - 9 => Slice(Decodable::decode(d)), |
620 |
| - 10 => RawPtr(Decodable::decode(d)), |
621 |
| - 11 => Ref(Decodable::decode(d), Decodable::decode(d), Decodable::decode(d)), |
622 |
| - 12 => FnDef(Decodable::decode(d), Decodable::decode(d)), |
623 |
| - 13 => FnPtr(Decodable::decode(d)), |
624 |
| - 14 => Dynamic(Decodable::decode(d), Decodable::decode(d), Decodable::decode(d)), |
625 |
| - 15 => Closure(Decodable::decode(d), Decodable::decode(d)), |
626 |
| - 16 => Coroutine(Decodable::decode(d), Decodable::decode(d), Decodable::decode(d)), |
627 |
| - 17 => CoroutineWitness(Decodable::decode(d), Decodable::decode(d)), |
628 |
| - 18 => Never, |
629 |
| - 19 => Tuple(Decodable::decode(d)), |
630 |
| - 20 => Alias(Decodable::decode(d), Decodable::decode(d)), |
631 |
| - 21 => Param(Decodable::decode(d)), |
632 |
| - 22 => Bound(Decodable::decode(d), Decodable::decode(d)), |
633 |
| - 23 => Placeholder(Decodable::decode(d)), |
634 |
| - 24 => Infer(Decodable::decode(d)), |
635 |
| - 25 => Error(Decodable::decode(d)), |
636 |
| - _ => panic!( |
637 |
| - "{}", |
638 |
| - format!( |
639 |
| - "invalid enum variant tag while decoding `{}`, expected 0..{}", |
640 |
| - "TyKind", 26, |
641 |
| - ) |
642 |
| - ), |
643 |
| - } |
644 |
| - } |
645 |
| -} |
646 |
| - |
647 | 473 | // This is not a derived impl because a derive would require `I: HashStable`
|
648 | 474 | #[allow(rustc::usage_of_ty_tykind)]
|
649 | 475 | impl<CTX: HashStableContext, I: Interner> HashStable<CTX> for TyKind<I>
|
|
0 commit comments