diff options
| author | oxalica <[email protected]> | 2020-09-10 13:01:23 +0100 |
|---|---|---|
| committer | oxalica <[email protected]> | 2020-09-10 13:01:23 +0100 |
| commit | 251ef93ac3bbb138a2eedf6090f2f56f1a15d898 (patch) | |
| tree | 1a03960dfb5edfe5bca78c57610b3e52ec2dc74d /crates/hir_ty/src/infer | |
| parent | 0275b08d1521606fa733f76fe5d5707717456fb4 (diff) | |
Implement async blocks
Diffstat (limited to 'crates/hir_ty/src/infer')
| -rw-r--r-- | crates/hir_ty/src/infer/expr.rs | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/crates/hir_ty/src/infer/expr.rs b/crates/hir_ty/src/infer/expr.rs index a2f849d02..0a141b9cb 100644 --- a/crates/hir_ty/src/infer/expr.rs +++ b/crates/hir_ty/src/infer/expr.rs | |||
| @@ -17,8 +17,8 @@ use crate::{ | |||
| 17 | autoderef, method_resolution, op, | 17 | autoderef, method_resolution, op, |
| 18 | traits::{FnTrait, InEnvironment}, | 18 | traits::{FnTrait, InEnvironment}, |
| 19 | utils::{generics, variant_data, Generics}, | 19 | utils::{generics, variant_data, Generics}, |
| 20 | ApplicationTy, Binders, CallableDefId, InferTy, IntTy, Mutability, Obligation, Rawness, Substs, | 20 | ApplicationTy, Binders, CallableDefId, InferTy, IntTy, Mutability, Obligation, OpaqueTyId, |
| 21 | TraitRef, Ty, TypeCtor, | 21 | Rawness, Substs, TraitRef, Ty, TypeCtor, |
| 22 | }; | 22 | }; |
| 23 | 23 | ||
| 24 | use super::{ | 24 | use super::{ |
| @@ -146,6 +146,13 @@ impl<'a> InferenceContext<'a> { | |||
| 146 | // FIXME should be std::result::Result<{inner}, _> | 146 | // FIXME should be std::result::Result<{inner}, _> |
| 147 | Ty::Unknown | 147 | Ty::Unknown |
| 148 | } | 148 | } |
| 149 | Expr::Async { body } => { | ||
| 150 | // Use the first type parameter as the output type of future. | ||
| 151 | // existenail type AsyncBlockImplTrait<InnerType>: Future<Output = InnerType> | ||
| 152 | let inner_ty = self.infer_expr(*body, &Expectation::none()); | ||
| 153 | let opaque_ty_id = OpaqueTyId::AsyncBlockTypeImplTrait(self.owner, *body); | ||
| 154 | Ty::apply_one(TypeCtor::OpaqueType(opaque_ty_id), inner_ty) | ||
| 155 | } | ||
| 149 | Expr::Loop { body, label } => { | 156 | Expr::Loop { body, label } => { |
| 150 | self.breakables.push(BreakableContext { | 157 | self.breakables.push(BreakableContext { |
| 151 | may_break: false, | 158 | may_break: false, |
