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 |