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/errors.dart' show internalError; | 6 import 'package:front_end/src/fasta/errors.dart' show internalError; |
7 import 'package:front_end/src/fasta/kernel/kernel_shadow_ast.dart'; | 7 import 'package:front_end/src/fasta/kernel/kernel_shadow_ast.dart'; |
8 import 'package:front_end/src/fasta/names.dart' show callName; | 8 import 'package:front_end/src/fasta/names.dart' show callName; |
9 import 'package:front_end/src/fasta/type_inference/type_inference_engine.dart'; | 9 import 'package:front_end/src/fasta/type_inference/type_inference_engine.dart'; |
10 import 'package:front_end/src/fasta/type_inference/type_inference_listener.dart'
; | 10 import 'package:front_end/src/fasta/type_inference/type_inference_listener.dart'
; |
(...skipping 20 matching lines...) Expand all Loading... |
31 Name, | 31 Name, |
32 Procedure, | 32 Procedure, |
33 ProcedureKind, | 33 ProcedureKind, |
34 PropertyGet, | 34 PropertyGet, |
35 PropertySet, | 35 PropertySet, |
36 Statement, | 36 Statement, |
37 SuperMethodInvocation, | 37 SuperMethodInvocation, |
38 SuperPropertyGet, | 38 SuperPropertyGet, |
39 SuperPropertySet, | 39 SuperPropertySet, |
40 TypeParameterType, | 40 TypeParameterType, |
| 41 VariableDeclaration, |
41 VoidType; | 42 VoidType; |
42 import 'package:kernel/class_hierarchy.dart'; | 43 import 'package:kernel/class_hierarchy.dart'; |
43 import 'package:kernel/core_types.dart'; | 44 import 'package:kernel/core_types.dart'; |
44 import 'package:kernel/type_algebra.dart'; | 45 import 'package:kernel/type_algebra.dart'; |
45 | 46 |
46 /// Keeps track of information about the innermost function or closure being | 47 /// Keeps track of information about the innermost function or closure being |
47 /// inferred. | 48 /// inferred. |
48 class ClosureContext { | 49 class ClosureContext { |
49 final bool isAsync; | 50 final bool isAsync; |
50 | 51 |
(...skipping 577 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
628 } | 629 } |
629 | 630 |
630 /// Performs the core type inference algorithm for property gets (this handles | 631 /// Performs the core type inference algorithm for property gets (this handles |
631 /// both null-aware and non-null-aware property gets). | 632 /// both null-aware and non-null-aware property gets). |
632 DartType inferPropertyGet( | 633 DartType inferPropertyGet( |
633 Expression expression, | 634 Expression expression, |
634 Expression receiver, | 635 Expression receiver, |
635 int fileOffset, | 636 int fileOffset, |
636 PropertyGet desugaredGet, | 637 PropertyGet desugaredGet, |
637 DartType typeContext, | 638 DartType typeContext, |
638 bool typeNeeded) { | 639 bool typeNeeded, |
| 640 {VariableDeclaration receiverVariable}) { |
639 typeNeeded = | 641 typeNeeded = |
640 listener.propertyGetEnter(expression, typeContext) || typeNeeded; | 642 listener.propertyGetEnter(expression, typeContext) || typeNeeded; |
641 // First infer the receiver so we can look up the getter that was invoked. | 643 // First infer the receiver so we can look up the getter that was invoked. |
642 var receiverType = inferExpression(receiver, null, true); | 644 var receiverType = inferExpression(receiver, null, true); |
| 645 receiverVariable?.type = receiverType; |
643 Member interfaceMember = | 646 Member interfaceMember = |
644 findInterfaceMember(receiverType, desugaredGet.name, fileOffset); | 647 findInterfaceMember(receiverType, desugaredGet.name, fileOffset); |
645 if (isTopLevel && | 648 if (isTopLevel && |
646 ((interfaceMember is Procedure && | 649 ((interfaceMember is Procedure && |
647 interfaceMember.kind == ProcedureKind.Getter) || | 650 interfaceMember.kind == ProcedureKind.Getter) || |
648 interfaceMember is Field)) { | 651 interfaceMember is Field)) { |
649 if (TypeInferenceEngineImpl.fullTopLevelInference) { | 652 if (TypeInferenceEngineImpl.fullTopLevelInference) { |
650 if (interfaceMember is KernelField) { | 653 if (interfaceMember is KernelField) { |
651 var accessorNode = KernelMember.getAccessorNode(interfaceMember); | 654 var accessorNode = KernelMember.getAccessorNode(interfaceMember); |
652 if (accessorNode != null) { | 655 if (accessorNode != null) { |
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
740 void _forEachArgument( | 743 void _forEachArgument( |
741 Arguments arguments, void callback(String name, Expression expression)) { | 744 Arguments arguments, void callback(String name, Expression expression)) { |
742 for (var expression in arguments.positional) { | 745 for (var expression in arguments.positional) { |
743 callback(null, expression); | 746 callback(null, expression); |
744 } | 747 } |
745 for (var namedExpression in arguments.named) { | 748 for (var namedExpression in arguments.named) { |
746 callback(namedExpression.name, namedExpression.value); | 749 callback(namedExpression.name, namedExpression.value); |
747 } | 750 } |
748 } | 751 } |
749 } | 752 } |
OLD | NEW |