Index: pkg/front_end/lib/src/fasta/type_inference/type_inference_engine.dart |
diff --git a/pkg/front_end/lib/src/fasta/type_inference/type_inference_engine.dart b/pkg/front_end/lib/src/fasta/type_inference/type_inference_engine.dart |
index 55cf1bd0e2b6a9d6521d9e7280b65f7cf41c0042..7d0f1c99fc13569c190baf5acf0bbfdf91af224a 100644 |
--- a/pkg/front_end/lib/src/fasta/type_inference/type_inference_engine.dart |
+++ b/pkg/front_end/lib/src/fasta/type_inference/type_inference_engine.dart |
@@ -4,6 +4,7 @@ |
import 'package:front_end/src/base/instrumentation.dart'; |
import 'package:front_end/src/dependency_walker.dart' as dependencyWalker; |
+import 'package:front_end/src/fasta/kernel/kernel_shadow_ast.dart'; |
import 'package:front_end/src/fasta/type_inference/type_inference_listener.dart'; |
import 'package:front_end/src/fasta/type_inference/type_inferrer.dart'; |
import 'package:front_end/src/fasta/type_inference/type_schema_environment.dart'; |
@@ -17,12 +18,12 @@ import 'package:kernel/core_types.dart'; |
/// TODO(paulberry): see if it's possible to make this class more lightweight |
/// by changing the API so that the walker is passed to computeDependencies(). |
/// (This should allow us to drop the _typeInferenceEngine field). |
-class FieldNode<F> extends dependencyWalker.Node<FieldNode<F>> { |
+class FieldNode extends dependencyWalker.Node<FieldNode> { |
final TypeInferenceEngineImpl _typeInferenceEngine; |
- final F _field; |
+ final KernelField _field; |
- final dependencies = <FieldNode<F>>[]; |
+ final dependencies = <FieldNode>[]; |
FieldNode(this._typeInferenceEngine, this._field); |
@@ -30,7 +31,7 @@ class FieldNode<F> extends dependencyWalker.Node<FieldNode<F>> { |
bool get isEvaluated => _typeInferenceEngine.isFieldInferred(_field); |
@override |
- List<FieldNode<F>> computeDependencies() { |
+ List<FieldNode> computeDependencies() { |
return dependencies; |
} |
} |
@@ -38,30 +39,22 @@ class FieldNode<F> extends dependencyWalker.Node<FieldNode<F>> { |
/// Keeps track of the global state for the type inference that occurs outside |
/// of method bodies and initalizers. |
/// |
-/// This class abstracts away the representation of the underlying AST using |
-/// generic parameters. TODO(paulberry): would it make more sense to abstract |
-/// away the representation of types as well? |
-/// |
-/// Derived classes should set F to the class they use to represent field |
-/// declarations. |
-/// |
/// This class describes the interface for use by clients of type inference |
/// (e.g. DietListener). Derived classes should derive from |
/// [TypeInferenceEngineImpl]. |
-abstract class TypeInferenceEngine<F> { |
+abstract class TypeInferenceEngine { |
ClassHierarchy get classHierarchy; |
CoreTypes get coreTypes; |
/// Creates a type inferrer for use inside of a method body declared in a file |
/// with the given [uri]. |
- TypeInferrer<dynamic, dynamic, dynamic, F> createLocalTypeInferrer( |
- Uri uri, TypeInferenceListener listener); |
+ TypeInferrer createLocalTypeInferrer(Uri uri, TypeInferenceListener listener); |
/// Creates a [TypeInferrer] object which is ready to perform type inference |
/// on the given [field]. |
- TypeInferrer<dynamic, dynamic, dynamic, F> createTopLevelTypeInferrer( |
- F field, TypeInferenceListener listener); |
+ TypeInferrer createTopLevelTypeInferrer( |
+ KernelField field, TypeInferenceListener listener); |
/// Performs the second phase of top level initializer inference, which is to |
/// visit all fields and top level variables that were passed to [recordField] |
@@ -70,14 +63,14 @@ abstract class TypeInferenceEngine<F> { |
/// Gets the list of top level type inference dependencies of the given |
/// [field]. |
- List<FieldNode<F>> getFieldDependencies(F field); |
+ List<FieldNode> getFieldDependencies(KernelField field); |
/// Gets ready to do top level type inference for the program having the given |
/// [hierarchy], using the given [coreTypes]. |
void prepareTopLevel(CoreTypes coreTypes, ClassHierarchy hierarchy); |
/// Records that the given [field] will need top level type inference. |
- void recordField(F field); |
+ void recordField(KernelField field); |
} |
/// Derived class containing generic implementations of |
@@ -86,12 +79,12 @@ abstract class TypeInferenceEngine<F> { |
/// This class contains as much of the implementation of type inference as |
/// possible without knowing the identity of the type parameter. It defers to |
/// abstract methods for everything else. |
-abstract class TypeInferenceEngineImpl<F> extends TypeInferenceEngine<F> { |
+abstract class TypeInferenceEngineImpl extends TypeInferenceEngine { |
final Instrumentation instrumentation; |
final bool strongMode; |
- final fieldNodes = <FieldNode<F>>[]; |
+ final fieldNodes = <FieldNode>[]; |
@override |
CoreTypes coreTypes; |
@@ -104,40 +97,40 @@ abstract class TypeInferenceEngineImpl<F> extends TypeInferenceEngine<F> { |
TypeInferenceEngineImpl(this.instrumentation, this.strongMode); |
/// Clears the initializer of [field]. |
- void clearFieldInitializer(F field); |
+ void clearFieldInitializer(KernelField field); |
/// Creates a [FieldNode] to track dependencies of the given [field]. |
- FieldNode<F> createFieldNode(F field); |
+ FieldNode createFieldNode(KernelField field); |
/// Queries whether the given [field] has an initializer. |
- bool fieldHasInitializer(F field); |
+ bool fieldHasInitializer(KernelField field); |
@override |
void finishTopLevel() { |
for (var fieldNode in fieldNodes) { |
if (fieldNode.isEvaluated) continue; |
- new _FieldWalker<F>().walk(fieldNode); |
+ new _FieldWalker().walk(fieldNode); |
} |
} |
/// Gets the declared type of the given [field], or `null` if the type is |
/// implicit. |
- DartType getFieldDeclaredType(F field); |
+ DartType getFieldDeclaredType(KernelField field); |
/// Gets the character offset of the declaration of [field] within its |
/// compilation unit. |
- int getFieldOffset(F field); |
+ int getFieldOffset(KernelField field); |
/// Retrieve the [TypeInferrer] for the given [field], which was created by |
/// a previous call to [createTopLevelTypeInferrer]. |
- TypeInferrerImpl<dynamic, dynamic, dynamic, F> getFieldTypeInferrer(F field); |
+ TypeInferrerImpl getFieldTypeInferrer(KernelField field); |
/// Gets the URI of the compilation unit the [field] is declared in. |
/// TODO(paulberry): can we remove this? |
- String getFieldUri(F field); |
+ String getFieldUri(KernelField field); |
/// Performs type inference on the given [field]. |
- void inferField(F field) { |
+ void inferField(KernelField field) { |
if (fieldHasInitializer(field)) { |
var typeInferrer = getFieldTypeInferrer(field); |
var type = getFieldDeclaredType(field); |
@@ -162,7 +155,7 @@ abstract class TypeInferenceEngineImpl<F> extends TypeInferenceEngine<F> { |
/// Makes a note that the given [field] is part of a circularity, so its type |
/// can't be inferred. |
- void inferFieldCircular(F field) { |
+ void inferFieldCircular(KernelField field) { |
// TODO(paulberry): report the appropriate error. |
if (getFieldDeclaredType(field) == null) { |
var uri = getFieldTypeInferrer(field).uri; |
@@ -173,7 +166,7 @@ abstract class TypeInferenceEngineImpl<F> extends TypeInferenceEngine<F> { |
} |
/// Determines if top level type inference has been completed for [field]. |
- bool isFieldInferred(F field); |
+ bool isFieldInferred(KernelField field); |
@override |
void prepareTopLevel(CoreTypes coreTypes, ClassHierarchy hierarchy) { |
@@ -184,26 +177,26 @@ abstract class TypeInferenceEngineImpl<F> extends TypeInferenceEngine<F> { |
} |
@override |
- void recordField(F field) { |
+ void recordField(KernelField field) { |
fieldNodes.add(createFieldNode(field)); |
} |
/// Stores [inferredType] as the inferred type of [field]. |
- void setFieldInferredType(F field, DartType inferredType); |
+ void setFieldInferredType(KernelField field, DartType inferredType); |
} |
/// Subtype of [dependencyWalker.DependencyWalker] which is specialized to |
/// perform top level type inference. |
-class _FieldWalker<F> extends dependencyWalker.DependencyWalker<FieldNode<F>> { |
+class _FieldWalker extends dependencyWalker.DependencyWalker<FieldNode> { |
_FieldWalker(); |
@override |
- void evaluate(FieldNode<F> f) { |
+ void evaluate(FieldNode f) { |
f._typeInferenceEngine.inferField(f._field); |
} |
@override |
- void evaluateScc(List<FieldNode<F>> scc) { |
+ void evaluateScc(List<FieldNode> scc) { |
for (var f in scc) { |
f._typeInferenceEngine.inferFieldCircular(f._field); |
} |