1use hir_def::{CallableDefId, GenericDefId};
4
5use crate::{Interner, Substitution, db::HirDatabase, mapping::from_chalk};
6
7pub(crate) type AssocTypeId = chalk_ir::AssocTypeId<Interner>;
8pub(crate) type TraitId = chalk_ir::TraitId<Interner>;
9pub(crate) type AdtId = chalk_ir::AdtId<Interner>;
10pub(crate) type ImplId = chalk_ir::ImplId<Interner>;
11pub(crate) type Variances = chalk_ir::Variances<Interner>;
12
13impl chalk_ir::UnificationDatabase<Interner> for &dyn HirDatabase {
14 fn fn_def_variance(
15 &self,
16 fn_def_id: chalk_ir::FnDefId<Interner>,
17 ) -> chalk_ir::Variances<Interner> {
18 HirDatabase::fn_def_variance(*self, from_chalk(*self, fn_def_id))
19 }
20
21 fn adt_variance(&self, adt_id: chalk_ir::AdtId<Interner>) -> chalk_ir::Variances<Interner> {
22 HirDatabase::adt_variance(*self, adt_id.0)
23 }
24}
25
26pub(crate) fn fn_def_variance_query(
27 db: &dyn HirDatabase,
28 callable_def: CallableDefId,
29) -> Variances {
30 Variances::from_iter(
31 Interner,
32 db.variances_of(GenericDefId::from_callable(db, callable_def))
33 .as_deref()
34 .unwrap_or_default()
35 .iter()
36 .map(|v| match v {
37 crate::variance::Variance::Covariant => chalk_ir::Variance::Covariant,
38 crate::variance::Variance::Invariant => chalk_ir::Variance::Invariant,
39 crate::variance::Variance::Contravariant => chalk_ir::Variance::Contravariant,
40 crate::variance::Variance::Bivariant => chalk_ir::Variance::Invariant,
41 }),
42 )
43}
44
45pub(crate) fn adt_variance_query(db: &dyn HirDatabase, adt_id: hir_def::AdtId) -> Variances {
46 Variances::from_iter(
47 Interner,
48 db.variances_of(adt_id.into()).as_deref().unwrap_or_default().iter().map(|v| match v {
49 crate::variance::Variance::Covariant => chalk_ir::Variance::Covariant,
50 crate::variance::Variance::Invariant => chalk_ir::Variance::Invariant,
51 crate::variance::Variance::Contravariant => chalk_ir::Variance::Contravariant,
52 crate::variance::Variance::Bivariant => chalk_ir::Variance::Invariant,
53 }),
54 )
55}
56
57pub(super) fn convert_where_clauses(
59 db: &dyn HirDatabase,
60 def: GenericDefId,
61 substs: &Substitution,
62) -> Vec<chalk_ir::QuantifiedWhereClause<Interner>> {
63 db.generic_predicates(def)
64 .iter()
65 .cloned()
66 .map(|pred| pred.substitute(Interner, substs))
67 .collect()
68}