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.rs27
1 files changed, 19 insertions, 8 deletions
diff --git a/crates/hir-ty/src/chalk_db.rs b/crates/hir-ty/src/chalk_db.rs
index 55d0edd5e0..9f01f1eb25 100644
--- a/crates/hir-ty/src/chalk_db.rs
+++ b/crates/hir-ty/src/chalk_db.rs
@@ -13,7 +13,7 @@ use chalk_solve::rust_ir::{self, OpaqueTyDatumBound, WellKnownTrait};
use base_db::CrateId;
use hir_def::{
- data::adt::StructFlags,
+ data::{adt::StructFlags, TraitFlags},
hir::Movability,
lang_item::{LangItem, LangItemTarget},
AssocItemId, BlockId, CallableDefId, GenericDefId, HasModule, ItemContainerId, Lookup,
@@ -675,13 +675,13 @@ pub(crate) fn trait_datum_query(
let generic_params = generics(db.upcast(), trait_.into());
let bound_vars = generic_params.bound_vars_subst(db, DebruijnIndex::INNERMOST);
let flags = rust_ir::TraitFlags {
- auto: trait_data.is_auto,
+ auto: trait_data.flags.contains(TraitFlags::IS_AUTO),
upstream: trait_.lookup(db.upcast()).container.krate() != krate,
non_enumerable: true,
coinductive: false, // only relevant for Chalk testing
// FIXME: set these flags correctly
marker: false,
- fundamental: trait_data.fundamental,
+ fundamental: trait_data.flags.contains(TraitFlags::IS_FUNDAMENTAL),
};
let where_clauses = convert_where_clauses(db, trait_.into(), &bound_vars);
let associated_ty_ids = trait_data.associated_types().map(to_assoc_type_id).collect();
@@ -950,11 +950,18 @@ pub(crate) fn fn_def_datum_query(db: &dyn HirDatabase, fn_def_id: FnDefId) -> Ar
pub(crate) fn fn_def_variance_query(db: &dyn HirDatabase, fn_def_id: FnDefId) -> Variances {
let callable_def: CallableDefId = from_chalk(db, fn_def_id);
- let generic_params =
- generics(db.upcast(), GenericDefId::from_callable(db.upcast(), callable_def));
Variances::from_iter(
Interner,
- std::iter::repeat(chalk_ir::Variance::Invariant).take(generic_params.len()),
+ db.variances_of(GenericDefId::from_callable(db.upcast(), callable_def))
+ .as_deref()
+ .unwrap_or_default()
+ .iter()
+ .map(|v| match v {
+ crate::variance::Variance::Covariant => chalk_ir::Variance::Covariant,
+ crate::variance::Variance::Invariant => chalk_ir::Variance::Invariant,
+ crate::variance::Variance::Contravariant => chalk_ir::Variance::Contravariant,
+ crate::variance::Variance::Bivariant => chalk_ir::Variance::Invariant,
+ }),
)
}
@@ -962,10 +969,14 @@ pub(crate) fn adt_variance_query(
db: &dyn HirDatabase,
chalk_ir::AdtId(adt_id): AdtId,
) -> Variances {
- let generic_params = generics(db.upcast(), adt_id.into());
Variances::from_iter(
Interner,
- std::iter::repeat(chalk_ir::Variance::Invariant).take(generic_params.len()),
+ db.variances_of(adt_id.into()).as_deref().unwrap_or_default().iter().map(|v| match v {
+ crate::variance::Variance::Covariant => chalk_ir::Variance::Covariant,
+ crate::variance::Variance::Invariant => chalk_ir::Variance::Invariant,
+ crate::variance::Variance::Contravariant => chalk_ir::Variance::Contravariant,
+ crate::variance::Variance::Bivariant => chalk_ir::Variance::Invariant,
+ }),
)
}