about summary refs log tree commit diff
diff options
context:
space:
mode:
authorMazdak Farrokhzad <twingoow@gmail.com>2019-08-10 16:42:14 +0200
committerMazdak Farrokhzad <twingoow@gmail.com>2019-08-10 20:24:43 +0200
commit5cba0ac0bf60644130992bb2b0e730911782e85a (patch)
tree4ab5b4bd00968642e786c183ce1885d0ebc10946
parent199d5859812e3b9d6f2171df8fe637fb9777868f (diff)
downloadrust-5cba0ac0bf60644130992bb2b0e730911782e85a.tar.gz
rust-5cba0ac0bf60644130992bb2b0e730911782e85a.zip
lowering: move make_async_expr -> expr.rs
-rw-r--r--src/librustc/hir/lowering.rs41
-rw-r--r--src/librustc/hir/lowering/expr.rs56
2 files changed, 56 insertions, 41 deletions
diff --git a/src/librustc/hir/lowering.rs b/src/librustc/hir/lowering.rs
index db70d18bd83..12d3ebb3e0f 100644
--- a/src/librustc/hir/lowering.rs
+++ b/src/librustc/hir/lowering.rs
@@ -1151,47 +1151,6 @@ impl<'a> LoweringContext<'a> {
         result
     }
 
-    fn make_async_expr(
-        &mut self,
-        capture_clause: CaptureBy,
-        closure_node_id: NodeId,
-        ret_ty: Option<AstP<Ty>>,
-        span: Span,
-        body: impl FnOnce(&mut LoweringContext<'_>) -> hir::Expr,
-    ) -> hir::ExprKind {
-        let capture_clause = self.lower_capture_clause(capture_clause);
-        let output = match ret_ty {
-            Some(ty) => FunctionRetTy::Ty(ty),
-            None => FunctionRetTy::Default(span),
-        };
-        let ast_decl = FnDecl {
-            inputs: vec![],
-            output,
-            c_variadic: false
-        };
-        let decl = self.lower_fn_decl(&ast_decl, None, /* impl trait allowed */ false, None);
-        let body_id = self.lower_fn_body(&ast_decl, |this| {
-            this.generator_kind = Some(hir::GeneratorKind::Async);
-            body(this)
-        });
-        let generator = hir::Expr {
-            hir_id: self.lower_node_id(closure_node_id),
-            node: hir::ExprKind::Closure(capture_clause, decl, body_id, span,
-                Some(hir::GeneratorMovability::Static)),
-            span,
-            attrs: ThinVec::new(),
-        };
-
-        let unstable_span = self.mark_span_with_reason(
-            DesugaringKind::Async,
-            span,
-            self.allow_gen_future.clone(),
-        );
-        let gen_future = self.expr_std_path(
-            unstable_span, &[sym::future, sym::from_generator], None, ThinVec::new());
-        hir::ExprKind::Call(P(gen_future), hir_vec![generator])
-    }
-
     fn lower_body(
         &mut self,
         f: impl FnOnce(&mut LoweringContext<'_>) -> (HirVec<hir::Arg>, hir::Expr),
diff --git a/src/librustc/hir/lowering/expr.rs b/src/librustc/hir/lowering/expr.rs
index 25a77f95a57..2ff67ac877c 100644
--- a/src/librustc/hir/lowering/expr.rs
+++ b/src/librustc/hir/lowering/expr.rs
@@ -416,6 +416,62 @@ impl LoweringContext<'_> {
         P(self.expr_call(e.span, from_err, hir_vec![e]))
     }
 
+    pub(super) fn make_async_expr(
+        &mut self,
+        capture_clause: CaptureBy,
+        closure_node_id: NodeId,
+        ret_ty: Option<AstP<Ty>>,
+        span: Span,
+        body: impl FnOnce(&mut LoweringContext<'_>) -> hir::Expr,
+    ) -> hir::ExprKind {
+        let capture_clause = self.lower_capture_clause(capture_clause);
+        let output = match ret_ty {
+            Some(ty) => FunctionRetTy::Ty(ty),
+            None => FunctionRetTy::Default(span),
+        };
+        let ast_decl = FnDecl {
+            inputs: vec![],
+            output,
+            c_variadic: false
+        };
+        let decl = self.lower_fn_decl(&ast_decl, None, /* impl trait allowed */ false, None);
+        let body_id = self.lower_fn_body(&ast_decl, |this| {
+            this.generator_kind = Some(hir::GeneratorKind::Async);
+            body(this)
+        });
+
+        // `static || -> <ret_ty> { body }`:
+        let generator_node = hir::ExprKind::Closure(
+            capture_clause,
+            decl,
+            body_id,
+            span,
+            Some(hir::GeneratorMovability::Static)
+        );
+        let generator = hir::Expr {
+            hir_id: self.lower_node_id(closure_node_id),
+            node: generator_node,
+            span,
+            attrs: ThinVec::new(),
+        };
+
+        // `future::from_generator`:
+        let unstable_span = self.mark_span_with_reason(
+            DesugaringKind::Async,
+            span,
+            self.allow_gen_future.clone(),
+        );
+        let gen_future = self.expr_std_path(
+            unstable_span,
+            &[sym::future, sym::from_generator],
+            None,
+            ThinVec::new()
+        );
+
+        // `future::from_generator(generator)`:
+        hir::ExprKind::Call(P(gen_future), hir_vec![generator])
+    }
+
     /// Desugar `<expr>.await` into:
     /// ```rust
     /// {