| OLD | NEW |
| 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 Loading... |
| 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 Loading... |
| 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 } |
| OLD | NEW |