| 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 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 83 return typeNeeded ? const DynamicType() : null; | 83 return typeNeeded ? const DynamicType() : null; |
| 84 } | 84 } |
| 85 } | 85 } |
| 86 | 86 |
| 87 /// Concrete shadow object representing a statement block in kernel form. | 87 /// Concrete shadow object representing a statement block in kernel form. |
| 88 class KernelBlock extends Block implements KernelStatement { | 88 class KernelBlock extends Block implements KernelStatement { |
| 89 KernelBlock(List<Statement> statements) : super(statements); | 89 KernelBlock(List<Statement> statements) : super(statements); |
| 90 | 90 |
| 91 @override | 91 @override |
| 92 void _inferStatement(KernelTypeInferrer inferrer) { | 92 void _inferStatement(KernelTypeInferrer inferrer) { |
| 93 inferrer.listener.blockEnter(this); |
| 93 for (var statement in statements) { | 94 for (var statement in statements) { |
| 94 inferrer.inferStatement(statement); | 95 inferrer.inferStatement(statement); |
| 95 } | 96 } |
| 97 inferrer.listener.blockExit(this); |
| 96 } | 98 } |
| 97 } | 99 } |
| 98 | 100 |
| 99 /// Concrete shadow object representing a boolean literal in kernel form. | 101 /// Concrete shadow object representing a boolean literal in kernel form. |
| 100 class KernelBoolLiteral extends BoolLiteral implements KernelExpression { | 102 class KernelBoolLiteral extends BoolLiteral implements KernelExpression { |
| 101 KernelBoolLiteral(bool value) : super(value); | 103 KernelBoolLiteral(bool value) : super(value); |
| 102 | 104 |
| 103 @override | 105 @override |
| 104 DartType _inferExpression( | 106 DartType _inferExpression( |
| 105 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { | 107 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { |
| (...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 252 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded); | 254 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded); |
| 253 } | 255 } |
| 254 | 256 |
| 255 /// Concrete shadow object representing an expression statement in kernel form. | 257 /// Concrete shadow object representing an expression statement in kernel form. |
| 256 class KernelExpressionStatement extends ExpressionStatement | 258 class KernelExpressionStatement extends ExpressionStatement |
| 257 implements KernelStatement { | 259 implements KernelStatement { |
| 258 KernelExpressionStatement(Expression expression) : super(expression); | 260 KernelExpressionStatement(Expression expression) : super(expression); |
| 259 | 261 |
| 260 @override | 262 @override |
| 261 void _inferStatement(KernelTypeInferrer inferrer) { | 263 void _inferStatement(KernelTypeInferrer inferrer) { |
| 264 inferrer.listener.expressionStatementEnter(this); |
| 262 inferrer.inferExpression(expression, null, false); | 265 inferrer.inferExpression(expression, null, false); |
| 266 inferrer.listener.expressionStatementExit(this); |
| 263 } | 267 } |
| 264 } | 268 } |
| 265 | 269 |
| 266 /// Concrete shadow object representing a field in kernel form. | 270 /// Concrete shadow object representing a field in kernel form. |
| 267 class KernelField extends Field { | 271 class KernelField extends Field { |
| 268 bool _implicitlyTyped = true; | 272 bool _implicitlyTyped = true; |
| 269 | 273 |
| 270 FieldNode _fieldNode; | 274 FieldNode _fieldNode; |
| 271 | 275 |
| 272 bool _isInferred = false; | 276 bool _isInferred = false; |
| (...skipping 24 matching lines...) Expand all Loading... |
| 297 | 301 |
| 298 /// Concrete shadow object representing a local function declaration in kernel | 302 /// Concrete shadow object representing a local function declaration in kernel |
| 299 /// form. | 303 /// form. |
| 300 class KernelFunctionDeclaration extends FunctionDeclaration | 304 class KernelFunctionDeclaration extends FunctionDeclaration |
| 301 implements KernelStatement { | 305 implements KernelStatement { |
| 302 KernelFunctionDeclaration(VariableDeclaration variable, FunctionNode function) | 306 KernelFunctionDeclaration(VariableDeclaration variable, FunctionNode function) |
| 303 : super(variable, function); | 307 : super(variable, function); |
| 304 | 308 |
| 305 @override | 309 @override |
| 306 void _inferStatement(KernelTypeInferrer inferrer) { | 310 void _inferStatement(KernelTypeInferrer inferrer) { |
| 311 inferrer.listener.functionDeclarationEnter(this); |
| 307 var oldClosureContext = inferrer.closureContext; | 312 var oldClosureContext = inferrer.closureContext; |
| 308 inferrer.closureContext = null; | 313 inferrer.closureContext = null; |
| 309 inferrer.inferStatement(function.body); | 314 inferrer.inferStatement(function.body); |
| 310 inferrer.closureContext = oldClosureContext; | 315 inferrer.closureContext = oldClosureContext; |
| 316 inferrer.listener.functionDeclarationExit(this); |
| 311 } | 317 } |
| 312 } | 318 } |
| 313 | 319 |
| 314 /// Concrete shadow object representing a function expression in kernel form. | 320 /// Concrete shadow object representing a function expression in kernel form. |
| 315 class KernelFunctionExpression extends FunctionExpression | 321 class KernelFunctionExpression extends FunctionExpression |
| 316 implements KernelExpression { | 322 implements KernelExpression { |
| 317 KernelFunctionExpression(FunctionNode function) : super(function); | 323 KernelFunctionExpression(FunctionNode function) : super(function); |
| 318 | 324 |
| 319 @override | 325 @override |
| 320 DartType _inferExpression( | 326 DartType _inferExpression( |
| (...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 482 } | 488 } |
| 483 } | 489 } |
| 484 | 490 |
| 485 /// Concrete shadow object representing an if statement in kernel form. | 491 /// Concrete shadow object representing an if statement in kernel form. |
| 486 class KernelIfStatement extends IfStatement implements KernelStatement { | 492 class KernelIfStatement extends IfStatement implements KernelStatement { |
| 487 KernelIfStatement(Expression condition, Statement then, Statement otherwise) | 493 KernelIfStatement(Expression condition, Statement then, Statement otherwise) |
| 488 : super(condition, then, otherwise); | 494 : super(condition, then, otherwise); |
| 489 | 495 |
| 490 @override | 496 @override |
| 491 void _inferStatement(KernelTypeInferrer inferrer) { | 497 void _inferStatement(KernelTypeInferrer inferrer) { |
| 498 inferrer.listener.ifStatementEnter(this); |
| 492 inferrer.inferExpression( | 499 inferrer.inferExpression( |
| 493 condition, inferrer.coreTypes.boolClass.rawType, false); | 500 condition, inferrer.coreTypes.boolClass.rawType, false); |
| 494 inferrer.inferStatement(then); | 501 inferrer.inferStatement(then); |
| 495 if (otherwise != null) inferrer.inferStatement(otherwise); | 502 if (otherwise != null) inferrer.inferStatement(otherwise); |
| 503 inferrer.listener.ifStatementExit(this); |
| 496 } | 504 } |
| 497 } | 505 } |
| 498 | 506 |
| 499 /// Concrete shadow object representing an integer literal in kernel form. | 507 /// Concrete shadow object representing an integer literal in kernel form. |
| 500 class KernelIntLiteral extends IntLiteral implements KernelExpression { | 508 class KernelIntLiteral extends IntLiteral implements KernelExpression { |
| 501 KernelIntLiteral(int value) : super(value); | 509 KernelIntLiteral(int value) : super(value); |
| 502 | 510 |
| 503 @override | 511 @override |
| 504 DartType _inferExpression( | 512 DartType _inferExpression( |
| 505 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { | 513 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { |
| (...skipping 249 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 755 return typeNeeded ? const DynamicType() : null; | 763 return typeNeeded ? const DynamicType() : null; |
| 756 } | 764 } |
| 757 } | 765 } |
| 758 | 766 |
| 759 /// Concrete shadow object representing a return statement in kernel form. | 767 /// Concrete shadow object representing a return statement in kernel form. |
| 760 class KernelReturnStatement extends ReturnStatement implements KernelStatement { | 768 class KernelReturnStatement extends ReturnStatement implements KernelStatement { |
| 761 KernelReturnStatement([Expression expression]) : super(expression); | 769 KernelReturnStatement([Expression expression]) : super(expression); |
| 762 | 770 |
| 763 @override | 771 @override |
| 764 void _inferStatement(KernelTypeInferrer inferrer) { | 772 void _inferStatement(KernelTypeInferrer inferrer) { |
| 773 inferrer.listener.returnStatementEnter(this); |
| 765 var closureContext = inferrer.closureContext; | 774 var closureContext = inferrer.closureContext; |
| 766 var typeContext = closureContext != null && !closureContext.isGenerator | 775 var typeContext = closureContext != null && !closureContext.isGenerator |
| 767 ? closureContext.returnContext | 776 ? closureContext.returnContext |
| 768 : null; | 777 : null; |
| 769 var inferredType = expression != null | 778 var inferredType = expression != null |
| 770 ? inferrer.inferExpression( | 779 ? inferrer.inferExpression( |
| 771 expression, typeContext, closureContext != null) | 780 expression, typeContext, closureContext != null) |
| 772 : const VoidType(); | 781 : const VoidType(); |
| 773 if (expression == null) { | 782 // Analyzer treats bare `return` statements as having no effect on the |
| 774 // Analyzer treats bare `return` statements as having no effect on the | 783 // inferred type of the closure. TODO(paulberry): is this what we want |
| 775 // inferred type of the closure. TODO(paulberry): is this what we want | 784 // for Fasta? |
| 776 // for Fasta? | 785 if (expression != null) { |
| 777 return; | 786 closureContext?.updateInferredReturnType(inferrer, inferredType); |
| 778 } | 787 } |
| 779 closureContext?.updateInferredReturnType(inferrer, inferredType); | 788 inferrer.listener.returnStatementExit(this); |
| 780 } | 789 } |
| 781 } | 790 } |
| 782 | 791 |
| 783 /// Common base class for shadow objects representing statements in kernel | 792 /// Common base class for shadow objects representing statements in kernel |
| 784 /// form. | 793 /// form. |
| 785 abstract class KernelStatement extends Statement { | 794 abstract class KernelStatement extends Statement { |
| 786 /// Calls back to [inferrer] to perform type inference for whatever concrete | 795 /// Calls back to [inferrer] to perform type inference for whatever concrete |
| 787 /// type of [KernelStatement] this is. | 796 /// type of [KernelStatement] this is. |
| 788 void _inferStatement(KernelTypeInferrer inferrer); | 797 void _inferStatement(KernelTypeInferrer inferrer); |
| 789 } | 798 } |
| (...skipping 432 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1222 super(name, | 1231 super(name, |
| 1223 initializer: initializer, | 1232 initializer: initializer, |
| 1224 type: type ?? const DynamicType(), | 1233 type: type ?? const DynamicType(), |
| 1225 isFinal: isFinal, | 1234 isFinal: isFinal, |
| 1226 isConst: isConst); | 1235 isConst: isConst); |
| 1227 | 1236 |
| 1228 DartType get _declaredType => _implicitlyTyped ? null : type; | 1237 DartType get _declaredType => _implicitlyTyped ? null : type; |
| 1229 | 1238 |
| 1230 @override | 1239 @override |
| 1231 void _inferStatement(KernelTypeInferrer inferrer) { | 1240 void _inferStatement(KernelTypeInferrer inferrer) { |
| 1241 inferrer.listener.variableDeclarationEnter(this); |
| 1232 var declaredType = _implicitlyTyped ? null : type; | 1242 var declaredType = _implicitlyTyped ? null : type; |
| 1233 if (initializer == null) return; | 1243 if (initializer != null) { |
| 1234 var inferredType = inferrer.inferDeclarationType( | 1244 var inferredType = inferrer.inferDeclarationType(inferrer.inferExpression( |
| 1235 inferrer.inferExpression(initializer, declaredType, _implicitlyTyped)); | 1245 initializer, declaredType, _implicitlyTyped)); |
| 1236 if (inferrer.strongMode && _implicitlyTyped) { | 1246 if (inferrer.strongMode && _implicitlyTyped) { |
| 1237 inferrer.instrumentation?.record(Uri.parse(inferrer.uri), fileOffset, | 1247 inferrer.instrumentation?.record(Uri.parse(inferrer.uri), fileOffset, |
| 1238 'type', new InstrumentationValueForType(inferredType)); | 1248 'type', new InstrumentationValueForType(inferredType)); |
| 1239 type = inferredType; | 1249 type = inferredType; |
| 1250 } |
| 1240 } | 1251 } |
| 1252 inferrer.listener.variableDeclarationExit(this); |
| 1241 } | 1253 } |
| 1242 | 1254 |
| 1243 /// Determine whether the given [KernelVariableDeclaration] had an implicit | 1255 /// Determine whether the given [KernelVariableDeclaration] had an implicit |
| 1244 /// type. | 1256 /// type. |
| 1245 /// | 1257 /// |
| 1246 /// This is static to avoid introducing a method that would be visible to | 1258 /// This is static to avoid introducing a method that would be visible to |
| 1247 /// the kernel. | 1259 /// the kernel. |
| 1248 static bool isImplicitlyTyped(KernelVariableDeclaration variable) => | 1260 static bool isImplicitlyTyped(KernelVariableDeclaration variable) => |
| 1249 variable._implicitlyTyped; | 1261 variable._implicitlyTyped; |
| 1250 } | 1262 } |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1290 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { | 1302 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { |
| 1291 var variable = this.variable as KernelVariableDeclaration; | 1303 var variable = this.variable as KernelVariableDeclaration; |
| 1292 typeNeeded = | 1304 typeNeeded = |
| 1293 inferrer.listener.variableSetEnter(this, typeContext) || typeNeeded; | 1305 inferrer.listener.variableSetEnter(this, typeContext) || typeNeeded; |
| 1294 var inferredType = | 1306 var inferredType = |
| 1295 inferrer.inferExpression(value, variable._declaredType, typeNeeded); | 1307 inferrer.inferExpression(value, variable._declaredType, typeNeeded); |
| 1296 inferrer.listener.variableSetExit(this, inferredType); | 1308 inferrer.listener.variableSetExit(this, inferredType); |
| 1297 return inferredType; | 1309 return inferredType; |
| 1298 } | 1310 } |
| 1299 } | 1311 } |
| OLD | NEW |