Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 /// This file declares a "shadow hierarchy" of concrete classes which extend | 5 /// This file declares a "shadow hierarchy" of concrete classes which extend |
| 6 /// the kernel class hierarchy, adding methods and fields needed by the | 6 /// the kernel class hierarchy, adding methods and fields needed by the |
| 7 /// BodyBuilder. | 7 /// BodyBuilder. |
| 8 /// | 8 /// |
| 9 /// Instances of these classes may be created using the factory methods in | 9 /// Instances of these classes may be created using the factory methods in |
| 10 /// `ast_factory.dart`. | 10 /// `ast_factory.dart`. |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 } |
| OLD | NEW |