mirror of
https://github.com/rust-lang/rust.git
synced 2026-05-17 05:25:37 +03:00
lowering: extract lower_expr_yield
This commit is contained in:
@@ -505,28 +505,7 @@ pub(super) fn lower_expr(&mut self, e: &Expr) -> hir::Expr {
|
||||
return ex;
|
||||
}
|
||||
|
||||
ExprKind::Yield(ref opt_expr) => {
|
||||
match self.generator_kind {
|
||||
Some(hir::GeneratorKind::Gen) => {},
|
||||
Some(hir::GeneratorKind::Async) => {
|
||||
span_err!(
|
||||
self.sess,
|
||||
e.span,
|
||||
E0727,
|
||||
"`async` generators are not yet supported",
|
||||
);
|
||||
self.sess.abort_if_errors();
|
||||
},
|
||||
None => {
|
||||
self.generator_kind = Some(hir::GeneratorKind::Gen);
|
||||
}
|
||||
}
|
||||
let expr = opt_expr
|
||||
.as_ref()
|
||||
.map(|x| self.lower_expr(x))
|
||||
.unwrap_or_else(|| self.expr_unit(e.span));
|
||||
hir::ExprKind::Yield(P(expr), hir::YieldSource::Yield)
|
||||
}
|
||||
ExprKind::Yield(ref opt_expr) => self.lower_expr_yield(e.span, opt_expr.as_deref()),
|
||||
|
||||
ExprKind::Err => hir::ExprKind::Err,
|
||||
|
||||
@@ -547,6 +526,29 @@ pub(super) fn lower_expr(&mut self, e: &Expr) -> hir::Expr {
|
||||
}
|
||||
}
|
||||
|
||||
fn lower_expr_yield(&mut self, span: Span, opt_expr: Option<&Expr>) -> hir::ExprKind {
|
||||
match self.generator_kind {
|
||||
Some(hir::GeneratorKind::Gen) => {},
|
||||
Some(hir::GeneratorKind::Async) => {
|
||||
span_err!(
|
||||
self.sess,
|
||||
span,
|
||||
E0727,
|
||||
"`async` generators are not yet supported",
|
||||
);
|
||||
self.sess.abort_if_errors();
|
||||
},
|
||||
None => self.generator_kind = Some(hir::GeneratorKind::Gen),
|
||||
}
|
||||
|
||||
let expr = opt_expr
|
||||
.as_ref()
|
||||
.map(|x| self.lower_expr(x))
|
||||
.unwrap_or_else(|| self.expr_unit(span));
|
||||
|
||||
hir::ExprKind::Yield(P(expr), hir::YieldSource::Yield)
|
||||
}
|
||||
|
||||
/// Desugar `ExprForLoop` from: `[opt_ident]: for <pat> in <head> <body>` into:
|
||||
/// ```rust
|
||||
/// {
|
||||
|
||||
Reference in New Issue
Block a user