hir_ty/
chalk_db.rs

1//! The implementation of `RustIrDatabase` for Chalk, which provides information
2//! about the code that Chalk needs.
3use 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
57/// Returns instantiated predicates.
58pub(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}