diff options
Diffstat (limited to 'crates/ra_hir_ty/src/infer.rs')
-rw-r--r-- | crates/ra_hir_ty/src/infer.rs | 33 |
1 files changed, 25 insertions, 8 deletions
diff --git a/crates/ra_hir_ty/src/infer.rs b/crates/ra_hir_ty/src/infer.rs index e27ce6e91..b4a3e1675 100644 --- a/crates/ra_hir_ty/src/infer.rs +++ b/crates/ra_hir_ty/src/infer.rs | |||
@@ -42,7 +42,9 @@ use super::{ | |||
42 | ApplicationTy, GenericPredicate, InEnvironment, ProjectionTy, Substs, TraitEnvironment, | 42 | ApplicationTy, GenericPredicate, InEnvironment, ProjectionTy, Substs, TraitEnvironment, |
43 | TraitRef, Ty, TypeCtor, TypeWalk, Uncertain, | 43 | TraitRef, Ty, TypeCtor, TypeWalk, Uncertain, |
44 | }; | 44 | }; |
45 | use crate::{db::HirDatabase, infer::diagnostics::InferenceDiagnostic}; | 45 | use crate::{ |
46 | db::HirDatabase, infer::diagnostics::InferenceDiagnostic, lower::ImplTraitLoweringMode, | ||
47 | }; | ||
46 | 48 | ||
47 | pub(crate) use unify::unify; | 49 | pub(crate) use unify::unify; |
48 | 50 | ||
@@ -215,13 +217,12 @@ struct InferenceContext<'a, D: HirDatabase> { | |||
215 | 217 | ||
216 | impl<'a, D: HirDatabase> InferenceContext<'a, D> { | 218 | impl<'a, D: HirDatabase> InferenceContext<'a, D> { |
217 | fn new(db: &'a D, owner: DefWithBodyId, resolver: Resolver) -> Self { | 219 | fn new(db: &'a D, owner: DefWithBodyId, resolver: Resolver) -> Self { |
218 | let ctx = crate::lower::TyLoweringContext { db, resolver: &resolver }; | ||
219 | InferenceContext { | 220 | InferenceContext { |
220 | result: InferenceResult::default(), | 221 | result: InferenceResult::default(), |
221 | table: unify::InferenceTable::new(), | 222 | table: unify::InferenceTable::new(), |
222 | obligations: Vec::default(), | 223 | obligations: Vec::default(), |
223 | return_ty: Ty::Unknown, // set in collect_fn_signature | 224 | return_ty: Ty::Unknown, // set in collect_fn_signature |
224 | trait_env: TraitEnvironment::lower(&ctx), | 225 | trait_env: TraitEnvironment::lower(db, &resolver), |
225 | coerce_unsized_map: Self::init_coerce_unsized_map(db, &resolver), | 226 | coerce_unsized_map: Self::init_coerce_unsized_map(db, &resolver), |
226 | db, | 227 | db, |
227 | owner, | 228 | owner, |
@@ -272,14 +273,26 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> { | |||
272 | self.result.diagnostics.push(diagnostic); | 273 | self.result.diagnostics.push(diagnostic); |
273 | } | 274 | } |
274 | 275 | ||
275 | fn make_ty(&mut self, type_ref: &TypeRef) -> Ty { | 276 | fn make_ty_with_mode( |
277 | &mut self, | ||
278 | type_ref: &TypeRef, | ||
279 | impl_trait_mode: ImplTraitLoweringMode, | ||
280 | ) -> Ty { | ||
276 | // FIXME use right resolver for block | 281 | // FIXME use right resolver for block |
277 | let ctx = crate::lower::TyLoweringContext { db: self.db, resolver: &self.resolver }; | 282 | let ctx = crate::lower::TyLoweringContext { |
283 | db: self.db, | ||
284 | resolver: &self.resolver, | ||
285 | impl_trait_mode, | ||
286 | }; | ||
278 | let ty = Ty::from_hir(&ctx, type_ref); | 287 | let ty = Ty::from_hir(&ctx, type_ref); |
279 | let ty = self.insert_type_vars(ty); | 288 | let ty = self.insert_type_vars(ty); |
280 | self.normalize_associated_types_in(ty) | 289 | self.normalize_associated_types_in(ty) |
281 | } | 290 | } |
282 | 291 | ||
292 | fn make_ty(&mut self, type_ref: &TypeRef) -> Ty { | ||
293 | self.make_ty_with_mode(type_ref, ImplTraitLoweringMode::Disallowed) | ||
294 | } | ||
295 | |||
283 | /// Replaces `impl Trait` in `ty` by type variables and obligations for | 296 | /// Replaces `impl Trait` in `ty` by type variables and obligations for |
284 | /// those variables. This is done for function arguments when calling a | 297 | /// those variables. This is done for function arguments when calling a |
285 | /// function, and for return types when inside the function body, i.e. in | 298 | /// function, and for return types when inside the function body, i.e. in |
@@ -444,7 +457,11 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> { | |||
444 | None => return (Ty::Unknown, None), | 457 | None => return (Ty::Unknown, None), |
445 | }; | 458 | }; |
446 | let resolver = &self.resolver; | 459 | let resolver = &self.resolver; |
447 | let ctx = crate::lower::TyLoweringContext { db: self.db, resolver: &self.resolver }; | 460 | let ctx = crate::lower::TyLoweringContext { |
461 | db: self.db, | ||
462 | resolver: &self.resolver, | ||
463 | impl_trait_mode: ImplTraitLoweringMode::Disallowed, | ||
464 | }; | ||
448 | // FIXME: this should resolve assoc items as well, see this example: | 465 | // FIXME: this should resolve assoc items as well, see this example: |
449 | // https://play.rust-lang.org/?gist=087992e9e22495446c01c0d4e2d69521 | 466 | // https://play.rust-lang.org/?gist=087992e9e22495446c01c0d4e2d69521 |
450 | match resolver.resolve_path_in_type_ns_fully(self.db, path.mod_path()) { | 467 | match resolver.resolve_path_in_type_ns_fully(self.db, path.mod_path()) { |
@@ -471,11 +488,11 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> { | |||
471 | fn collect_fn(&mut self, data: &FunctionData) { | 488 | fn collect_fn(&mut self, data: &FunctionData) { |
472 | let body = Arc::clone(&self.body); // avoid borrow checker problem | 489 | let body = Arc::clone(&self.body); // avoid borrow checker problem |
473 | for (type_ref, pat) in data.params.iter().zip(body.params.iter()) { | 490 | for (type_ref, pat) in data.params.iter().zip(body.params.iter()) { |
474 | let ty = self.make_ty(type_ref); | 491 | let ty = self.make_ty_with_mode(type_ref, ImplTraitLoweringMode::Opaque); |
475 | 492 | ||
476 | self.infer_pat(*pat, &ty, BindingMode::default()); | 493 | self.infer_pat(*pat, &ty, BindingMode::default()); |
477 | } | 494 | } |
478 | let return_ty = self.make_ty(&data.ret_type); | 495 | let return_ty = self.make_ty_with_mode(&data.ret_type, ImplTraitLoweringMode::Placeholder); |
479 | self.return_ty = self.insert_vars_for_impl_trait(return_ty); | 496 | self.return_ty = self.insert_vars_for_impl_trait(return_ty); |
480 | } | 497 | } |
481 | 498 | ||