aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_hir_ty/src/infer.rs
diff options
context:
space:
mode:
authorFlorian Diebold <[email protected]>2020-01-24 14:22:00 +0000
committerFlorian Diebold <[email protected]>2020-02-07 17:28:10 +0000
commit7ea4bce1b292d455c313f914b3aa3051293c502b (patch)
tree9dffb37e0cc74135d0c92e2ee9a714ed2ff4d5be /crates/ra_hir_ty/src/infer.rs
parent22a65b11b3a69b3dae561b34c6b28cb2107169d1 (diff)
Add impl trait lowering mode
Diffstat (limited to 'crates/ra_hir_ty/src/infer.rs')
-rw-r--r--crates/ra_hir_ty/src/infer.rs33
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};
45use crate::{db::HirDatabase, infer::diagnostics::InferenceDiagnostic}; 45use crate::{
46 db::HirDatabase, infer::diagnostics::InferenceDiagnostic, lower::ImplTraitLoweringMode,
47};
46 48
47pub(crate) use unify::unify; 49pub(crate) use unify::unify;
48 50
@@ -215,13 +217,12 @@ struct InferenceContext<'a, D: HirDatabase> {
215 217
216impl<'a, D: HirDatabase> InferenceContext<'a, D> { 218impl<'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