Skip to main content

rustc_next_trait_solver/
delegate.rs

1use std::ops::Deref;
2
3use rustc_type_ir::solve::{
4    Certainty, FetchEligibleAssocItemResponse, Goal, NoSolution, VisibleForLeakCheck,
5};
6use rustc_type_ir::{self as ty, InferCtxtLike, Interner, TypeFoldable};
7
8pub trait SolverDelegate: Deref<Target = Self::Infcx> + Sized {
9    type Infcx: InferCtxtLike<Interner = Self::Interner>;
10    type Interner: Interner;
11    fn cx(&self) -> Self::Interner {
12        (**self).cx()
13    }
14
15    fn build_with_canonical<V>(
16        cx: Self::Interner,
17        canonical: &ty::CanonicalQueryInput<Self::Interner, V>,
18    ) -> (Self, V, ty::CanonicalVarValues<Self::Interner>)
19    where
20        V: TypeFoldable<Self::Interner>;
21
22    fn compute_goal_fast_path(
23        &self,
24        goal: Goal<Self::Interner, <Self::Interner as Interner>::Predicate>,
25        span: <Self::Interner as Interner>::Span,
26    ) -> Option<Certainty>;
27
28    fn fresh_var_for_kind_with_span(
29        &self,
30        arg: <Self::Interner as Interner>::GenericArg,
31        span: <Self::Interner as Interner>::Span,
32    ) -> <Self::Interner as Interner>::GenericArg;
33
34    // FIXME: Uplift the leak check into this crate.
35    fn leak_check(&self, max_input_universe: ty::UniverseIndex) -> Result<(), NoSolution>;
36
37    fn evaluate_const(
38        &self,
39        param_env: <Self::Interner as Interner>::ParamEnv,
40        uv: ty::UnevaluatedConst<Self::Interner>,
41    ) -> Option<<Self::Interner as Interner>::Const>;
42
43    // FIXME: This only is here because `wf::obligations` is in `rustc_trait_selection`!
44    fn well_formed_goals(
45        &self,
46        param_env: <Self::Interner as Interner>::ParamEnv,
47        term: <Self::Interner as Interner>::Term,
48    ) -> Option<Vec<Goal<Self::Interner, <Self::Interner as Interner>::Predicate>>>;
49
50    fn make_deduplicated_region_constraints(
51        &self,
52    ) -> Vec<(ty::RegionConstraint<Self::Interner>, VisibleForLeakCheck)>;
53
54    fn instantiate_canonical<V>(
55        &self,
56        canonical: ty::Canonical<Self::Interner, V>,
57        values: ty::CanonicalVarValues<Self::Interner>,
58    ) -> V
59    where
60        V: TypeFoldable<Self::Interner>;
61
62    fn instantiate_canonical_var(
63        &self,
64        kind: ty::CanonicalVarKind<Self::Interner>,
65        span: <Self::Interner as Interner>::Span,
66        var_values: &[<Self::Interner as Interner>::GenericArg],
67        universe_map: impl Fn(ty::UniverseIndex) -> ty::UniverseIndex,
68    ) -> <Self::Interner as Interner>::GenericArg;
69
70    fn add_item_bounds_for_hidden_type(
71        &self,
72        def_id: <Self::Interner as Interner>::OpaqueTyId,
73        args: <Self::Interner as Interner>::GenericArgs,
74        param_env: <Self::Interner as Interner>::ParamEnv,
75        hidden_ty: <Self::Interner as Interner>::Ty,
76        goals: &mut Vec<Goal<Self::Interner, <Self::Interner as Interner>::Predicate>>,
77    );
78
79    fn fetch_eligible_assoc_item(
80        &self,
81        goal_trait_ref: ty::TraitRef<Self::Interner>,
82        trait_assoc_def_id: <Self::Interner as Interner>::TraitAssocTermId,
83        impl_def_id: <Self::Interner as Interner>::ImplId,
84    ) -> FetchEligibleAssocItemResponse<Self::Interner>;
85
86    fn is_transmutable(
87        &self,
88        src: <Self::Interner as Interner>::Ty,
89        dst: <Self::Interner as Interner>::Ty,
90        assume: <Self::Interner as Interner>::Const,
91    ) -> Result<Certainty, NoSolution>;
92}