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

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

Issue 2885873002: Remove generic parameters from type inference classes. (Closed)
Patch Set: Created 3 years, 7 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 side-by-side diff with in-line comments
Download patch
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);
}

Powered by Google App Engine
This is Rietveld 408576698