@@ -604,26 +604,51 @@ pub(crate) fn adt_datum_query(
604
604
debug ! ( "adt_datum {:?}" , adt_id) ;
605
605
let chalk_ir:: AdtId ( adt_id) = adt_id;
606
606
let generic_params = generics ( db. upcast ( ) , adt_id. into ( ) ) ;
607
- let upstream = adt_id. module ( db. upcast ( ) ) . krate ( ) != krate;
608
- let where_clauses = {
609
- let generic_params = generics ( db. upcast ( ) , adt_id. into ( ) ) ;
610
- let bound_vars = generic_params. bound_vars_subst ( db, DebruijnIndex :: INNERMOST ) ;
611
- convert_where_clauses ( db, adt_id. into ( ) , & bound_vars)
612
- } ;
607
+ let bound_vars_subst = generic_params. bound_vars_subst ( db, DebruijnIndex :: INNERMOST ) ;
608
+ let where_clauses = convert_where_clauses ( db, adt_id. into ( ) , & bound_vars_subst) ;
609
+
613
610
let flags = rust_ir:: AdtFlags {
614
- upstream,
611
+ upstream : adt_id . module ( db . upcast ( ) ) . krate ( ) != krate ,
615
612
// FIXME set fundamental and phantom_data flags correctly
616
613
fundamental : false ,
617
614
phantom_data : false ,
618
615
} ;
619
- // FIXME provide enum variants properly (for auto traits)
620
- let variant = rust_ir:: AdtVariantDatum {
621
- fields : Vec :: new ( ) , // FIXME add fields (only relevant for auto traits),
616
+
617
+ let variant_id_to_fields = |id| {
618
+ let field_types = db. field_types ( id) ;
619
+ let fields = id
620
+ . variant_data ( db. upcast ( ) )
621
+ . fields ( )
622
+ . iter ( )
623
+ . map ( |( idx, _) | field_types[ idx] . clone ( ) . substitute ( Interner , & bound_vars_subst) )
624
+ . collect ( ) ;
625
+ rust_ir:: AdtVariantDatum { fields }
626
+ } ;
627
+
628
+ let ( kind, variants) = match adt_id {
629
+ hir_def:: AdtId :: StructId ( id) => {
630
+ ( rust_ir:: AdtKind :: Struct , vec ! [ variant_id_to_fields( id. into( ) ) ] )
631
+ }
632
+ hir_def:: AdtId :: EnumId ( id) => {
633
+ let variants = db
634
+ . enum_data ( id)
635
+ . variants
636
+ . iter ( )
637
+ . map ( |( local_id, _) | {
638
+ let variant_id = hir_def:: EnumVariantId { parent : id, local_id } ;
639
+ variant_id_to_fields ( variant_id. into ( ) )
640
+ } )
641
+ . collect ( ) ;
642
+ ( rust_ir:: AdtKind :: Enum , variants)
643
+ }
644
+ hir_def:: AdtId :: UnionId ( id) => {
645
+ ( rust_ir:: AdtKind :: Union , vec ! [ variant_id_to_fields( id. into( ) ) ] )
646
+ }
622
647
} ;
623
- let struct_datum_bound = rust_ir:: AdtDatumBound { variants : vec ! [ variant] , where_clauses } ;
648
+
649
+ let struct_datum_bound = rust_ir:: AdtDatumBound { variants, where_clauses } ;
624
650
let struct_datum = AdtDatum {
625
- // FIXME set ADT kind
626
- kind : rust_ir:: AdtKind :: Struct ,
651
+ kind,
627
652
id : chalk_ir:: AdtId ( adt_id) ,
628
653
binders : make_binders ( db, & generic_params, struct_datum_bound) ,
629
654
flags,
0 commit comments