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.md file. | 3 // BSD-style license that can be found in the LICENSE.md file. |
4 | 4 |
5 import 'package:front_end/src/base/instrumentation.dart'; | 5 import 'package:front_end/src/base/instrumentation.dart'; |
6 import 'package:front_end/src/fasta/kernel/kernel_shadow_ast.dart'; | 6 import 'package:front_end/src/fasta/kernel/kernel_shadow_ast.dart'; |
7 import 'package:front_end/src/fasta/type_inference/type_inference_engine.dart'; | 7 import 'package:front_end/src/fasta/type_inference/type_inference_engine.dart'; |
8 import 'package:front_end/src/fasta/type_inference/type_inference_listener.dart'
; | 8 import 'package:front_end/src/fasta/type_inference/type_inference_listener.dart'
; |
9 import 'package:front_end/src/fasta/type_inference/type_promotion.dart'; | 9 import 'package:front_end/src/fasta/type_inference/type_promotion.dart'; |
10 import 'package:front_end/src/fasta/type_inference/type_schema.dart'; | 10 import 'package:front_end/src/fasta/type_inference/type_schema.dart'; |
(...skipping 335 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
346 | 346 |
347 // Attempt to match `K` as a function type compatible with the closure (that | 347 // Attempt to match `K` as a function type compatible with the closure (that |
348 // is, one having n type parameters and a compatible set of formal | 348 // is, one having n type parameters and a compatible set of formal |
349 // parameters). If there is a successful match, let `<S0, ..., Sn>` be the | 349 // parameters). If there is a successful match, let `<S0, ..., Sn>` be the |
350 // set of matched type parameters and `(Q0, ..., Qm)` be the set of matched | 350 // set of matched type parameters and `(Q0, ..., Qm)` be the set of matched |
351 // formal parameter types, and let `N` be the return type. | 351 // formal parameter types, and let `N` be the return type. |
352 Substitution substitution; | 352 Substitution substitution; |
353 List<DartType> formalTypesFromContext = | 353 List<DartType> formalTypesFromContext = |
354 new List<DartType>.filled(formals.length, null); | 354 new List<DartType>.filled(formals.length, null); |
355 DartType returnContext; | 355 DartType returnContext; |
356 if (typeContext is FunctionType) { | 356 if (strongMode && typeContext is FunctionType) { |
357 for (int i = 0; i < formals.length; i++) { | 357 for (int i = 0; i < formals.length; i++) { |
358 if (i < function.positionalParameters.length) { | 358 if (i < function.positionalParameters.length) { |
359 formalTypesFromContext[i] = | 359 formalTypesFromContext[i] = |
360 _getPositionalParameterType(typeContext, i); | 360 _getPositionalParameterType(typeContext, i); |
361 } else { | 361 } else { |
362 formalTypesFromContext[i] = | 362 formalTypesFromContext[i] = |
363 _getNamedParameterType(typeContext, formals[i].name); | 363 _getNamedParameterType(typeContext, formals[i].name); |
364 } | 364 } |
365 } | 365 } |
366 returnContext = typeContext.returnType; | 366 returnContext = typeContext.returnType; |
(...skipping 18 matching lines...) Expand all Loading... |
385 substitution = Substitution.empty; | 385 substitution = Substitution.empty; |
386 } | 386 } |
387 | 387 |
388 // Define `Ri` as follows: if `Pi` is not `_`, let `Ri` be `Pi`. | 388 // Define `Ri` as follows: if `Pi` is not `_`, let `Ri` be `Pi`. |
389 // Otherwise, if `Qi` is not `_`, let `Ri` be the greatest closure of | 389 // Otherwise, if `Qi` is not `_`, let `Ri` be the greatest closure of |
390 // `Qi[T/S]` with respect to `?`. Otherwise, let `Ri` be `dynamic`. | 390 // `Qi[T/S]` with respect to `?`. Otherwise, let `Ri` be `dynamic`. |
391 for (int i = 0; i < formals.length; i++) { | 391 for (int i = 0; i < formals.length; i++) { |
392 KernelVariableDeclaration formal = formals[i]; | 392 KernelVariableDeclaration formal = formals[i]; |
393 if (KernelVariableDeclaration.isImplicitlyTyped(formal)) { | 393 if (KernelVariableDeclaration.isImplicitlyTyped(formal)) { |
394 if (formalTypesFromContext[i] != null) { | 394 if (formalTypesFromContext[i] != null) { |
395 formal.type = greatestClosure(coreTypes, | 395 var inferredType = greatestClosure(coreTypes, |
396 substitution.substituteType(formalTypesFromContext[i])); | 396 substitution.substituteType(formalTypesFromContext[i])); |
| 397 instrumentation?.record(Uri.parse(uri), formal.fileOffset, 'type', |
| 398 new InstrumentationValueForType(inferredType)); |
| 399 formal.type = inferredType; |
397 } | 400 } |
398 } | 401 } |
399 } | 402 } |
400 | 403 |
401 // Let `N’` be `N[T/S]`, adjusted accordingly if the closure is declared | 404 // Let `N’` be `N[T/S]`, adjusted accordingly if the closure is declared |
402 // with `async`, `async*`, or `sync*`. | 405 // with `async`, `async*`, or `sync*`. |
403 if (returnContext != null) { | 406 if (returnContext != null) { |
404 returnContext = substitution.substituteType(returnContext); | 407 returnContext = substitution.substituteType(returnContext); |
405 } | 408 } |
406 if (isGenerator) { | 409 if (isGenerator) { |
(...skipping 480 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
887 /// statement returning the given [type]. | 890 /// statement returning the given [type]. |
888 void updateInferredReturnType(TypeInferrerImpl inferrer, DartType type) { | 891 void updateInferredReturnType(TypeInferrerImpl inferrer, DartType type) { |
889 if (_inferredReturnType == null) { | 892 if (_inferredReturnType == null) { |
890 _inferredReturnType = type; | 893 _inferredReturnType = type; |
891 } else { | 894 } else { |
892 _inferredReturnType = inferrer.typeSchemaEnvironment | 895 _inferredReturnType = inferrer.typeSchemaEnvironment |
893 .getLeastUpperBound(_inferredReturnType, type); | 896 .getLeastUpperBound(_inferredReturnType, type); |
894 } | 897 } |
895 } | 898 } |
896 } | 899 } |
OLD | NEW |