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

Side by Side 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 unified diff | Download patch
OLDNEW
1 // Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 /// This file declares a "shadow hierarchy" of concrete classes which extend 5 /// This file declares a "shadow hierarchy" of concrete classes which extend
6 /// the kernel class hierarchy, adding methods and fields needed by the 6 /// the kernel class hierarchy, adding methods and fields needed by the
7 /// BodyBuilder. 7 /// BodyBuilder.
8 /// 8 ///
9 /// Instances of these classes may be created using the factory methods in 9 /// Instances of these classes may be created using the factory methods in
10 /// `ast_factory.dart`. 10 /// `ast_factory.dart`.
(...skipping 800 matching lines...) Expand 10 before | Expand all | Expand 10 after
811 ? closureContext.returnContext 811 ? closureContext.returnContext
812 : null; 812 : null;
813 var inferredType = expression != null 813 var inferredType = expression != null
814 ? inferrer.inferExpression( 814 ? inferrer.inferExpression(
815 expression, typeContext, closureContext != null) 815 expression, typeContext, closureContext != null)
816 : const VoidType(); 816 : const VoidType();
817 // Analyzer treats bare `return` statements as having no effect on the 817 // Analyzer treats bare `return` statements as having no effect on the
818 // inferred type of the closure. TODO(paulberry): is this what we want 818 // inferred type of the closure. TODO(paulberry): is this what we want
819 // for Fasta? 819 // for Fasta?
820 if (expression != null) { 820 if (expression != null) {
821 closureContext?.updateInferredReturnType(inferrer, inferredType); 821 closureContext?.handleReturn(inferrer, inferredType);
822 } 822 }
823 inferrer.listener.returnStatementExit(this); 823 inferrer.listener.returnStatementExit(this);
824 } 824 }
825 } 825 }
826 826
827 /// Common base class for shadow objects representing statements in kernel 827 /// Common base class for shadow objects representing statements in kernel
828 /// form. 828 /// form.
829 abstract class KernelStatement extends Statement { 829 abstract class KernelStatement extends Statement {
830 /// Calls back to [inferrer] to perform type inference for whatever concrete 830 /// Calls back to [inferrer] to perform type inference for whatever concrete
831 /// type of [KernelStatement] this is. 831 /// type of [KernelStatement] this is.
(...skipping 505 matching lines...) Expand 10 before | Expand all | Expand 10 after
1337 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { 1337 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) {
1338 var variable = this.variable as KernelVariableDeclaration; 1338 var variable = this.variable as KernelVariableDeclaration;
1339 typeNeeded = 1339 typeNeeded =
1340 inferrer.listener.variableSetEnter(this, typeContext) || typeNeeded; 1340 inferrer.listener.variableSetEnter(this, typeContext) || typeNeeded;
1341 var inferredType = 1341 var inferredType =
1342 inferrer.inferExpression(value, variable._declaredType, typeNeeded); 1342 inferrer.inferExpression(value, variable._declaredType, typeNeeded);
1343 inferrer.listener.variableSetExit(this, inferredType); 1343 inferrer.listener.variableSetExit(this, inferredType);
1344 return inferredType; 1344 return inferredType;
1345 } 1345 }
1346 } 1346 }
1347
1348 /// Concrete shadow object representing a yield statement in kernel form.
1349 class KernelYieldStatement extends YieldStatement implements KernelStatement {
1350 KernelYieldStatement(Expression expression, {bool isYieldStar: false})
1351 : super(expression, isYieldStar: isYieldStar);
1352
1353 @override
1354 void _inferStatement(KernelTypeInferrer inferrer) {
1355 inferrer.listener.yieldStatementEnter(this);
1356 var closureContext = inferrer.closureContext;
1357 var typeContext = closureContext != null && closureContext.isGenerator
1358 ? closureContext.returnContext
1359 : null;
1360 if (isYieldStar && typeContext != null) {
1361 if (closureContext == null) {
1362 typeContext = null;
1363 } else {
1364 typeContext = inferrer.wrapType(
1365 typeContext,
1366 closureContext.isAsync
1367 ? inferrer.coreTypes.streamClass
1368 : inferrer.coreTypes.iterableClass);
1369 }
1370 }
1371 var inferredType = inferrer.inferExpression(
1372 expression, typeContext, closureContext != null);
1373 closureContext?.handleYield(inferrer, isYieldStar, inferredType);
1374 inferrer.listener.yieldStatementExit(this);
1375 }
1376 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698