|
2 | 2 |
|
3 | 3 | use std::{fmt, ops::ControlFlow}; |
4 | 4 |
|
| 5 | +use either::Either; |
5 | 6 | use intern::{Interned, InternedRef, InternedSliceRef, impl_internable}; |
6 | 7 | use macros::GenericTypeVisitable; |
7 | 8 | use rustc_abi::ReprOptions; |
@@ -597,20 +598,17 @@ impl<'db> inherent::AdtDef<DbInterner<'db>> for AdtDef { |
597 | 598 | interner: DbInterner<'db>, |
598 | 599 | ) -> EarlyBinder<DbInterner<'db>, impl IntoIterator<Item = Ty<'db>>> { |
599 | 600 | let db = interner.db(); |
600 | | - // FIXME: this is disabled just to match the behavior with chalk right now |
601 | | - let _field_tys = |id: VariantId| { |
602 | | - db.field_types(id).iter().map(|(_, ty)| ty.ty().skip_binder()).collect::<Vec<_>>() |
603 | | - }; |
604 | | - let field_tys = |_id: VariantId| vec![]; |
605 | | - let tys: Vec<_> = match self.def_id() { |
606 | | - hir_def::AdtId::StructId(id) => field_tys(id.into()), |
607 | | - hir_def::AdtId::UnionId(id) => field_tys(id.into()), |
608 | | - hir_def::AdtId::EnumId(id) => id |
609 | | - .enum_variants(db) |
610 | | - .variants |
611 | | - .values() |
612 | | - .flat_map(|&(variant_id, _)| field_tys(variant_id.into())) |
613 | | - .collect(), |
| 601 | + let field_tys = |
| 602 | + |id: VariantId| db.field_types(id).iter().map(|(_, ty)| ty.ty().skip_binder()); |
| 603 | + let tys = match self.def_id() { |
| 604 | + hir_def::AdtId::StructId(id) => Either::Left(field_tys(id.into())), |
| 605 | + hir_def::AdtId::UnionId(id) => Either::Left(field_tys(id.into())), |
| 606 | + hir_def::AdtId::EnumId(id) => Either::Right( |
| 607 | + id.enum_variants(db) |
| 608 | + .variants |
| 609 | + .values() |
| 610 | + .flat_map(move |&(variant_id, _)| field_tys(variant_id.into())), |
| 611 | + ), |
614 | 612 | }; |
615 | 613 |
|
616 | 614 | EarlyBinder::bind(tys) |
|
0 commit comments