1 use rustc::infer::nll_relate::{TypeRelating, TypeRelatingDelegate, NormalizationStrategy};
2 use rustc::infer::{InferCtxt, RegionVariableOrigin};
3 use rustc::traits::{DomainGoal, Goal, Environment, InEnvironment};
4 use rustc::ty::relate::{Relate, TypeRelation, RelateResult};
6 use syntax_pos::DUMMY_SP;
8 crate struct UnificationResult<'tcx> {
9 crate goals: Vec<InEnvironment<'tcx, Goal<'tcx>>>,
10 crate constraints: Vec<super::RegionConstraint<'tcx>>,
13 crate fn unify<'me, 'gcx, 'tcx, T: Relate<'tcx>>(
14 infcx: &'me InferCtxt<'me, 'gcx, 'tcx>,
15 environment: Environment<'tcx>,
16 variance: ty::Variance,
19 ) -> RelateResult<'tcx, UnificationResult<'tcx>> {
24 )", a, b, environment);
26 let mut delegate = ChalkTypeRelatingDelegate::new(
37 debug!("unify: goals = {:?}, constraints = {:?}", delegate.goals, delegate.constraints);
39 Ok(UnificationResult {
40 goals: delegate.goals,
41 constraints: delegate.constraints,
45 struct ChalkTypeRelatingDelegate<'me, 'gcx: 'tcx, 'tcx: 'me> {
46 infcx: &'me InferCtxt<'me, 'gcx, 'tcx>,
47 environment: Environment<'tcx>,
48 goals: Vec<InEnvironment<'tcx, Goal<'tcx>>>,
49 constraints: Vec<super::RegionConstraint<'tcx>>,
52 impl ChalkTypeRelatingDelegate<'me, 'gcx, 'tcx> {
54 infcx: &'me InferCtxt<'me, 'gcx, 'tcx>,
55 environment: Environment<'tcx>,
61 constraints: Vec::new(),
66 impl TypeRelatingDelegate<'tcx> for &mut ChalkTypeRelatingDelegate<'_, '_, 'tcx> {
67 fn create_next_universe(&mut self) -> ty::UniverseIndex {
68 self.infcx.create_next_universe()
71 fn next_existential_region_var(&mut self) -> ty::Region<'tcx> {
72 self.infcx.next_region_var(RegionVariableOrigin::MiscVariable(DUMMY_SP))
75 fn next_placeholder_region(
77 placeholder: ty::PlaceholderRegion
78 ) -> ty::Region<'tcx> {
79 self.infcx.tcx.mk_region(ty::RePlaceholder(placeholder))
82 fn generalize_existential(&mut self, universe: ty::UniverseIndex) -> ty::Region<'tcx> {
83 self.infcx.next_region_var_in_universe(
84 RegionVariableOrigin::MiscVariable(DUMMY_SP),
89 fn push_outlives(&mut self, sup: ty::Region<'tcx>, sub: ty::Region<'tcx>) {
90 self.constraints.push(ty::OutlivesPredicate(sup.into(), sub));
93 fn push_domain_goal(&mut self, domain_goal: DomainGoal<'tcx>) {
94 let goal = self.environment.with(
95 self.infcx.tcx.mk_goal(domain_goal.into_goal())
97 self.goals.push(goal);
100 fn normalization() -> NormalizationStrategy {
101 NormalizationStrategy::Lazy
104 fn forbid_inference_vars() -> bool {