| Index: pkg/front_end/lib/src/fasta/kernel/kernel_shadow_ast.dart
|
| diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_shadow_ast.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_shadow_ast.dart
|
| index 780c6202eb1bb0a9a68a1bceed6586aa2735feb2..de175ea05c99d481b08bbb68012a984ee1394ad2 100644
|
| --- a/pkg/front_end/lib/src/fasta/kernel/kernel_shadow_ast.dart
|
| +++ b/pkg/front_end/lib/src/fasta/kernel/kernel_shadow_ast.dart
|
| @@ -818,7 +818,7 @@ class KernelReturnStatement extends ReturnStatement implements KernelStatement {
|
| // inferred type of the closure. TODO(paulberry): is this what we want
|
| // for Fasta?
|
| if (expression != null) {
|
| - closureContext?.updateInferredReturnType(inferrer, inferredType);
|
| + closureContext?.handleReturn(inferrer, inferredType);
|
| }
|
| inferrer.listener.returnStatementExit(this);
|
| }
|
| @@ -1344,3 +1344,33 @@ class KernelVariableSet extends VariableSet implements KernelExpression {
|
| return inferredType;
|
| }
|
| }
|
| +
|
| +/// Concrete shadow object representing a yield statement in kernel form.
|
| +class KernelYieldStatement extends YieldStatement implements KernelStatement {
|
| + KernelYieldStatement(Expression expression, {bool isYieldStar: false})
|
| + : super(expression, isYieldStar: isYieldStar);
|
| +
|
| + @override
|
| + void _inferStatement(KernelTypeInferrer inferrer) {
|
| + inferrer.listener.yieldStatementEnter(this);
|
| + var closureContext = inferrer.closureContext;
|
| + var typeContext = closureContext != null && closureContext.isGenerator
|
| + ? closureContext.returnContext
|
| + : null;
|
| + if (isYieldStar && typeContext != null) {
|
| + if (closureContext == null) {
|
| + typeContext = null;
|
| + } else {
|
| + typeContext = inferrer.wrapType(
|
| + typeContext,
|
| + closureContext.isAsync
|
| + ? inferrer.coreTypes.streamClass
|
| + : inferrer.coreTypes.iterableClass);
|
| + }
|
| + }
|
| + var inferredType = inferrer.inferExpression(
|
| + expression, typeContext, closureContext != null);
|
| + closureContext?.handleYield(inferrer, isYieldStar, inferredType);
|
| + inferrer.listener.yieldStatementExit(this);
|
| + }
|
| +}
|
|
|