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/dependency_walker.dart' as dependencyWalker; | 6 import 'package:front_end/src/dependency_walker.dart' as dependencyWalker; |
7 import 'package:front_end/src/fasta/errors.dart'; | 7 import 'package:front_end/src/fasta/errors.dart'; |
8 import 'package:front_end/src/fasta/kernel/kernel_shadow_ast.dart'; | 8 import 'package:front_end/src/fasta/kernel/kernel_shadow_ast.dart'; |
9 import 'package:front_end/src/fasta/type_inference/type_inference_listener.dart'
; | 9 import 'package:front_end/src/fasta/type_inference/type_inference_listener.dart'
; |
10 import 'package:front_end/src/fasta/type_inference/type_inferrer.dart'; | 10 import 'package:front_end/src/fasta/type_inference/type_inferrer.dart'; |
(...skipping 21 matching lines...) Expand all Loading... |
32 | 32 |
33 /// If [state] is [FieldState.Inferring], and type inference for this field | 33 /// If [state] is [FieldState.Inferring], and type inference for this field |
34 /// is waiting on type inference of some other field, the field that is being | 34 /// is waiting on type inference of some other field, the field that is being |
35 /// waited on. | 35 /// waited on. |
36 /// | 36 /// |
37 /// Otherwise `null`. | 37 /// Otherwise `null`. |
38 FieldNode currentDependency; | 38 FieldNode currentDependency; |
39 | 39 |
40 final overrides = <Member>[]; | 40 final overrides = <Member>[]; |
41 | 41 |
| 42 final crossOverrides = <Member>[]; |
| 43 |
42 FieldNode(this._typeInferenceEngine, this.member); | 44 FieldNode(this._typeInferenceEngine, this.member); |
43 | 45 |
| 46 get candidateOverrides => overrides.isNotEmpty ? overrides : crossOverrides; |
| 47 |
44 @override | 48 @override |
45 bool get isEvaluated => state == FieldState.Inferred; | 49 bool get isEvaluated => state == FieldState.Inferred; |
46 | 50 |
47 @override | 51 @override |
48 List<FieldNode> computeDependencies() { | 52 List<FieldNode> computeDependencies() { |
49 return _typeInferenceEngine.computeFieldDependencies(this); | 53 return _typeInferenceEngine.computeFieldDependencies(this); |
50 } | 54 } |
51 | 55 |
52 @override | 56 @override |
53 String toString() => member.toString(); | 57 String toString() => member.toString(); |
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
151 ClassHierarchy classHierarchy; | 155 ClassHierarchy classHierarchy; |
152 | 156 |
153 TypeSchemaEnvironment typeSchemaEnvironment; | 157 TypeSchemaEnvironment typeSchemaEnvironment; |
154 | 158 |
155 TypeInferenceEngineImpl(this.instrumentation, this.strongMode); | 159 TypeInferenceEngineImpl(this.instrumentation, this.strongMode); |
156 | 160 |
157 /// Computes type inference dependencies for the given [field]. | 161 /// Computes type inference dependencies for the given [field]. |
158 List<FieldNode> computeFieldDependencies(FieldNode fieldNode) { | 162 List<FieldNode> computeFieldDependencies(FieldNode fieldNode) { |
159 // If the field's type is going to be determined by inheritance, then its | 163 // If the field's type is going to be determined by inheritance, then its |
160 // dependencies are determined by inheritance too. | 164 // dependencies are determined by inheritance too. |
161 if (fieldNode.overrides.isNotEmpty) { | 165 var candidateOverrides = fieldNode.candidateOverrides; |
| 166 if (candidateOverrides.isNotEmpty) { |
162 var dependencies = <FieldNode>[]; | 167 var dependencies = <FieldNode>[]; |
163 for (var override in fieldNode.overrides) { | 168 for (var override in candidateOverrides) { |
164 // TODO(paulberry): support dependencies on getters/setters too. | |
165 var dep = KernelMember.getFieldNode(override); | 169 var dep = KernelMember.getFieldNode(override); |
166 if (dep != null) dependencies.add(dep); | 170 if (dep != null) dependencies.add(dep); |
167 } | 171 } |
168 fieldNode.isImmediatelyEvident = true; | 172 fieldNode.isImmediatelyEvident = true; |
169 return dependencies; | 173 return dependencies; |
170 } | 174 } |
171 | 175 |
172 // Otherwise its dependencies are based on the initializer expression. | 176 // Otherwise its dependencies are based on the initializer expression. |
173 var member = fieldNode.member; | 177 var member = fieldNode.member; |
174 if (member is KernelField) { | 178 if (member is KernelField) { |
(...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
328 initializingFormals.add(formal); | 332 initializingFormals.add(formal); |
329 } | 333 } |
330 | 334 |
331 @override | 335 @override |
332 void recordMember(KernelMember member) { | 336 void recordMember(KernelMember member) { |
333 fieldNodes.add(createFieldNode(member)); | 337 fieldNodes.add(createFieldNode(member)); |
334 } | 338 } |
335 | 339 |
336 DartType tryInferFieldByInheritance(FieldNode fieldNode) { | 340 DartType tryInferFieldByInheritance(FieldNode fieldNode) { |
337 DartType inferredType; | 341 DartType inferredType; |
338 for (var override in fieldNode.overrides) { | 342 for (var override in fieldNode.candidateOverrides) { |
339 var nextInferredType = _computeOverriddenFieldType(override, fieldNode); | 343 var nextInferredType = _computeOverriddenFieldType(override, fieldNode); |
340 if (inferredType == null) { | 344 if (inferredType == null) { |
341 inferredType = nextInferredType; | 345 inferredType = nextInferredType; |
342 } else if (inferredType != nextInferredType) { | 346 } else if (inferredType != nextInferredType) { |
343 // Overrides don't have matching types. | 347 // Overrides don't have matching types. |
344 // TODO(paulberry): report an error | 348 // TODO(paulberry): report an error |
345 return const DynamicType(); | 349 return const DynamicType(); |
346 } | 350 } |
347 } | 351 } |
348 return inferredType; | 352 return inferredType; |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
405 } | 409 } |
406 | 410 |
407 @override | 411 @override |
408 void evaluateScc(List<FieldNode> scc) { | 412 void evaluateScc(List<FieldNode> scc) { |
409 // Mark every field as part of a circularity. | 413 // Mark every field as part of a circularity. |
410 for (var f in scc) { | 414 for (var f in scc) { |
411 f._typeInferenceEngine.inferFieldCircular(f); | 415 f._typeInferenceEngine.inferFieldCircular(f); |
412 } | 416 } |
413 } | 417 } |
414 } | 418 } |
OLD | NEW |