Skip to content

Commit 861cd92

Browse files
committed
Return ADT fields from adt_datum_query()
1 parent a1f9d66 commit 861cd92

File tree

1 file changed

+38
-13
lines changed

1 file changed

+38
-13
lines changed

crates/hir-ty/src/chalk_db.rs

+38-13
Original file line numberDiff line numberDiff line change
@@ -604,26 +604,51 @@ pub(crate) fn adt_datum_query(
604604
debug!("adt_datum {:?}", adt_id);
605605
let chalk_ir::AdtId(adt_id) = adt_id;
606606
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+
613610
let flags = rust_ir::AdtFlags {
614-
upstream,
611+
upstream: adt_id.module(db.upcast()).krate() != krate,
615612
// FIXME set fundamental and phantom_data flags correctly
616613
fundamental: false,
617614
phantom_data: false,
618615
};
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+
}
622647
};
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 };
624650
let struct_datum = AdtDatum {
625-
// FIXME set ADT kind
626-
kind: rust_ir::AdtKind::Struct,
651+
kind,
627652
id: chalk_ir::AdtId(adt_id),
628653
binders: make_binders(db, &generic_params, struct_datum_bound),
629654
flags,

0 commit comments

Comments
 (0)