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

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

Issue 2894343002: Add statement hooks to TypeInferenceListener. (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
« no previous file with comments | « no previous file | pkg/front_end/lib/src/fasta/type_inference/type_inference_listener.dart » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
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
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
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
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
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
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 }
OLDNEW
« no previous file with comments | « no previous file | pkg/front_end/lib/src/fasta/type_inference/type_inference_listener.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698