diff options
author | Florian Diebold <[email protected]> | 2021-03-21 19:19:07 +0000 |
---|---|---|
committer | Florian Diebold <[email protected]> | 2021-03-21 19:19:07 +0000 |
commit | c4fd3f47f5b4f34476f8f085f2412a46aa0fd24f (patch) | |
tree | 82b6b318da1564cabd0225dfb3c67433f80b8ab8 /crates/hir_ty/src/autoderef.rs | |
parent | f7be314579db29f64ef660aef1896da33d420ad6 (diff) |
Align InEnvironment with Chalk
This in particular means storing a chalk_ir::Environment, not our
TraitEnvironment. This makes InEnvironment not usable for Type, where we
need to keep the full TraitEnvironment.
Diffstat (limited to 'crates/hir_ty/src/autoderef.rs')
-rw-r--r-- | crates/hir_ty/src/autoderef.rs | 24 |
1 files changed, 12 insertions, 12 deletions
diff --git a/crates/hir_ty/src/autoderef.rs b/crates/hir_ty/src/autoderef.rs index d6f0553b1..dc5fc759a 100644 --- a/crates/hir_ty/src/autoderef.rs +++ b/crates/hir_ty/src/autoderef.rs | |||
@@ -27,9 +27,9 @@ pub fn autoderef<'a>( | |||
27 | krate: Option<CrateId>, | 27 | krate: Option<CrateId>, |
28 | ty: InEnvironment<Canonical<Ty>>, | 28 | ty: InEnvironment<Canonical<Ty>>, |
29 | ) -> impl Iterator<Item = Canonical<Ty>> + 'a { | 29 | ) -> impl Iterator<Item = Canonical<Ty>> + 'a { |
30 | let InEnvironment { value: ty, environment } = ty; | 30 | let InEnvironment { goal: ty, environment } = ty; |
31 | successors(Some(ty), move |ty| { | 31 | successors(Some(ty), move |ty| { |
32 | deref(db, krate?, InEnvironment { value: ty, environment: environment.clone() }) | 32 | deref(db, krate?, InEnvironment { goal: ty, environment: environment.clone() }) |
33 | }) | 33 | }) |
34 | .take(AUTODEREF_RECURSION_LIMIT) | 34 | .take(AUTODEREF_RECURSION_LIMIT) |
35 | } | 35 | } |
@@ -39,8 +39,8 @@ pub(crate) fn deref( | |||
39 | krate: CrateId, | 39 | krate: CrateId, |
40 | ty: InEnvironment<&Canonical<Ty>>, | 40 | ty: InEnvironment<&Canonical<Ty>>, |
41 | ) -> Option<Canonical<Ty>> { | 41 | ) -> Option<Canonical<Ty>> { |
42 | if let Some(derefed) = ty.value.value.builtin_deref() { | 42 | if let Some(derefed) = ty.goal.value.builtin_deref() { |
43 | Some(Canonical { value: derefed, binders: ty.value.binders.clone() }) | 43 | Some(Canonical { value: derefed, binders: ty.goal.binders.clone() }) |
44 | } else { | 44 | } else { |
45 | deref_by_trait(db, krate, ty) | 45 | deref_by_trait(db, krate, ty) |
46 | } | 46 | } |
@@ -67,15 +67,15 @@ fn deref_by_trait( | |||
67 | // FIXME make the Canonical / bound var handling nicer | 67 | // FIXME make the Canonical / bound var handling nicer |
68 | 68 | ||
69 | let parameters = | 69 | let parameters = |
70 | Substitution::build_for_generics(&generic_params).push(ty.value.value.clone()).build(); | 70 | Substitution::build_for_generics(&generic_params).push(ty.goal.value.clone()).build(); |
71 | 71 | ||
72 | // Check that the type implements Deref at all | 72 | // Check that the type implements Deref at all |
73 | let trait_ref = | 73 | let trait_ref = |
74 | TraitRef { trait_id: to_chalk_trait_id(deref_trait), substitution: parameters.clone() }; | 74 | TraitRef { trait_id: to_chalk_trait_id(deref_trait), substitution: parameters.clone() }; |
75 | let implements_goal = Canonical { | 75 | let implements_goal = Canonical { |
76 | binders: ty.value.binders.clone(), | 76 | binders: ty.goal.binders.clone(), |
77 | value: InEnvironment { | 77 | value: InEnvironment { |
78 | value: trait_ref.cast(&Interner), | 78 | goal: trait_ref.cast(&Interner), |
79 | environment: ty.environment.clone(), | 79 | environment: ty.environment.clone(), |
80 | }, | 80 | }, |
81 | }; | 81 | }; |
@@ -91,20 +91,20 @@ fn deref_by_trait( | |||
91 | }), | 91 | }), |
92 | ty: TyKind::BoundVar(BoundVar::new( | 92 | ty: TyKind::BoundVar(BoundVar::new( |
93 | DebruijnIndex::INNERMOST, | 93 | DebruijnIndex::INNERMOST, |
94 | ty.value.binders.len(&Interner), | 94 | ty.goal.binders.len(&Interner), |
95 | )) | 95 | )) |
96 | .intern(&Interner), | 96 | .intern(&Interner), |
97 | }; | 97 | }; |
98 | 98 | ||
99 | let obligation = projection.cast(&Interner); | 99 | let obligation = projection.cast(&Interner); |
100 | 100 | ||
101 | let in_env = InEnvironment { value: obligation, environment: ty.environment }; | 101 | let in_env = InEnvironment { goal: obligation, environment: ty.environment }; |
102 | 102 | ||
103 | let canonical = Canonical { | 103 | let canonical = Canonical { |
104 | value: in_env, | 104 | value: in_env, |
105 | binders: CanonicalVarKinds::from_iter( | 105 | binders: CanonicalVarKinds::from_iter( |
106 | &Interner, | 106 | &Interner, |
107 | ty.value.binders.iter(&Interner).cloned().chain(Some(chalk_ir::WithKind::new( | 107 | ty.goal.binders.iter(&Interner).cloned().chain(Some(chalk_ir::WithKind::new( |
108 | chalk_ir::VariableKind::Ty(chalk_ir::TyVariableKind::General), | 108 | chalk_ir::VariableKind::Ty(chalk_ir::TyVariableKind::General), |
109 | chalk_ir::UniverseIndex::ROOT, | 109 | chalk_ir::UniverseIndex::ROOT, |
110 | ))), | 110 | ))), |
@@ -134,7 +134,7 @@ fn deref_by_trait( | |||
134 | if vars.0.value[i - 1].interned(&Interner) | 134 | if vars.0.value[i - 1].interned(&Interner) |
135 | != &TyKind::BoundVar(BoundVar::new(DebruijnIndex::INNERMOST, i - 1)) | 135 | != &TyKind::BoundVar(BoundVar::new(DebruijnIndex::INNERMOST, i - 1)) |
136 | { | 136 | { |
137 | warn!("complex solution for derefing {:?}: {:?}, ignoring", ty.value, solution); | 137 | warn!("complex solution for derefing {:?}: {:?}, ignoring", ty.goal, solution); |
138 | return None; | 138 | return None; |
139 | } | 139 | } |
140 | } | 140 | } |
@@ -144,7 +144,7 @@ fn deref_by_trait( | |||
144 | }) | 144 | }) |
145 | } | 145 | } |
146 | Solution::Ambig(_) => { | 146 | Solution::Ambig(_) => { |
147 | info!("Ambiguous solution for derefing {:?}: {:?}", ty.value, solution); | 147 | info!("Ambiguous solution for derefing {:?}: {:?}", ty.goal, solution); |
148 | None | 148 | None |
149 | } | 149 | } |
150 | } | 150 | } |