Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1252)

Unified Diff: pkg/front_end/lib/src/fasta/kernel/kernel_shadow_ast.dart

Issue 2899833002: Add some type inference for "yield" statements. (Closed)
Patch Set: Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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);
+ }
+}

Powered by Google App Engine
This is Rietveld 408576698