Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir-ty/src/chalk_db.rs')
-rw-r--r--crates/hir-ty/src/chalk_db.rs20
1 files changed, 9 insertions, 11 deletions
diff --git a/crates/hir-ty/src/chalk_db.rs b/crates/hir-ty/src/chalk_db.rs
index c8ff6cba3d..6d4753ea38 100644
--- a/crates/hir-ty/src/chalk_db.rs
+++ b/crates/hir-ty/src/chalk_db.rs
@@ -768,23 +768,21 @@ pub(crate) fn adt_datum_query(
phantom_data,
};
- // this slows down rust-analyzer by quite a bit unfortunately, so enabling this is currently not worth it
- let _variant_id_to_fields = |id: VariantId| {
+ let variant_id_to_fields = |id: VariantId| {
let variant_data = &id.variant_data(db.upcast());
- let fields = if variant_data.fields().is_empty() {
+ let fields = if variant_data.fields().is_empty() || bound_vars_subst.is_empty(Interner) {
vec![]
} else {
- let field_types = db.field_types(id);
- variant_data
- .fields()
- .iter()
- .map(|(idx, _)| field_types[idx].clone().substitute(Interner, &bound_vars_subst))
- .filter(|it| !it.contains_unknown())
- .collect()
+ // HACK: provide full struct type info slows down rust-analyzer by quite a bit unfortunately,
+ // so we trick chalk into thinking that our struct impl Unsize
+ if let Some(ty) = bound_vars_subst.at(Interner, 0).ty(Interner) {
+ vec![ty.clone()]
+ } else {
+ vec![]
+ }
};
rust_ir::AdtVariantDatum { fields }
};
- let variant_id_to_fields = |_: VariantId| rust_ir::AdtVariantDatum { fields: vec![] };
let (kind, variants) = match adt_id {
hir_def::AdtId::StructId(id) => {