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

Side by Side Diff: pkg/front_end/lib/src/fasta/type_inference/type_inference_engine.dart

Issue 2946733003: Fix type inference of getters that "override" setters and vice versa. (Closed)
Patch Set: Address code review comments Created 3 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE.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
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
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
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
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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698