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

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

Issue 2913743003: Change the approach of front_end top level inference to match the spec. (Closed)
Patch Set: Created 3 years, 6 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`.
11 /// 11 ///
12 /// Note that these classes represent the Dart language prior to desugaring. 12 /// Note that these classes represent the Dart language prior to desugaring.
13 /// When a single Dart construct desugars to a tree containing multiple kernel 13 /// When a single Dart construct desugars to a tree containing multiple kernel
14 /// AST nodes, the shadow class extends the kernel object at the top of the 14 /// AST nodes, the shadow class extends the kernel object at the top of the
15 /// desugared tree. 15 /// desugared tree.
16 /// 16 ///
17 /// This means that in some cases multiple shadow classes may extend the same 17 /// This means that in some cases multiple shadow classes may extend the same
18 /// kernel class, because multiple constructs in Dart may desugar to a tree 18 /// kernel class, because multiple constructs in Dart may desugar to a tree
19 /// with the same kind of root node. 19 /// with the same kind of root node.
20 import 'package:front_end/src/base/instrumentation.dart'; 20 import 'package:front_end/src/base/instrumentation.dart';
21 import 'package:front_end/src/fasta/type_inference/dependency_collector.dart';
21 import 'package:front_end/src/fasta/type_inference/type_inference_engine.dart'; 22 import 'package:front_end/src/fasta/type_inference/type_inference_engine.dart';
22 import 'package:front_end/src/fasta/type_inference/type_inference_listener.dart' ; 23 import 'package:front_end/src/fasta/type_inference/type_inference_listener.dart' ;
23 import 'package:front_end/src/fasta/type_inference/type_inferrer.dart'; 24 import 'package:front_end/src/fasta/type_inference/type_inferrer.dart';
24 import 'package:front_end/src/fasta/type_inference/type_promotion.dart'; 25 import 'package:front_end/src/fasta/type_inference/type_promotion.dart';
25 import 'package:front_end/src/fasta/type_inference/type_schema.dart'; 26 import 'package:front_end/src/fasta/type_inference/type_schema.dart';
26 import 'package:front_end/src/fasta/type_inference/type_schema_elimination.dart' ; 27 import 'package:front_end/src/fasta/type_inference/type_schema_elimination.dart' ;
27 import 'package:kernel/ast.dart'; 28 import 'package:kernel/ast.dart';
28 import 'package:kernel/frontend/accessors.dart'; 29 import 'package:kernel/frontend/accessors.dart';
29 import 'package:kernel/type_algebra.dart'; 30 import 'package:kernel/type_algebra.dart';
30 31
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
84 arguments.types.addAll(types); 85 arguments.types.addAll(types);
85 arguments._hasExplicitTypeArguments = true; 86 arguments._hasExplicitTypeArguments = true;
86 } 87 }
87 } 88 }
88 89
89 /// Shadow object for [AsExpression]. 90 /// Shadow object for [AsExpression].
90 class KernelAsExpression extends AsExpression implements KernelExpression { 91 class KernelAsExpression extends AsExpression implements KernelExpression {
91 KernelAsExpression(Expression operand, DartType type) : super(operand, type); 92 KernelAsExpression(Expression operand, DartType type) : super(operand, type);
92 93
93 @override 94 @override
95 void _collectDependencies(KernelDependencyCollector collector) {
96 // No inference dependencies.
97 }
98
99 @override
94 DartType _inferExpression( 100 DartType _inferExpression(
95 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { 101 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) {
96 typeNeeded = 102 typeNeeded =
97 inferrer.listener.asExpressionEnter(this, typeContext) || typeNeeded; 103 inferrer.listener.asExpressionEnter(this, typeContext) || typeNeeded;
98 inferrer.inferExpression(operand, null, false); 104 inferrer.inferExpression(operand, null, false);
99 var inferredType = typeNeeded ? type : null; 105 var inferredType = typeNeeded ? type : null;
100 inferrer.listener.asExpressionExit(this, inferredType); 106 inferrer.listener.asExpressionExit(this, inferredType);
101 return inferredType; 107 return inferredType;
102 } 108 }
103 } 109 }
104 110
105 /// Shadow object for [AwaitExpression]. 111 /// Shadow object for [AwaitExpression].
106 class KernelAwaitExpression extends AwaitExpression 112 class KernelAwaitExpression extends AwaitExpression
107 implements KernelExpression { 113 implements KernelExpression {
108 KernelAwaitExpression(Expression operand) : super(operand); 114 KernelAwaitExpression(Expression operand) : super(operand);
109 115
110 @override 116 @override
117 void _collectDependencies(KernelDependencyCollector collector) {
118 // Inference dependencies are the dependencies of the awaited expression.
119 collector.collectDependencies(operand);
120 }
121
122 @override
111 DartType _inferExpression( 123 DartType _inferExpression(
112 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { 124 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) {
113 typeNeeded = 125 typeNeeded =
114 inferrer.listener.awaitExpressionEnter(this, typeContext) || typeNeeded; 126 inferrer.listener.awaitExpressionEnter(this, typeContext) || typeNeeded;
115 if (!inferrer.typeSchemaEnvironment.isEmptyContext(typeContext)) { 127 if (!inferrer.typeSchemaEnvironment.isEmptyContext(typeContext)) {
116 typeContext = inferrer.wrapFutureOrType(typeContext); 128 typeContext = inferrer.wrapFutureOrType(typeContext);
117 } 129 }
118 var inferredType = 130 var inferredType =
119 inferrer.inferExpression(operand, typeContext, typeNeeded); 131 inferrer.inferExpression(operand, typeContext, typeNeeded);
120 inferredType = inferrer.typeSchemaEnvironment.flattenFutures(inferredType); 132 inferredType = inferrer.typeSchemaEnvironment.flattenFutures(inferredType);
(...skipping 14 matching lines...) Expand all
135 } 147 }
136 inferrer.listener.blockExit(this); 148 inferrer.listener.blockExit(this);
137 } 149 }
138 } 150 }
139 151
140 /// Concrete shadow object representing a boolean literal in kernel form. 152 /// Concrete shadow object representing a boolean literal in kernel form.
141 class KernelBoolLiteral extends BoolLiteral implements KernelExpression { 153 class KernelBoolLiteral extends BoolLiteral implements KernelExpression {
142 KernelBoolLiteral(bool value) : super(value); 154 KernelBoolLiteral(bool value) : super(value);
143 155
144 @override 156 @override
157 void _collectDependencies(KernelDependencyCollector collector) {
158 // No inference dependencies.
159 }
160
161 @override
145 DartType _inferExpression( 162 DartType _inferExpression(
146 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { 163 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) {
147 typeNeeded = 164 typeNeeded =
148 inferrer.listener.boolLiteralEnter(this, typeContext) || typeNeeded; 165 inferrer.listener.boolLiteralEnter(this, typeContext) || typeNeeded;
149 var inferredType = typeNeeded ? inferrer.coreTypes.boolClass.rawType : null; 166 var inferredType = typeNeeded ? inferrer.coreTypes.boolClass.rawType : null;
150 inferrer.listener.boolLiteralExit(this, inferredType); 167 inferrer.listener.boolLiteralExit(this, inferredType);
151 return inferredType; 168 return inferredType;
152 } 169 }
153 } 170 }
154 171
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
199 } 216 }
200 217
201 /// Finalizes the last cascade section with the given [expression]. 218 /// Finalizes the last cascade section with the given [expression].
202 void finalize(Expression expression) { 219 void finalize(Expression expression) {
203 assert(nextCascade.variable.initializer is InvalidExpression); 220 assert(nextCascade.variable.initializer is InvalidExpression);
204 nextCascade.variable.initializer = expression; 221 nextCascade.variable.initializer = expression;
205 expression.parent = nextCascade.variable; 222 expression.parent = nextCascade.variable;
206 } 223 }
207 224
208 @override 225 @override
226 void _collectDependencies(KernelDependencyCollector collector) {
227 // The inference dependencies are the inference dependencies of the cascade
228 // target.
229 collector.collectDependencies(variable.initializer);
230 }
231
232 @override
209 DartType _inferExpression( 233 DartType _inferExpression(
210 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { 234 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) {
211 typeNeeded = inferrer.listener.cascadeExpressionEnter(this, typeContext) || 235 typeNeeded = inferrer.listener.cascadeExpressionEnter(this, typeContext) ||
212 typeNeeded; 236 typeNeeded;
213 var lhsType = inferrer.inferExpression( 237 var lhsType = inferrer.inferExpression(
214 variable.initializer, typeContext, typeNeeded || inferrer.strongMode); 238 variable.initializer, typeContext, typeNeeded || inferrer.strongMode);
215 if (inferrer.strongMode) { 239 if (inferrer.strongMode) {
216 variable.type = lhsType; 240 variable.type = lhsType;
217 } 241 }
218 Let section = body; 242 Let section = body;
219 while (true) { 243 while (true) {
220 inferrer.inferExpression(section.variable.initializer, null, false); 244 inferrer.inferExpression(section.variable.initializer, null, false);
221 if (section.body is! Let) break; 245 if (section.body is! Let) break;
222 section = section.body; 246 section = section.body;
223 } 247 }
224 inferrer.listener.cascadeExpressionExit(this, lhsType); 248 inferrer.listener.cascadeExpressionExit(this, lhsType);
225 return lhsType; 249 return lhsType;
226 } 250 }
227 } 251 }
228 252
229 /// Concrete shadow object representing a conditional expression in kernel form. 253 /// Concrete shadow object representing a conditional expression in kernel form.
230 /// Shadow object for [ConditionalExpression]. 254 /// Shadow object for [ConditionalExpression].
231 class KernelConditionalExpression extends ConditionalExpression 255 class KernelConditionalExpression extends ConditionalExpression
232 implements KernelExpression { 256 implements KernelExpression {
233 KernelConditionalExpression( 257 KernelConditionalExpression(
234 Expression condition, Expression then, Expression otherwise) 258 Expression condition, Expression then, Expression otherwise)
235 : super(condition, then, otherwise, const DynamicType()); 259 : super(condition, then, otherwise, const DynamicType());
236 260
237 @override 261 @override
262 void _collectDependencies(KernelDependencyCollector collector) {
263 // Inference dependencies are the union of the inference dependencies of the
264 // two returned sub-expressions.
265 collector.collectDependencies(then);
266 collector.collectDependencies(otherwise);
267 }
268
269 @override
238 DartType _inferExpression( 270 DartType _inferExpression(
239 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { 271 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) {
240 typeNeeded = 272 typeNeeded =
241 inferrer.listener.conditionalExpressionEnter(this, typeContext) || 273 inferrer.listener.conditionalExpressionEnter(this, typeContext) ||
242 typeNeeded; 274 typeNeeded;
243 inferrer.inferExpression( 275 if (!inferrer.isTopLevel) {
244 condition, inferrer.coreTypes.boolClass.rawType, false); 276 inferrer.inferExpression(
277 condition, inferrer.coreTypes.boolClass.rawType, false);
278 }
245 // TODO(paulberry): is it correct to pass the context down? 279 // TODO(paulberry): is it correct to pass the context down?
246 DartType thenType = inferrer.inferExpression(then, typeContext, true); 280 DartType thenType = inferrer.inferExpression(then, typeContext, true);
247 DartType otherwiseType = 281 DartType otherwiseType =
248 inferrer.inferExpression(otherwise, typeContext, true); 282 inferrer.inferExpression(otherwise, typeContext, true);
249 // TODO(paulberry): the spec proposal says we should only use LUB if the 283 // TODO(paulberry): the spec proposal says we should only use LUB if the
250 // typeContext is `null`. If typeContext is non-null, we should use the 284 // typeContext is `null`. If typeContext is non-null, we should use the
251 // greatest closure of the context with respect to `?` 285 // greatest closure of the context with respect to `?`
252 DartType type = inferrer.typeSchemaEnvironment 286 DartType type = inferrer.typeSchemaEnvironment
253 .getLeastUpperBound(thenType, otherwiseType); 287 .getLeastUpperBound(thenType, otherwiseType);
254 staticType = type; 288 staticType = type;
255 var inferredType = typeNeeded ? type : null; 289 var inferredType = typeNeeded ? type : null;
256 inferrer.listener.conditionalExpressionExit(this, inferredType); 290 inferrer.listener.conditionalExpressionExit(this, inferredType);
257 return inferredType; 291 return inferredType;
258 } 292 }
259 } 293 }
260 294
261 /// Shadow object for [ConstructorInvocation]. 295 /// Shadow object for [ConstructorInvocation].
262 class KernelConstructorInvocation extends ConstructorInvocation 296 class KernelConstructorInvocation extends ConstructorInvocation
263 implements KernelExpression { 297 implements KernelExpression {
264 final Member _initialTarget; 298 final Member _initialTarget;
265 299
266 KernelConstructorInvocation( 300 KernelConstructorInvocation(
267 Constructor target, this._initialTarget, Arguments arguments, 301 Constructor target, this._initialTarget, Arguments arguments,
268 {bool isConst: false}) 302 {bool isConst: false})
269 : super(target, arguments, isConst: isConst); 303 : super(target, arguments, isConst: isConst);
270 304
271 @override 305 @override
306 void _collectDependencies(KernelDependencyCollector collector) {
307 // No inference dependencies.
308 }
309
310 @override
272 DartType _inferExpression( 311 DartType _inferExpression(
273 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { 312 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) {
274 typeNeeded = 313 typeNeeded =
275 inferrer.listener.constructorInvocationEnter(this, typeContext) || 314 inferrer.listener.constructorInvocationEnter(this, typeContext) ||
276 typeNeeded; 315 typeNeeded;
277 var inferredType = inferrer.inferInvocation( 316 var inferredType = inferrer.inferInvocation(
278 typeContext, 317 typeContext,
279 typeNeeded, 318 typeNeeded,
280 fileOffset, 319 fileOffset,
281 _initialTarget.function.functionType, 320 _initialTarget.function.functionType,
282 computeConstructorReturnType(_initialTarget), 321 computeConstructorReturnType(_initialTarget),
283 arguments); 322 arguments);
284 inferrer.listener.constructorInvocationExit(this, inferredType); 323 inferrer.listener.constructorInvocationExit(this, inferredType);
285 return inferredType; 324 return inferredType;
286 } 325 }
287 } 326 }
288 327
328 /// Concrete implementation of [DependencyCollector] specialized to work with
329 /// kernel objects.
330 class KernelDependencyCollector extends DependencyCollectorImpl {
331 @override
332 void collectDependencies(Expression expression) {
333 if (expression is KernelExpression) {
334 // Use polymorphic dispatch on [KernelExpression] to perform whatever kind
335 // of type inference is correct for this kind of statement.
336 // TODO(paulberry): experiment to see if dynamic dispatch would be better,
337 // so that the type hierarchy will be simpler (which may speed up "is"
338 // checks).
339 expression._collectDependencies(this);
340 } else {
341 // Encountered an expression type for which type inference is not yet
342 // implemented, so just assume the expression does not have an immediately
343 // evident type for now.
344 // TODO(paulberry): once the BodyBuilder uses shadow classes for
345 // everything, this case should no longer be needed.
346 recordNotImmediatelyEvident(expression.fileOffset);
347 }
348 }
349 }
350
289 /// Shadow object for [DirectMethodInvocation]. 351 /// Shadow object for [DirectMethodInvocation].
290 class KernelDirectMethodInvocation extends DirectMethodInvocation 352 class KernelDirectMethodInvocation extends DirectMethodInvocation
291 implements KernelExpression { 353 implements KernelExpression {
292 KernelDirectMethodInvocation( 354 KernelDirectMethodInvocation(
293 Expression receiver, Procedure target, Arguments arguments) 355 Expression receiver, Procedure target, Arguments arguments)
294 : super(receiver, target, arguments); 356 : super(receiver, target, arguments);
295 357
296 KernelDirectMethodInvocation.byReference( 358 KernelDirectMethodInvocation.byReference(
297 Expression receiver, Reference targetReference, Arguments arguments) 359 Expression receiver, Reference targetReference, Arguments arguments)
298 : super.byReference(receiver, targetReference, arguments); 360 : super.byReference(receiver, targetReference, arguments);
299 361
300 @override 362 @override
363 void _collectDependencies(KernelDependencyCollector collector) {
364 // TODO(paulberry): Determine the right thing to do here.
365 throw 'TODO(paulberry)';
366 }
367
368 @override
301 DartType _inferExpression( 369 DartType _inferExpression(
302 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { 370 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) {
303 // TODO(scheglov): implement. 371 // TODO(scheglov): implement.
304 return typeNeeded ? const DynamicType() : null; 372 return typeNeeded ? const DynamicType() : null;
305 } 373 }
306 } 374 }
307 375
308 /// Shadow object for [DirectPropertyGet]. 376 /// Shadow object for [DirectPropertyGet].
309 class KernelDirectPropertyGet extends DirectPropertyGet 377 class KernelDirectPropertyGet extends DirectPropertyGet
310 implements KernelExpression { 378 implements KernelExpression {
311 KernelDirectPropertyGet(Expression receiver, Member target) 379 KernelDirectPropertyGet(Expression receiver, Member target)
312 : super(receiver, target); 380 : super(receiver, target);
313 381
314 KernelDirectPropertyGet.byReference( 382 KernelDirectPropertyGet.byReference(
315 Expression receiver, Reference targetReference) 383 Expression receiver, Reference targetReference)
316 : super.byReference(receiver, targetReference); 384 : super.byReference(receiver, targetReference);
317 385
318 @override 386 @override
387 void _collectDependencies(KernelDependencyCollector collector) {
388 // TODO(paulberry): Determine the right thing to do here.
389 throw 'TODO(paulberry)';
390 }
391
392 @override
319 DartType _inferExpression( 393 DartType _inferExpression(
320 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { 394 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) {
321 // TODO(scheglov): implement. 395 // TODO(scheglov): implement.
322 return typeNeeded ? const DynamicType() : null; 396 return typeNeeded ? const DynamicType() : null;
323 } 397 }
324 } 398 }
325 399
326 /// Shadow object for [DirectPropertySet]. 400 /// Shadow object for [DirectPropertySet].
327 class KernelDirectPropertySet extends DirectPropertySet 401 class KernelDirectPropertySet extends DirectPropertySet
328 implements KernelExpression { 402 implements KernelExpression {
329 KernelDirectPropertySet(Expression receiver, Member target, Expression value) 403 KernelDirectPropertySet(Expression receiver, Member target, Expression value)
330 : super(receiver, target, value); 404 : super(receiver, target, value);
331 405
332 KernelDirectPropertySet.byReference( 406 KernelDirectPropertySet.byReference(
333 Expression receiver, Reference targetReference, Expression value) 407 Expression receiver, Reference targetReference, Expression value)
334 : super.byReference(receiver, targetReference, value); 408 : super.byReference(receiver, targetReference, value);
335 409
336 @override 410 @override
411 void _collectDependencies(KernelDependencyCollector collector) {
412 // Assignment expressions are not immediately evident expressions.
413 collector.recordNotImmediatelyEvident(fileOffset);
414 }
415
416 @override
337 DartType _inferExpression( 417 DartType _inferExpression(
338 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { 418 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) {
339 // TODO(scheglov): implement. 419 // TODO(scheglov): implement.
340 return typeNeeded ? const DynamicType() : null; 420 return typeNeeded ? const DynamicType() : null;
341 } 421 }
342 } 422 }
343 423
344 /// Concrete shadow object representing a double literal in kernel form. 424 /// Concrete shadow object representing a double literal in kernel form.
345 class KernelDoubleLiteral extends DoubleLiteral implements KernelExpression { 425 class KernelDoubleLiteral extends DoubleLiteral implements KernelExpression {
346 KernelDoubleLiteral(double value) : super(value); 426 KernelDoubleLiteral(double value) : super(value);
347 427
348 @override 428 @override
429 void _collectDependencies(KernelDependencyCollector collector) {
430 // No inference dependencies.
431 }
432
433 @override
349 DartType _inferExpression( 434 DartType _inferExpression(
350 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { 435 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) {
351 typeNeeded = 436 typeNeeded =
352 inferrer.listener.doubleLiteralEnter(this, typeContext) || typeNeeded; 437 inferrer.listener.doubleLiteralEnter(this, typeContext) || typeNeeded;
353 var inferredType = 438 var inferredType =
354 typeNeeded ? inferrer.coreTypes.doubleClass.rawType : null; 439 typeNeeded ? inferrer.coreTypes.doubleClass.rawType : null;
355 inferrer.listener.doubleLiteralExit(this, inferredType); 440 inferrer.listener.doubleLiteralExit(this, inferredType);
356 return inferredType; 441 return inferredType;
357 } 442 }
358 } 443 }
359 444
360 /// Common base class for shadow objects representing expressions in kernel 445 /// Common base class for shadow objects representing expressions in kernel
361 /// form. 446 /// form.
362 abstract class KernelExpression implements Expression { 447 abstract class KernelExpression implements Expression {
448 /// Collects any dependencies of [expression], and reports errors if the
449 /// expression does not have an immediately evident type.
450 void _collectDependencies(KernelDependencyCollector collector);
451
363 /// Calls back to [inferrer] to perform type inference for whatever concrete 452 /// Calls back to [inferrer] to perform type inference for whatever concrete
364 /// type of [KernelExpression] this is. 453 /// type of [KernelExpression] this is.
365 DartType _inferExpression( 454 DartType _inferExpression(
366 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded); 455 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded);
367 } 456 }
368 457
369 /// Concrete shadow object representing an expression statement in kernel form. 458 /// Concrete shadow object representing an expression statement in kernel form.
370 class KernelExpressionStatement extends ExpressionStatement 459 class KernelExpressionStatement extends ExpressionStatement
371 implements KernelStatement { 460 implements KernelStatement {
372 KernelExpressionStatement(Expression expression) : super(expression); 461 KernelExpressionStatement(Expression expression) : super(expression);
(...skipping 11 matching lines...) Expand all
384 class KernelFactoryConstructorInvocation extends StaticInvocation 473 class KernelFactoryConstructorInvocation extends StaticInvocation
385 implements KernelExpression { 474 implements KernelExpression {
386 final Member _initialTarget; 475 final Member _initialTarget;
387 476
388 KernelFactoryConstructorInvocation( 477 KernelFactoryConstructorInvocation(
389 Procedure target, this._initialTarget, Arguments arguments, 478 Procedure target, this._initialTarget, Arguments arguments,
390 {bool isConst: false}) 479 {bool isConst: false})
391 : super(target, arguments, isConst: isConst); 480 : super(target, arguments, isConst: isConst);
392 481
393 @override 482 @override
483 void _collectDependencies(KernelDependencyCollector collector) {
484 // No inference dependencies.
485 }
486
487 @override
394 DartType _inferExpression( 488 DartType _inferExpression(
395 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { 489 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) {
396 typeNeeded = 490 typeNeeded =
397 inferrer.listener.constructorInvocationEnter(this, typeContext) || 491 inferrer.listener.constructorInvocationEnter(this, typeContext) ||
398 typeNeeded; 492 typeNeeded;
399 var inferredType = inferrer.inferInvocation( 493 var inferredType = inferrer.inferInvocation(
400 typeContext, 494 typeContext,
401 typeNeeded, 495 typeNeeded,
402 fileOffset, 496 fileOffset,
403 _initialTarget.function.functionType, 497 _initialTarget.function.functionType,
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after
516 inferrer.listener.functionDeclarationExit(this); 610 inferrer.listener.functionDeclarationExit(this);
517 } 611 }
518 } 612 }
519 613
520 /// Concrete shadow object representing a function expression in kernel form. 614 /// Concrete shadow object representing a function expression in kernel form.
521 class KernelFunctionExpression extends FunctionExpression 615 class KernelFunctionExpression extends FunctionExpression
522 implements KernelExpression { 616 implements KernelExpression {
523 KernelFunctionExpression(FunctionNode function) : super(function); 617 KernelFunctionExpression(FunctionNode function) : super(function);
524 618
525 @override 619 @override
620 void _collectDependencies(KernelDependencyCollector collector) {
621 for (KernelVariableDeclaration parameter in function.positionalParameters) {
622 if (parameter._implicitlyTyped) {
623 collector.recordNotImmediatelyEvident(parameter.fileOffset);
624 }
625 }
626 for (KernelVariableDeclaration parameter in function.namedParameters) {
627 if (parameter._implicitlyTyped) {
628 collector.recordNotImmediatelyEvident(parameter.fileOffset);
629 }
630 }
631 var body = function.body;
632 if (body is ReturnStatement) {
633 // The inference dependencies are the inference dependencies of the return
634 // expression.
635 collector.collectDependencies(body.expression);
636 } else {
637 collector.recordNotImmediatelyEvident(fileOffset);
638 }
639 }
640
641 @override
526 DartType _inferExpression( 642 DartType _inferExpression(
527 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { 643 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) {
528 typeNeeded = inferrer.listener.functionExpressionEnter(this, typeContext) || 644 typeNeeded = inferrer.listener.functionExpressionEnter(this, typeContext) ||
529 typeNeeded; 645 typeNeeded;
530 // TODO(paulberry): do we also need to visit default parameter values? 646 // TODO(paulberry): do we also need to visit default parameter values?
531 647
532 // Let `<T0, ..., Tn>` be the set of type parameters of the closure (with 648 // Let `<T0, ..., Tn>` be the set of type parameters of the closure (with
533 // `n`=0 if there are no type parameters). 649 // `n`=0 if there are no type parameters).
534 List<TypeParameter> typeParameters = function.typeParameters; 650 List<TypeParameter> typeParameters = function.typeParameters;
535 651
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after
671 /// Performs type inference for whatever concrete type of [KernelInitializer] 787 /// Performs type inference for whatever concrete type of [KernelInitializer]
672 /// this is. 788 /// this is.
673 void _inferInitializer(KernelTypeInferrer inferrer); 789 void _inferInitializer(KernelTypeInferrer inferrer);
674 } 790 }
675 791
676 /// Concrete shadow object representing an integer literal in kernel form. 792 /// Concrete shadow object representing an integer literal in kernel form.
677 class KernelIntLiteral extends IntLiteral implements KernelExpression { 793 class KernelIntLiteral extends IntLiteral implements KernelExpression {
678 KernelIntLiteral(int value) : super(value); 794 KernelIntLiteral(int value) : super(value);
679 795
680 @override 796 @override
797 void _collectDependencies(KernelDependencyCollector collector) {
798 // No inference dependencies.
799 }
800
801 @override
681 DartType _inferExpression( 802 DartType _inferExpression(
682 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { 803 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) {
683 typeNeeded = 804 typeNeeded =
684 inferrer.listener.intLiteralEnter(this, typeContext) || typeNeeded; 805 inferrer.listener.intLiteralEnter(this, typeContext) || typeNeeded;
685 var inferredType = typeNeeded ? inferrer.coreTypes.intClass.rawType : null; 806 var inferredType = typeNeeded ? inferrer.coreTypes.intClass.rawType : null;
686 inferrer.listener.intLiteralExit(this, inferredType); 807 inferrer.listener.intLiteralExit(this, inferredType);
687 return inferredType; 808 return inferredType;
688 } 809 }
689 } 810 }
690 811
691 /// Concrete shadow object representing a non-inverted "is" test in kernel form. 812 /// Concrete shadow object representing a non-inverted "is" test in kernel form.
692 class KernelIsExpression extends IsExpression implements KernelExpression { 813 class KernelIsExpression extends IsExpression implements KernelExpression {
693 KernelIsExpression(Expression operand, DartType type) : super(operand, type); 814 KernelIsExpression(Expression operand, DartType type) : super(operand, type);
694 815
695 @override 816 @override
817 void _collectDependencies(KernelDependencyCollector collector) {
818 // No inference dependencies.
819 }
820
821 @override
696 DartType _inferExpression( 822 DartType _inferExpression(
697 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { 823 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) {
698 typeNeeded = 824 typeNeeded =
699 inferrer.listener.isExpressionEnter(this, typeContext) || typeNeeded; 825 inferrer.listener.isExpressionEnter(this, typeContext) || typeNeeded;
700 inferrer.inferExpression(operand, null, false); 826 inferrer.inferExpression(operand, null, false);
701 var inferredType = typeNeeded ? inferrer.coreTypes.boolClass.rawType : null; 827 var inferredType = typeNeeded ? inferrer.coreTypes.boolClass.rawType : null;
702 inferrer.listener.isExpressionExit(this, inferredType); 828 inferrer.listener.isExpressionExit(this, inferredType);
703 return inferredType; 829 return inferredType;
704 } 830 }
705 } 831 }
706 832
707 /// Concrete shadow object representing an inverted "is" test in kernel form. 833 /// Concrete shadow object representing an inverted "is" test in kernel form.
708 class KernelIsNotExpression extends Not implements KernelExpression { 834 class KernelIsNotExpression extends Not implements KernelExpression {
709 KernelIsNotExpression(Expression operand, DartType type, int charOffset) 835 KernelIsNotExpression(Expression operand, DartType type, int charOffset)
710 : super(new IsExpression(operand, type)..fileOffset = charOffset); 836 : super(new IsExpression(operand, type)..fileOffset = charOffset);
711 837
712 @override 838 @override
839 void _collectDependencies(KernelDependencyCollector collector) {
840 // No inference dependencies.
841 }
842
843 @override
713 DartType _inferExpression( 844 DartType _inferExpression(
714 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { 845 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) {
715 IsExpression isExpression = this.operand; 846 IsExpression isExpression = this.operand;
716 typeNeeded = 847 typeNeeded =
717 inferrer.listener.isNotExpressionEnter(this, typeContext) || typeNeeded; 848 inferrer.listener.isNotExpressionEnter(this, typeContext) || typeNeeded;
718 inferrer.inferExpression(isExpression.operand, null, false); 849 inferrer.inferExpression(isExpression.operand, null, false);
719 var inferredType = typeNeeded ? inferrer.coreTypes.boolClass.rawType : null; 850 var inferredType = typeNeeded ? inferrer.coreTypes.boolClass.rawType : null;
720 inferrer.listener.isNotExpressionExit(this, inferredType); 851 inferrer.listener.isNotExpressionExit(this, inferredType);
721 return inferredType; 852 return inferredType;
722 } 853 }
723 } 854 }
724 855
725 /// Concrete shadow object representing a list literal in kernel form. 856 /// Concrete shadow object representing a list literal in kernel form.
726 class KernelListLiteral extends ListLiteral implements KernelExpression { 857 class KernelListLiteral extends ListLiteral implements KernelExpression {
727 final DartType _declaredTypeArgument; 858 final DartType _declaredTypeArgument;
728 859
729 KernelListLiteral(List<Expression> expressions, 860 KernelListLiteral(List<Expression> expressions,
730 {DartType typeArgument, bool isConst: false}) 861 {DartType typeArgument, bool isConst: false})
731 : _declaredTypeArgument = typeArgument, 862 : _declaredTypeArgument = typeArgument,
732 super(expressions, 863 super(expressions,
733 typeArgument: typeArgument ?? const DynamicType(), 864 typeArgument: typeArgument ?? const DynamicType(),
734 isConst: isConst); 865 isConst: isConst);
735 866
736 @override 867 @override
868 void _collectDependencies(KernelDependencyCollector collector) {
869 if (_declaredTypeArgument == null) {
870 expressions.forEach(collector.collectDependencies);
871 }
872 }
873
874 @override
737 DartType _inferExpression( 875 DartType _inferExpression(
738 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { 876 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) {
739 typeNeeded = 877 typeNeeded =
740 inferrer.listener.listLiteralEnter(this, typeContext) || typeNeeded; 878 inferrer.listener.listLiteralEnter(this, typeContext) || typeNeeded;
741 var listClass = inferrer.coreTypes.listClass; 879 var listClass = inferrer.coreTypes.listClass;
742 var listType = listClass.thisType; 880 var listType = listClass.thisType;
743 List<DartType> inferredTypes; 881 List<DartType> inferredTypes;
744 DartType inferredTypeArgument; 882 DartType inferredTypeArgument;
745 List<DartType> formalTypes; 883 List<DartType> formalTypes;
746 List<DartType> actualTypes; 884 List<DartType> actualTypes;
747 bool inferenceNeeded = _declaredTypeArgument == null && inferrer.strongMode; 885 bool inferenceNeeded = _declaredTypeArgument == null && inferrer.strongMode;
748 if (inferenceNeeded) { 886 if (inferenceNeeded) {
749 inferredTypes = [const UnknownType()]; 887 inferredTypes = [const UnknownType()];
750 inferrer.typeSchemaEnvironment.inferGenericFunctionOrType(listType, 888 inferrer.typeSchemaEnvironment.inferGenericFunctionOrType(listType,
751 listClass.typeParameters, null, null, typeContext, inferredTypes); 889 listClass.typeParameters, null, null, typeContext, inferredTypes);
752 inferredTypeArgument = inferredTypes[0]; 890 inferredTypeArgument = inferredTypes[0];
753 formalTypes = []; 891 formalTypes = [];
754 actualTypes = []; 892 actualTypes = [];
755 } else { 893 } else {
756 inferredTypeArgument = _declaredTypeArgument ?? const DynamicType(); 894 inferredTypeArgument = _declaredTypeArgument ?? const DynamicType();
757 } 895 }
758 for (var expression in expressions) { 896 if (inferenceNeeded || !inferrer.isTopLevel) {
759 var expressionType = inferrer.inferExpression( 897 for (var expression in expressions) {
760 expression, inferredTypeArgument, inferenceNeeded); 898 var expressionType = inferrer.inferExpression(
761 if (inferenceNeeded) { 899 expression, inferredTypeArgument, inferenceNeeded);
762 formalTypes.add(listType.typeArguments[0]); 900 if (inferenceNeeded) {
763 actualTypes.add(expressionType); 901 formalTypes.add(listType.typeArguments[0]);
902 actualTypes.add(expressionType);
903 }
764 } 904 }
765 } 905 }
766 if (inferenceNeeded) { 906 if (inferenceNeeded) {
767 inferrer.typeSchemaEnvironment.inferGenericFunctionOrType( 907 inferrer.typeSchemaEnvironment.inferGenericFunctionOrType(
768 listType, 908 listType,
769 listClass.typeParameters, 909 listClass.typeParameters,
770 formalTypes, 910 formalTypes,
771 actualTypes, 911 actualTypes,
772 typeContext, 912 typeContext,
773 inferredTypes); 913 inferredTypes);
(...skipping 13 matching lines...) Expand all
787 } 927 }
788 } 928 }
789 929
790 /// Shadow object for [LogicalExpression]. 930 /// Shadow object for [LogicalExpression].
791 class KernelLogicalExpression extends LogicalExpression 931 class KernelLogicalExpression extends LogicalExpression
792 implements KernelExpression { 932 implements KernelExpression {
793 KernelLogicalExpression(Expression left, String operator, Expression right) 933 KernelLogicalExpression(Expression left, String operator, Expression right)
794 : super(left, operator, right); 934 : super(left, operator, right);
795 935
796 @override 936 @override
937 void _collectDependencies(KernelDependencyCollector collector) {
938 // No inference dependencies.
939 }
940
941 @override
797 DartType _inferExpression( 942 DartType _inferExpression(
798 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { 943 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) {
799 // TODO(scheglov): implement. 944 // TODO(scheglov): implement.
800 return typeNeeded ? const DynamicType() : null; 945 return typeNeeded ? const DynamicType() : null;
801 } 946 }
802 } 947 }
803 948
804 /// Shadow object for [MapLiteral]. 949 /// Shadow object for [MapLiteral].
805 class KernelMapLiteral extends MapLiteral implements KernelExpression { 950 class KernelMapLiteral extends MapLiteral implements KernelExpression {
806 final DartType _declaredKeyType; 951 final DartType _declaredKeyType;
807 final DartType _declaredValueType; 952 final DartType _declaredValueType;
808 953
809 KernelMapLiteral(List<MapEntry> entries, 954 KernelMapLiteral(List<MapEntry> entries,
810 {DartType keyType, DartType valueType, bool isConst: false}) 955 {DartType keyType, DartType valueType, bool isConst: false})
811 : _declaredKeyType = keyType, 956 : _declaredKeyType = keyType,
812 _declaredValueType = valueType, 957 _declaredValueType = valueType,
813 super(entries, 958 super(entries,
814 keyType: keyType ?? const DynamicType(), 959 keyType: keyType ?? const DynamicType(),
815 valueType: valueType ?? const DynamicType(), 960 valueType: valueType ?? const DynamicType(),
816 isConst: isConst); 961 isConst: isConst);
817 962
818 @override 963 @override
964 void _collectDependencies(KernelDependencyCollector collector) {
965 assert((_declaredKeyType == null) == (_declaredValueType == null));
966 if (_declaredKeyType == null) {
967 for (var entry in entries) {
968 collector.collectDependencies(entry.key);
969 collector.collectDependencies(entry.value);
970 }
971 }
972 }
973
974 @override
819 DartType _inferExpression( 975 DartType _inferExpression(
820 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { 976 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) {
821 typeNeeded = 977 typeNeeded =
822 inferrer.listener.mapLiteralEnter(this, typeContext) || typeNeeded; 978 inferrer.listener.mapLiteralEnter(this, typeContext) || typeNeeded;
823 var mapClass = inferrer.coreTypes.mapClass; 979 var mapClass = inferrer.coreTypes.mapClass;
824 var mapType = mapClass.thisType; 980 var mapType = mapClass.thisType;
825 List<DartType> inferredTypes; 981 List<DartType> inferredTypes;
826 DartType inferredKeyType; 982 DartType inferredKeyType;
827 DartType inferredValueType; 983 DartType inferredValueType;
828 List<DartType> formalTypes; 984 List<DartType> formalTypes;
829 List<DartType> actualTypes; 985 List<DartType> actualTypes;
830 assert((_declaredKeyType == null) == (_declaredValueType == null)); 986 assert((_declaredKeyType == null) == (_declaredValueType == null));
831 bool inferenceNeeded = _declaredKeyType == null && inferrer.strongMode; 987 bool inferenceNeeded = _declaredKeyType == null && inferrer.strongMode;
832 if (inferenceNeeded) { 988 if (inferenceNeeded) {
833 inferredTypes = [const UnknownType(), const UnknownType()]; 989 inferredTypes = [const UnknownType(), const UnknownType()];
834 inferrer.typeSchemaEnvironment.inferGenericFunctionOrType(mapType, 990 inferrer.typeSchemaEnvironment.inferGenericFunctionOrType(mapType,
835 mapClass.typeParameters, null, null, typeContext, inferredTypes); 991 mapClass.typeParameters, null, null, typeContext, inferredTypes);
836 inferredKeyType = inferredTypes[0]; 992 inferredKeyType = inferredTypes[0];
837 inferredValueType = inferredTypes[1]; 993 inferredValueType = inferredTypes[1];
838 formalTypes = []; 994 formalTypes = [];
839 actualTypes = []; 995 actualTypes = [];
840 } else { 996 } else {
841 inferredKeyType = _declaredKeyType ?? const DynamicType(); 997 inferredKeyType = _declaredKeyType ?? const DynamicType();
842 inferredValueType = _declaredValueType ?? const DynamicType(); 998 inferredValueType = _declaredValueType ?? const DynamicType();
843 } 999 }
844 for (var entry in entries) { 1000 if (inferenceNeeded || !inferrer.isTopLevel) {
845 var keyType = 1001 for (var entry in entries) {
846 inferrer.inferExpression(entry.key, inferredKeyType, inferenceNeeded); 1002 var keyType = inferrer.inferExpression(
847 var valueType = inferrer.inferExpression( 1003 entry.key, inferredKeyType, inferenceNeeded);
848 entry.value, inferredValueType, inferenceNeeded); 1004 var valueType = inferrer.inferExpression(
849 if (inferenceNeeded) { 1005 entry.value, inferredValueType, inferenceNeeded);
850 formalTypes.addAll(mapType.typeArguments); 1006 if (inferenceNeeded) {
851 actualTypes.add(keyType); 1007 formalTypes.addAll(mapType.typeArguments);
852 actualTypes.add(valueType); 1008 actualTypes.add(keyType);
1009 actualTypes.add(valueType);
1010 }
853 } 1011 }
854 } 1012 }
855 if (inferenceNeeded) { 1013 if (inferenceNeeded) {
856 inferrer.typeSchemaEnvironment.inferGenericFunctionOrType( 1014 inferrer.typeSchemaEnvironment.inferGenericFunctionOrType(
857 mapType, 1015 mapType,
858 mapClass.typeParameters, 1016 mapClass.typeParameters,
859 formalTypes, 1017 formalTypes,
860 actualTypes, 1018 actualTypes,
861 typeContext, 1019 typeContext,
862 inferredTypes); 1020 inferredTypes);
(...skipping 21 matching lines...) Expand all
884 implements KernelExpression { 1042 implements KernelExpression {
885 KernelMethodInvocation(Expression receiver, Name name, Arguments arguments, 1043 KernelMethodInvocation(Expression receiver, Name name, Arguments arguments,
886 [Procedure interfaceTarget]) 1044 [Procedure interfaceTarget])
887 : super(receiver, name, arguments, interfaceTarget); 1045 : super(receiver, name, arguments, interfaceTarget);
888 1046
889 KernelMethodInvocation.byReference(Expression receiver, Name name, 1047 KernelMethodInvocation.byReference(Expression receiver, Name name,
890 Arguments arguments, Reference interfaceTargetReference) 1048 Arguments arguments, Reference interfaceTargetReference)
891 : super.byReference(receiver, name, arguments, interfaceTargetReference); 1049 : super.byReference(receiver, name, arguments, interfaceTargetReference);
892 1050
893 @override 1051 @override
1052 void _collectDependencies(KernelDependencyCollector collector) {
1053 // The inference dependencies are the inference dependencies of the
1054 // receiver.
1055 collector.collectDependencies(receiver);
1056 }
1057
1058 @override
894 DartType _inferExpression( 1059 DartType _inferExpression(
895 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { 1060 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) {
896 typeNeeded = inferrer.listener.methodInvocationEnter(this, typeContext) || 1061 typeNeeded = inferrer.listener.methodInvocationEnter(this, typeContext) ||
897 typeNeeded; 1062 typeNeeded;
898 // First infer the receiver so we can look up the method that was invoked. 1063 // First infer the receiver so we can look up the method that was invoked.
899 var receiverType = inferrer.inferExpression(receiver, null, true); 1064 var receiverType = inferrer.inferExpression(receiver, null, true);
900 bool isOverloadedArithmeticOperator = false; 1065 bool isOverloadedArithmeticOperator = false;
901 Member interfaceMember; 1066 Member interfaceMember;
902 if (receiverType is InterfaceType) { 1067 if (receiverType is InterfaceType) {
903 interfaceMember = inferrer.classHierarchy 1068 interfaceMember = inferrer.classHierarchy
(...skipping 18 matching lines...) Expand all
922 inferrer.listener.methodInvocationExit(this, inferredType); 1087 inferrer.listener.methodInvocationExit(this, inferredType);
923 return inferredType; 1088 return inferredType;
924 } 1089 }
925 } 1090 }
926 1091
927 /// Shadow object for [Not]. 1092 /// Shadow object for [Not].
928 class KernelNot extends Not implements KernelExpression { 1093 class KernelNot extends Not implements KernelExpression {
929 KernelNot(Expression operand) : super(operand); 1094 KernelNot(Expression operand) : super(operand);
930 1095
931 @override 1096 @override
1097 void _collectDependencies(KernelDependencyCollector collector) {
1098 // No inference dependencies.
1099 }
1100
1101 @override
932 DartType _inferExpression( 1102 DartType _inferExpression(
933 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { 1103 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) {
934 // TODO(scheglov): implement. 1104 // TODO(scheglov): implement.
935 return typeNeeded ? const DynamicType() : null; 1105 return typeNeeded ? const DynamicType() : null;
936 } 1106 }
937 } 1107 }
938 1108
939 /// Concrete shadow object representing a null literal in kernel form. 1109 /// Concrete shadow object representing a null literal in kernel form.
940 class KernelNullLiteral extends NullLiteral implements KernelExpression { 1110 class KernelNullLiteral extends NullLiteral implements KernelExpression {
941 @override 1111 @override
1112 void _collectDependencies(KernelDependencyCollector collector) {
1113 // No inference dependencies.
1114 }
1115
1116 @override
942 DartType _inferExpression( 1117 DartType _inferExpression(
943 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { 1118 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) {
944 typeNeeded = 1119 typeNeeded =
945 inferrer.listener.nullLiteralEnter(this, typeContext) || typeNeeded; 1120 inferrer.listener.nullLiteralEnter(this, typeContext) || typeNeeded;
946 var inferredType = typeNeeded ? inferrer.coreTypes.nullClass.rawType : null; 1121 var inferredType = typeNeeded ? inferrer.coreTypes.nullClass.rawType : null;
947 inferrer.listener.nullLiteralExit(this, inferredType); 1122 inferrer.listener.nullLiteralExit(this, inferredType);
948 return inferredType; 1123 return inferredType;
949 } 1124 }
950 } 1125 }
951 1126
952 /// Shadow object for [PropertyGet]. 1127 /// Shadow object for [PropertyGet].
953 class KernelPropertyGet extends PropertyGet implements KernelExpression { 1128 class KernelPropertyGet extends PropertyGet implements KernelExpression {
954 KernelPropertyGet(Expression receiver, Name name, [Member interfaceTarget]) 1129 KernelPropertyGet(Expression receiver, Name name, [Member interfaceTarget])
955 : super(receiver, name, interfaceTarget); 1130 : super(receiver, name, interfaceTarget);
956 1131
957 KernelPropertyGet.byReference( 1132 KernelPropertyGet.byReference(
958 Expression receiver, Name name, Reference interfaceTargetReference) 1133 Expression receiver, Name name, Reference interfaceTargetReference)
959 : super.byReference(receiver, name, interfaceTargetReference); 1134 : super.byReference(receiver, name, interfaceTargetReference);
960 1135
961 @override 1136 @override
1137 void _collectDependencies(KernelDependencyCollector collector) {
1138 // A simple or qualified identifier referring to a top level function,
1139 // static variable, field, getter; or a static class variable, static getter
1140 // or method; or an instance method; has the inferred type of the referent.
1141 // - Otherwise, if the identifier has no inferred or annotated type then it
1142 // is an error.
1143 // - Note: specifically, references to instance fields and instance getters
1144 // are disallowed here.
1145 // - The inference dependency of the identifier is the referent if the
1146 // referent is a candidate for inference. Otherwise there are no
1147 // inference dependencies.
1148 // TODO(paulberry): implement the proper logic here.
scheglov 2017/05/30 18:07:05 Leaf also asked me to create a version of Analyzer
Paul Berry 2017/05/30 20:41:53 Thanks for the heads up!
1149 }
1150
1151 @override
962 DartType _inferExpression( 1152 DartType _inferExpression(
963 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { 1153 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) {
964 // TODO(scheglov): implement. 1154 // TODO(scheglov): implement.
965 return typeNeeded ? const DynamicType() : null; 1155 return typeNeeded ? const DynamicType() : null;
966 } 1156 }
967 } 1157 }
968 1158
969 /// Shadow object for [PropertyGet]. 1159 /// Shadow object for [PropertyGet].
970 class KernelPropertySet extends PropertySet implements KernelExpression { 1160 class KernelPropertySet extends PropertySet implements KernelExpression {
971 KernelPropertySet(Expression receiver, Name name, Expression value, 1161 KernelPropertySet(Expression receiver, Name name, Expression value,
972 [Member interfaceTarget]) 1162 [Member interfaceTarget])
973 : super(receiver, name, value, interfaceTarget); 1163 : super(receiver, name, value, interfaceTarget);
974 1164
975 KernelPropertySet.byReference(Expression receiver, Name name, 1165 KernelPropertySet.byReference(Expression receiver, Name name,
976 Expression value, Reference interfaceTargetReference) 1166 Expression value, Reference interfaceTargetReference)
977 : super.byReference(receiver, name, value, interfaceTargetReference); 1167 : super.byReference(receiver, name, value, interfaceTargetReference);
978 1168
979 @override 1169 @override
1170 void _collectDependencies(KernelDependencyCollector collector) {
1171 // Assignment expressions are not immediately evident expressions.
1172 collector.recordNotImmediatelyEvident(fileOffset);
1173 }
1174
1175 @override
980 DartType _inferExpression( 1176 DartType _inferExpression(
981 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { 1177 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) {
982 // TODO(scheglov): implement. 1178 // TODO(scheglov): implement.
983 return typeNeeded ? const DynamicType() : null; 1179 return typeNeeded ? const DynamicType() : null;
984 } 1180 }
985 } 1181 }
986 1182
987 /// Concrete shadow object representing a redirecting initializer in kernel 1183 /// Concrete shadow object representing a redirecting initializer in kernel
988 /// form. 1184 /// form.
989 class KernelRedirectingInitializer extends RedirectingInitializer 1185 class KernelRedirectingInitializer extends RedirectingInitializer
990 implements KernelInitializer { 1186 implements KernelInitializer {
991 KernelRedirectingInitializer(Constructor target, Arguments arguments) 1187 KernelRedirectingInitializer(Constructor target, Arguments arguments)
992 : super(target, arguments); 1188 : super(target, arguments);
993 1189
994 @override 1190 @override
995 _inferInitializer(KernelTypeInferrer inferrer) { 1191 _inferInitializer(KernelTypeInferrer inferrer) {
996 inferrer.listener.redirectingInitializerEnter(this); 1192 inferrer.listener.redirectingInitializerEnter(this);
997 inferrer.inferInvocation(null, false, fileOffset, 1193 inferrer.inferInvocation(null, false, fileOffset,
998 target.function.functionType, target.enclosingClass.thisType, arguments, 1194 target.function.functionType, target.enclosingClass.thisType, arguments,
999 skipTypeArgumentInference: true); 1195 skipTypeArgumentInference: true);
1000 inferrer.listener.redirectingInitializerExit(this); 1196 inferrer.listener.redirectingInitializerExit(this);
1001 } 1197 }
1002 } 1198 }
1003 1199
1004 /// Shadow object for [Rethrow]. 1200 /// Shadow object for [Rethrow].
1005 class KernelRethrow extends Rethrow implements KernelExpression { 1201 class KernelRethrow extends Rethrow implements KernelExpression {
1006 @override 1202 @override
1203 void _collectDependencies(KernelDependencyCollector collector) {
1204 // No inference dependencies.
1205 }
1206
1207 @override
1007 DartType _inferExpression( 1208 DartType _inferExpression(
1008 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { 1209 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) {
1009 // TODO(scheglov): implement. 1210 // TODO(scheglov): implement.
1010 return typeNeeded ? const DynamicType() : null; 1211 return typeNeeded ? const DynamicType() : null;
1011 } 1212 }
1012 } 1213 }
1013 1214
1014 /// Concrete shadow object representing a return statement in kernel form. 1215 /// Concrete shadow object representing a return statement in kernel form.
1015 class KernelReturnStatement extends ReturnStatement implements KernelStatement { 1216 class KernelReturnStatement extends ReturnStatement implements KernelStatement {
1016 KernelReturnStatement([Expression expression]) : super(expression); 1217 KernelReturnStatement([Expression expression]) : super(expression);
(...skipping 24 matching lines...) Expand all
1041 /// type of [KernelStatement] this is. 1242 /// type of [KernelStatement] this is.
1042 void _inferStatement(KernelTypeInferrer inferrer); 1243 void _inferStatement(KernelTypeInferrer inferrer);
1043 } 1244 }
1044 1245
1045 /// Concrete shadow object representing a read of a static variable in kernel 1246 /// Concrete shadow object representing a read of a static variable in kernel
1046 /// form. 1247 /// form.
1047 class KernelStaticGet extends StaticGet implements KernelExpression { 1248 class KernelStaticGet extends StaticGet implements KernelExpression {
1048 KernelStaticGet(Member target) : super(target); 1249 KernelStaticGet(Member target) : super(target);
1049 1250
1050 @override 1251 @override
1252 void _collectDependencies(KernelDependencyCollector collector) {
1253 // A simple or qualified identifier referring to a top level function,
1254 // static variable, field, getter; or a static class variable, static getter
1255 // or method; or an instance method; has the inferred type of the referent.
1256 // - Otherwise, if the identifier has no inferred or annotated type then it
1257 // is an error.
1258 // - Note: specifically, references to instance fields and instance getters
1259 // are disallowed here.
1260 // - The inference dependency of the identifier is the referent if the
1261 // referent is a candidate for inference. Otherwise there are no
1262 // inference dependencies.
1263 // TODO(paulberry): implement the proper error checking logic.
1264 var target = this.target;
1265 if (target is KernelField && target._fieldNode != null) {
1266 collector.recordDependency(target._fieldNode);
1267 }
1268 }
1269
1270 @override
1051 DartType _inferExpression( 1271 DartType _inferExpression(
1052 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { 1272 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) {
1053 typeNeeded = 1273 typeNeeded =
1054 inferrer.listener.staticGetEnter(this, typeContext) || typeNeeded; 1274 inferrer.listener.staticGetEnter(this, typeContext) || typeNeeded;
1055 var inferredType = typeNeeded ? target.getterType : null; 1275 var inferredType = typeNeeded ? target.getterType : null;
1056 inferrer.listener.staticGetExit(this, inferredType); 1276 inferrer.listener.staticGetExit(this, inferredType);
1057 return inferredType; 1277 return inferredType;
1058 } 1278 }
1059 } 1279 }
1060 1280
1061 /// Shadow object for [StaticInvocation]. 1281 /// Shadow object for [StaticInvocation].
1062 class KernelStaticInvocation extends StaticInvocation 1282 class KernelStaticInvocation extends StaticInvocation
1063 implements KernelExpression { 1283 implements KernelExpression {
1064 KernelStaticInvocation(Procedure target, Arguments arguments, 1284 KernelStaticInvocation(Procedure target, Arguments arguments,
1065 {bool isConst: false}) 1285 {bool isConst: false})
1066 : super(target, arguments, isConst: isConst); 1286 : super(target, arguments, isConst: isConst);
1067 1287
1068 KernelStaticInvocation.byReference( 1288 KernelStaticInvocation.byReference(
1069 Reference targetReference, Arguments arguments) 1289 Reference targetReference, Arguments arguments)
1070 : super.byReference(targetReference, arguments); 1290 : super.byReference(targetReference, arguments);
1071 1291
1072 @override 1292 @override
1293 void _collectDependencies(KernelDependencyCollector collector) {
1294 // No inference dependencies.
1295 }
1296
1297 @override
1073 DartType _inferExpression( 1298 DartType _inferExpression(
1074 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { 1299 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) {
1075 typeNeeded = inferrer.listener.staticInvocationEnter(this, typeContext) || 1300 typeNeeded = inferrer.listener.staticInvocationEnter(this, typeContext) ||
1076 typeNeeded; 1301 typeNeeded;
1077 var calleeType = target.function.functionType; 1302 var calleeType = target.function.functionType;
1078 var inferredType = inferrer.inferInvocation(typeContext, typeNeeded, 1303 var inferredType = inferrer.inferInvocation(typeContext, typeNeeded,
1079 fileOffset, calleeType, calleeType.returnType, arguments); 1304 fileOffset, calleeType, calleeType.returnType, arguments);
1080 inferrer.listener.staticInvocationExit(this, inferredType); 1305 inferrer.listener.staticInvocationExit(this, inferredType);
1081 return inferredType; 1306 return inferredType;
1082 } 1307 }
1083 } 1308 }
1084 1309
1085 /// Shadow object for [StaticSet]. 1310 /// Shadow object for [StaticSet].
1086 class KernelStaticSet extends StaticSet implements KernelExpression { 1311 class KernelStaticSet extends StaticSet implements KernelExpression {
1087 KernelStaticSet(Member target, Expression value) : super(target, value); 1312 KernelStaticSet(Member target, Expression value) : super(target, value);
1088 1313
1089 KernelStaticSet.byReference(Reference targetReference, Expression value) 1314 KernelStaticSet.byReference(Reference targetReference, Expression value)
1090 : super.byReference(targetReference, value); 1315 : super.byReference(targetReference, value);
1091 1316
1092 @override 1317 @override
1318 void _collectDependencies(KernelDependencyCollector collector) {
1319 // Assignment expressions are not immediately evident expressions.
1320 collector.recordNotImmediatelyEvident(fileOffset);
1321 }
1322
1323 @override
1093 DartType _inferExpression( 1324 DartType _inferExpression(
1094 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { 1325 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) {
1095 // TODO(scheglov): implement. 1326 // TODO(scheglov): implement.
1096 return typeNeeded ? const DynamicType() : null; 1327 return typeNeeded ? const DynamicType() : null;
1097 } 1328 }
1098 } 1329 }
1099 1330
1100 /// Concrete shadow object representing a string concatenation in kernel form. 1331 /// Concrete shadow object representing a string concatenation in kernel form.
1101 class KernelStringConcatenation extends StringConcatenation 1332 class KernelStringConcatenation extends StringConcatenation
1102 implements KernelExpression { 1333 implements KernelExpression {
1103 KernelStringConcatenation(List<Expression> expressions) : super(expressions); 1334 KernelStringConcatenation(List<Expression> expressions) : super(expressions);
1104 1335
1105 @override 1336 @override
1337 void _collectDependencies(KernelDependencyCollector collector) {
1338 // No inference dependencies.
1339 }
1340
1341 @override
1106 DartType _inferExpression( 1342 DartType _inferExpression(
1107 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { 1343 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) {
1108 typeNeeded = 1344 typeNeeded =
1109 inferrer.listener.stringConcatenationEnter(this, typeContext) || 1345 inferrer.listener.stringConcatenationEnter(this, typeContext) ||
1110 typeNeeded; 1346 typeNeeded;
1111 for (Expression expression in expressions) { 1347 if (!inferrer.isTopLevel) {
1112 inferrer.inferExpression(expression, null, false); 1348 for (Expression expression in expressions) {
1349 inferrer.inferExpression(expression, null, false);
1350 }
1113 } 1351 }
1114 var inferredType = 1352 var inferredType =
1115 typeNeeded ? inferrer.coreTypes.stringClass.rawType : null; 1353 typeNeeded ? inferrer.coreTypes.stringClass.rawType : null;
1116 inferrer.listener.stringConcatenationExit(this, inferredType); 1354 inferrer.listener.stringConcatenationExit(this, inferredType);
1117 return inferredType; 1355 return inferredType;
1118 } 1356 }
1119 } 1357 }
1120 1358
1121 /// Concrete shadow object representing a string literal in kernel form. 1359 /// Concrete shadow object representing a string literal in kernel form.
1122 class KernelStringLiteral extends StringLiteral implements KernelExpression { 1360 class KernelStringLiteral extends StringLiteral implements KernelExpression {
1123 KernelStringLiteral(String value) : super(value); 1361 KernelStringLiteral(String value) : super(value);
1124 1362
1125 @override 1363 @override
1364 void _collectDependencies(KernelDependencyCollector collector) {
1365 // No inference dependencies.
1366 }
1367
1368 @override
1126 DartType _inferExpression( 1369 DartType _inferExpression(
1127 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { 1370 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) {
1128 typeNeeded = 1371 typeNeeded =
1129 inferrer.listener.stringLiteralEnter(this, typeContext) || typeNeeded; 1372 inferrer.listener.stringLiteralEnter(this, typeContext) || typeNeeded;
1130 var inferredType = 1373 var inferredType =
1131 typeNeeded ? inferrer.coreTypes.stringClass.rawType : null; 1374 typeNeeded ? inferrer.coreTypes.stringClass.rawType : null;
1132 inferrer.listener.stringLiteralExit(this, inferredType); 1375 inferrer.listener.stringLiteralExit(this, inferredType);
1133 return inferredType; 1376 return inferredType;
1134 } 1377 }
1135 } 1378 }
1136 1379
1137 /// Shadow object for [SuperMethodInvocation]. 1380 /// Shadow object for [SuperMethodInvocation].
1138 class KernelSuperMethodInvocation extends SuperMethodInvocation 1381 class KernelSuperMethodInvocation extends SuperMethodInvocation
1139 implements KernelExpression { 1382 implements KernelExpression {
1140 KernelSuperMethodInvocation(Name name, Arguments arguments, 1383 KernelSuperMethodInvocation(Name name, Arguments arguments,
1141 [Procedure interfaceTarget]) 1384 [Procedure interfaceTarget])
1142 : super(name, arguments, interfaceTarget); 1385 : super(name, arguments, interfaceTarget);
1143 1386
1144 KernelSuperMethodInvocation.byReference( 1387 KernelSuperMethodInvocation.byReference(
1145 Name name, Arguments arguments, Reference interfaceTargetReference) 1388 Name name, Arguments arguments, Reference interfaceTargetReference)
1146 : super.byReference(name, arguments, interfaceTargetReference); 1389 : super.byReference(name, arguments, interfaceTargetReference);
1147 1390
1148 @override 1391 @override
1392 void _collectDependencies(KernelDependencyCollector collector) {
1393 // Super expressions should never occur in top level type inference.
1394 // TODO(paulberry): but could they occur due to invalid code?
1395 assert(false);
1396 }
1397
1398 @override
1149 DartType _inferExpression( 1399 DartType _inferExpression(
1150 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { 1400 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) {
1151 // TODO(scheglov): implement. 1401 // TODO(scheglov): implement.
1152 return typeNeeded ? const DynamicType() : null; 1402 return typeNeeded ? const DynamicType() : null;
1153 } 1403 }
1154 } 1404 }
1155 1405
1156 /// Shadow object for [SuperPropertyGet]. 1406 /// Shadow object for [SuperPropertyGet].
1157 class KernelSuperPropertyGet extends SuperPropertyGet 1407 class KernelSuperPropertyGet extends SuperPropertyGet
1158 implements KernelExpression { 1408 implements KernelExpression {
1159 KernelSuperPropertyGet(Name name, [Member interfaceTarget]) 1409 KernelSuperPropertyGet(Name name, [Member interfaceTarget])
1160 : super(name, interfaceTarget); 1410 : super(name, interfaceTarget);
1161 1411
1162 KernelSuperPropertyGet.byReference( 1412 KernelSuperPropertyGet.byReference(
1163 Name name, Reference interfaceTargetReference) 1413 Name name, Reference interfaceTargetReference)
1164 : super.byReference(name, interfaceTargetReference); 1414 : super.byReference(name, interfaceTargetReference);
1165 1415
1166 @override 1416 @override
1417 void _collectDependencies(KernelDependencyCollector collector) {
1418 // Super expressions should never occur in top level type inference.
1419 // TODO(paulberry): but could they occur due to invalid code?
1420 assert(false);
1421 }
1422
1423 @override
1167 DartType _inferExpression( 1424 DartType _inferExpression(
1168 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { 1425 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) {
1169 // TODO(scheglov): implement. 1426 // TODO(scheglov): implement.
1170 return typeNeeded ? const DynamicType() : null; 1427 return typeNeeded ? const DynamicType() : null;
1171 } 1428 }
1172 } 1429 }
1173 1430
1174 /// Shadow object for [SuperPropertySet]. 1431 /// Shadow object for [SuperPropertySet].
1175 class KernelSuperPropertySet extends SuperPropertySet 1432 class KernelSuperPropertySet extends SuperPropertySet
1176 implements KernelExpression { 1433 implements KernelExpression {
1177 KernelSuperPropertySet(Name name, Expression value, Member interfaceTarget) 1434 KernelSuperPropertySet(Name name, Expression value, Member interfaceTarget)
1178 : super(name, value, interfaceTarget); 1435 : super(name, value, interfaceTarget);
1179 1436
1180 KernelSuperPropertySet.byReference( 1437 KernelSuperPropertySet.byReference(
1181 Name name, Expression value, Reference interfaceTargetReference) 1438 Name name, Expression value, Reference interfaceTargetReference)
1182 : super.byReference(name, value, interfaceTargetReference); 1439 : super.byReference(name, value, interfaceTargetReference);
1183 1440
1184 @override 1441 @override
1442 void _collectDependencies(KernelDependencyCollector collector) {
1443 // Assignment expressions are not immediately evident expressions.
1444 collector.recordNotImmediatelyEvident(fileOffset);
1445 }
1446
1447 @override
1185 DartType _inferExpression( 1448 DartType _inferExpression(
1186 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { 1449 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) {
1187 // TODO(scheglov): implement. 1450 // TODO(scheglov): implement.
1188 return typeNeeded ? const DynamicType() : null; 1451 return typeNeeded ? const DynamicType() : null;
1189 } 1452 }
1190 } 1453 }
1191 1454
1192 /// Shadow object for [SymbolLiteral]. 1455 /// Shadow object for [SymbolLiteral].
1193 class KernelSymbolLiteral extends SymbolLiteral implements KernelExpression { 1456 class KernelSymbolLiteral extends SymbolLiteral implements KernelExpression {
1194 KernelSymbolLiteral(String value) : super(value); 1457 KernelSymbolLiteral(String value) : super(value);
1195 1458
1196 @override 1459 @override
1460 void _collectDependencies(KernelDependencyCollector collector) {
1461 // No inference dependencies.
1462 }
1463
1464 @override
1197 DartType _inferExpression( 1465 DartType _inferExpression(
1198 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { 1466 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) {
1199 // TODO(scheglov): implement. 1467 // TODO(scheglov): implement.
1200 return typeNeeded ? const DynamicType() : null; 1468 return typeNeeded ? const DynamicType() : null;
1201 } 1469 }
1202 } 1470 }
1203 1471
1204 /// Shadow object for [ThisExpression]. 1472 /// Shadow object for [ThisExpression].
1205 class KernelThisExpression extends ThisExpression implements KernelExpression { 1473 class KernelThisExpression extends ThisExpression implements KernelExpression {
1206 @override 1474 @override
1475 void _collectDependencies(KernelDependencyCollector collector) {
1476 // TODO(paulberry): figure out the right thing to do here.
1477 throw 'TODO(paulberry)';
1478 }
1479
1480 @override
1207 DartType _inferExpression( 1481 DartType _inferExpression(
1208 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { 1482 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) {
1209 // TODO(scheglov): implement. 1483 // TODO(scheglov): implement.
1210 return typeNeeded ? const DynamicType() : null; 1484 return typeNeeded ? const DynamicType() : null;
1211 } 1485 }
1212 } 1486 }
1213 1487
1214 /// Shadow object for [Throw]. 1488 /// Shadow object for [Throw].
1215 class KernelThrow extends Throw implements KernelExpression { 1489 class KernelThrow extends Throw implements KernelExpression {
1216 KernelThrow(Expression expression) : super(expression); 1490 KernelThrow(Expression expression) : super(expression);
1217 1491
1218 @override 1492 @override
1493 void _collectDependencies(KernelDependencyCollector collector) {
1494 // No inference dependencies.
1495 }
1496
1497 @override
1219 DartType _inferExpression( 1498 DartType _inferExpression(
1220 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { 1499 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) {
1221 inferrer.inferExpression(expression, null, false); 1500 inferrer.inferExpression(expression, null, false);
1222 return typeNeeded ? const BottomType() : null; 1501 return typeNeeded ? const BottomType() : null;
1223 } 1502 }
1224 } 1503 }
1225 1504
1226 /// Concrete implementation of [TypeInferenceEngine] specialized to work with 1505 /// Concrete implementation of [TypeInferenceEngine] specialized to work with
1227 /// kernel objects. 1506 /// kernel objects.
1228 class KernelTypeInferenceEngine extends TypeInferenceEngineImpl { 1507 class KernelTypeInferenceEngine extends TypeInferenceEngineImpl {
(...skipping 29 matching lines...) Expand all
1258 bool fieldHasInitializer(KernelField field) { 1537 bool fieldHasInitializer(KernelField field) {
1259 return field.initializer != null; 1538 return field.initializer != null;
1260 } 1539 }
1261 1540
1262 @override 1541 @override
1263 DartType getFieldDeclaredType(KernelField field) { 1542 DartType getFieldDeclaredType(KernelField field) {
1264 return field._implicitlyTyped ? null : field.type; 1543 return field._implicitlyTyped ? null : field.type;
1265 } 1544 }
1266 1545
1267 @override 1546 @override
1268 List<FieldNode> getFieldDependencies(KernelField field) {
1269 return field._fieldNode?.dependencies;
1270 }
1271
1272 @override
1273 int getFieldOffset(KernelField field) { 1547 int getFieldOffset(KernelField field) {
1274 return field.fileOffset; 1548 return field.fileOffset;
1275 } 1549 }
1276 1550
1277 @override 1551 @override
1278 KernelTypeInferrer getFieldTypeInferrer(KernelField field) { 1552 KernelTypeInferrer getFieldTypeInferrer(KernelField field) {
1279 return field._typeInferrer; 1553 return field._typeInferrer;
1280 } 1554 }
1281 1555
1282 @override 1556 @override
(...skipping 21 matching lines...) Expand all
1304 KernelTypeInferrer._(KernelTypeInferenceEngine engine, String uri, 1578 KernelTypeInferrer._(KernelTypeInferenceEngine engine, String uri,
1305 TypeInferenceListener listener, bool topLevel) 1579 TypeInferenceListener listener, bool topLevel)
1306 : super(engine, uri, listener, topLevel); 1580 : super(engine, uri, listener, topLevel);
1307 1581
1308 @override 1582 @override
1309 Expression getFieldInitializer(KernelField field) { 1583 Expression getFieldInitializer(KernelField field) {
1310 return field.initializer; 1584 return field.initializer;
1311 } 1585 }
1312 1586
1313 @override 1587 @override
1314 FieldNode getFieldNodeForReadTarget(Member readTarget) {
1315 if (readTarget is KernelField) {
1316 return readTarget._fieldNode;
1317 } else {
1318 return null;
1319 }
1320 }
1321
1322 @override
1323 DartType inferExpression( 1588 DartType inferExpression(
1324 Expression expression, DartType typeContext, bool typeNeeded) { 1589 Expression expression, DartType typeContext, bool typeNeeded) {
1325 if (expression is KernelExpression) { 1590 if (expression is KernelExpression) {
1326 // Use polymorphic dispatch on [KernelExpression] to perform whatever kind 1591 // Use polymorphic dispatch on [KernelExpression] to perform whatever kind
1327 // of type inference is correct for this kind of statement. 1592 // of type inference is correct for this kind of statement.
1328 // TODO(paulberry): experiment to see if dynamic dispatch would be better, 1593 // TODO(paulberry): experiment to see if dynamic dispatch would be better,
1329 // so that the type hierarchy will be simpler (which may speed up "is" 1594 // so that the type hierarchy will be simpler (which may speed up "is"
1330 // checks). 1595 // checks).
1331 return expression._inferExpression(this, typeContext, typeNeeded); 1596 return expression._inferExpression(this, typeContext, typeNeeded);
1332 } else { 1597 } else {
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
1377 // everything, this case should no longer be needed. 1642 // everything, this case should no longer be needed.
1378 } 1643 }
1379 } 1644 }
1380 } 1645 }
1381 1646
1382 /// Shadow object for [TypeLiteral]. 1647 /// Shadow object for [TypeLiteral].
1383 class KernelTypeLiteral extends TypeLiteral implements KernelExpression { 1648 class KernelTypeLiteral extends TypeLiteral implements KernelExpression {
1384 KernelTypeLiteral(DartType type) : super(type); 1649 KernelTypeLiteral(DartType type) : super(type);
1385 1650
1386 @override 1651 @override
1652 void _collectDependencies(KernelDependencyCollector collector) {
1653 // No inference dependencies.
1654 }
1655
1656 @override
1387 DartType _inferExpression( 1657 DartType _inferExpression(
1388 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { 1658 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) {
1389 // TODO(scheglov): implement. 1659 // TODO(scheglov): implement.
1390 return typeNeeded ? const DynamicType() : null; 1660 return typeNeeded ? const DynamicType() : null;
1391 } 1661 }
1392 } 1662 }
1393 1663
1394 /// Concrete implementation of [TypePromoter] specialized to work with kernel 1664 /// Concrete implementation of [TypePromoter] specialized to work with kernel
1395 /// objects. 1665 /// objects.
1396 /// 1666 ///
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after
1530 /// Concrete shadow object representing a read from a variable in kernel form. 1800 /// Concrete shadow object representing a read from a variable in kernel form.
1531 class KernelVariableGet extends VariableGet implements KernelExpression { 1801 class KernelVariableGet extends VariableGet implements KernelExpression {
1532 final TypePromotionFact<VariableDeclaration> _fact; 1802 final TypePromotionFact<VariableDeclaration> _fact;
1533 1803
1534 final TypePromotionScope _scope; 1804 final TypePromotionScope _scope;
1535 1805
1536 KernelVariableGet(VariableDeclaration variable, this._fact, this._scope) 1806 KernelVariableGet(VariableDeclaration variable, this._fact, this._scope)
1537 : super(variable); 1807 : super(variable);
1538 1808
1539 @override 1809 @override
1810 void _collectDependencies(KernelDependencyCollector collector) {
1811 // No inference dependencies.
1812 }
1813
1814 @override
1540 DartType _inferExpression( 1815 DartType _inferExpression(
1541 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { 1816 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) {
1542 var variable = this.variable as KernelVariableDeclaration; 1817 var variable = this.variable as KernelVariableDeclaration;
1543 bool mutatedInClosure = variable._mutatedInClosure; 1818 bool mutatedInClosure = variable._mutatedInClosure;
1544 DartType declaredOrInferredType = variable.type; 1819 DartType declaredOrInferredType = variable.type;
1545 typeNeeded = 1820 typeNeeded =
1546 inferrer.listener.variableGetEnter(this, typeContext) || typeNeeded; 1821 inferrer.listener.variableGetEnter(this, typeContext) || typeNeeded;
1547 DartType promotedType = inferrer.typePromoter 1822 DartType promotedType = inferrer.typePromoter
1548 .computePromotedType(_fact, _scope, mutatedInClosure); 1823 .computePromotedType(_fact, _scope, mutatedInClosure);
1549 if (promotedType != null) { 1824 if (promotedType != null) {
1550 inferrer.instrumentation?.record(Uri.parse(inferrer.uri), fileOffset, 1825 inferrer.instrumentation?.record(Uri.parse(inferrer.uri), fileOffset,
1551 'promotedType', new InstrumentationValueForType(promotedType)); 1826 'promotedType', new InstrumentationValueForType(promotedType));
1552 } 1827 }
1553 this.promotedType = promotedType; 1828 this.promotedType = promotedType;
1554 var inferredType = 1829 var inferredType =
1555 typeNeeded ? (promotedType ?? declaredOrInferredType) : null; 1830 typeNeeded ? (promotedType ?? declaredOrInferredType) : null;
1556 inferrer.listener.variableGetExit(this, inferredType); 1831 inferrer.listener.variableGetExit(this, inferredType);
1557 return inferredType; 1832 return inferredType;
1558 } 1833 }
1559 } 1834 }
1560 1835
1561 /// Concrete shadow object representing a write to a variable in kernel form. 1836 /// Concrete shadow object representing a write to a variable in kernel form.
1562 class KernelVariableSet extends VariableSet implements KernelExpression { 1837 class KernelVariableSet extends VariableSet implements KernelExpression {
1563 KernelVariableSet(VariableDeclaration variable, Expression value) 1838 KernelVariableSet(VariableDeclaration variable, Expression value)
1564 : super(variable, value); 1839 : super(variable, value);
1565 1840
1566 @override 1841 @override
1842 void _collectDependencies(KernelDependencyCollector collector) {
1843 // Assignment expressions are not immediately evident expressions.
1844 collector.recordNotImmediatelyEvident(fileOffset);
1845 }
1846
1847 @override
1567 DartType _inferExpression( 1848 DartType _inferExpression(
1568 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { 1849 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) {
1569 var variable = this.variable as KernelVariableDeclaration; 1850 var variable = this.variable as KernelVariableDeclaration;
1570 typeNeeded = 1851 typeNeeded =
1571 inferrer.listener.variableSetEnter(this, typeContext) || typeNeeded; 1852 inferrer.listener.variableSetEnter(this, typeContext) || typeNeeded;
1572 var inferredType = 1853 var inferredType =
1573 inferrer.inferExpression(value, variable.type, typeNeeded); 1854 inferrer.inferExpression(value, variable.type, typeNeeded);
1574 inferrer.listener.variableSetExit(this, inferredType); 1855 inferrer.listener.variableSetExit(this, inferredType);
1575 return inferredType; 1856 return inferredType;
1576 } 1857 }
(...skipping 16 matching lines...) Expand all
1593 closureContext.isAsync 1874 closureContext.isAsync
1594 ? inferrer.coreTypes.streamClass 1875 ? inferrer.coreTypes.streamClass
1595 : inferrer.coreTypes.iterableClass); 1876 : inferrer.coreTypes.iterableClass);
1596 } 1877 }
1597 var inferredType = inferrer.inferExpression( 1878 var inferredType = inferrer.inferExpression(
1598 expression, typeContext, closureContext != null); 1879 expression, typeContext, closureContext != null);
1599 closureContext.handleYield(inferrer, isYieldStar, inferredType); 1880 closureContext.handleYield(inferrer, isYieldStar, inferredType);
1600 inferrer.listener.yieldStatementExit(this); 1881 inferrer.listener.yieldStatementExit(this);
1601 } 1882 }
1602 } 1883 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698