diff options
author | Florian Diebold <[email protected]> | 2019-08-07 21:06:09 +0100 |
---|---|---|
committer | Florian Diebold <[email protected]> | 2019-08-12 20:43:00 +0100 |
commit | 6265497523469990ce39e6817423c35a17055a54 (patch) | |
tree | e50d81f36127412fa4238d2a71637358bc2d1b5f | |
parent | 22724f37f3ae73983bf700d10d80a8dbd4fa4073 (diff) |
Normalize associated types during inference
-rw-r--r-- | crates/ra_hir/src/ty/infer.rs | 22 | ||||
-rw-r--r-- | crates/ra_hir/src/ty/lower.rs | 5 | ||||
-rw-r--r-- | crates/ra_hir/src/ty/traits/chalk.rs | 7 |
3 files changed, 25 insertions, 9 deletions
diff --git a/crates/ra_hir/src/ty/infer.rs b/crates/ra_hir/src/ty/infer.rs index 594c5bc79..74fc77cfb 100644 --- a/crates/ra_hir/src/ty/infer.rs +++ b/crates/ra_hir/src/ty/infer.rs | |||
@@ -245,7 +245,8 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> { | |||
245 | &self.resolver, | 245 | &self.resolver, |
246 | type_ref, | 246 | type_ref, |
247 | ); | 247 | ); |
248 | self.insert_type_vars(ty) | 248 | let ty = self.insert_type_vars(ty); |
249 | self.normalize_associated_types_in(ty) | ||
249 | } | 250 | } |
250 | 251 | ||
251 | fn unify_substs(&mut self, substs1: &Substs, substs2: &Substs, depth: usize) -> bool { | 252 | fn unify_substs(&mut self, substs1: &Substs, substs2: &Substs, depth: usize) -> bool { |
@@ -411,6 +412,25 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> { | |||
411 | ty | 412 | ty |
412 | } | 413 | } |
413 | 414 | ||
415 | fn normalize_associated_types_in(&mut self, ty: Ty) -> Ty { | ||
416 | ty.fold(&mut |ty| match ty { | ||
417 | Ty::Projection(proj_ty) => self.normalize_projection_ty(proj_ty), | ||
418 | Ty::UnselectedProjection(proj_ty) => { | ||
419 | // FIXME | ||
420 | Ty::UnselectedProjection(proj_ty) | ||
421 | } | ||
422 | _ => ty, | ||
423 | }) | ||
424 | } | ||
425 | |||
426 | fn normalize_projection_ty(&mut self, proj_ty: ProjectionTy) -> Ty { | ||
427 | let var = self.new_type_var(); | ||
428 | let predicate = ProjectionPredicate { projection_ty: proj_ty.clone(), ty: var.clone() }; | ||
429 | let obligation = Obligation::Projection(predicate); | ||
430 | self.obligations.push(obligation); | ||
431 | var | ||
432 | } | ||
433 | |||
414 | /// Resolves the type completely; type variables without known type are | 434 | /// Resolves the type completely; type variables without known type are |
415 | /// replaced by Ty::Unknown. | 435 | /// replaced by Ty::Unknown. |
416 | fn resolve_ty_completely(&mut self, tv_stack: &mut Vec<TypeVarId>, ty: Ty) -> Ty { | 436 | fn resolve_ty_completely(&mut self, tv_stack: &mut Vec<TypeVarId>, ty: Ty) -> Ty { |
diff --git a/crates/ra_hir/src/ty/lower.rs b/crates/ra_hir/src/ty/lower.rs index 24ec77fcf..debedcbb8 100644 --- a/crates/ra_hir/src/ty/lower.rs +++ b/crates/ra_hir/src/ty/lower.rs | |||
@@ -117,11 +117,6 @@ impl Ty { | |||
117 | return Ty::Unknown; | 117 | return Ty::Unknown; |
118 | } | 118 | } |
119 | }; | 119 | }; |
120 | eprintln!( | ||
121 | "assoc ty: {:?}, parameters: {:?}", | ||
122 | associated_ty.name(db), | ||
123 | trait_ref.substs | ||
124 | ); | ||
125 | // FIXME handle type parameters on the segment | 120 | // FIXME handle type parameters on the segment |
126 | Ty::Projection(ProjectionTy { associated_ty, parameters: trait_ref.substs }) | 121 | Ty::Projection(ProjectionTy { associated_ty, parameters: trait_ref.substs }) |
127 | } else { | 122 | } else { |
diff --git a/crates/ra_hir/src/ty/traits/chalk.rs b/crates/ra_hir/src/ty/traits/chalk.rs index 21055dcfd..e669f835b 100644 --- a/crates/ra_hir/src/ty/traits/chalk.rs +++ b/crates/ra_hir/src/ty/traits/chalk.rs | |||
@@ -402,11 +402,12 @@ where | |||
402 | &self, | 402 | &self, |
403 | projection: &'p chalk_ir::ProjectionTy, | 403 | projection: &'p chalk_ir::ProjectionTy, |
404 | ) -> (Arc<AssociatedTyDatum>, &'p [Parameter], &'p [Parameter]) { | 404 | ) -> (Arc<AssociatedTyDatum>, &'p [Parameter], &'p [Parameter]) { |
405 | debug!("split_projection {:?}", projection); | 405 | let proj_ty: ProjectionTy = from_chalk(self.db, projection.clone()); |
406 | unimplemented!() | 406 | debug!("split_projection {:?} = {}", projection, proj_ty.display(self.db)); |
407 | // we don't support GATs, so I think this should always be correct currently | ||
408 | (self.db.associated_ty_data(projection.associated_ty_id), &projection.parameters, &[]) | ||
407 | } | 409 | } |
408 | fn custom_clauses(&self) -> Vec<chalk_ir::ProgramClause> { | 410 | fn custom_clauses(&self) -> Vec<chalk_ir::ProgramClause> { |
409 | debug!("custom_clauses"); | ||
410 | vec![] | 411 | vec![] |
411 | } | 412 | } |
412 | fn all_structs(&self) -> Vec<chalk_ir::StructId> { | 413 | fn all_structs(&self) -> Vec<chalk_ir::StructId> { |