Index: pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart |
diff --git a/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart b/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..e5f6a8bee5838edcffa88690ebd4413afc42cf6d |
--- /dev/null |
+++ b/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart |
@@ -0,0 +1,51 @@ |
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file |
+// for details. All rights reserved. Use of this source code is governed by a |
+// BSD-style license that can be found in the LICENSE.md file. |
+ |
+import 'package:kernel/ast.dart'; |
ahe
2017/04/18 15:49:59
May want to use show on this import to be explicit
Paul Berry
2017/04/18 16:33:17
Done.
|
+import 'package:kernel/class_hierarchy.dart'; |
+import 'package:kernel/core_types.dart'; |
+ |
+/// Abstract implementation of type inference which is independent of the |
+/// underlying AST representation. |
ahe
2017/04/18 15:49:59
But still using DartType from kernel?
Paul Berry
2017/04/18 16:33:17
Yes, for now at least. I don't know if this will
|
+/// |
+/// Derived classes should set S, E, V, and F to the class they use to represent |
+/// statements, expressions, variable declarations, and field declarations, |
+/// respectively. |
+abstract class TypeInferrer<S, E, V, F> { |
+ final CoreTypes coreTypes; |
+ |
+ final ClassHierarchy classHierarchy; |
+ |
+ /// The URI of the code for which type inference is currently being |
+ /// performed--this is used for testing. |
+ Uri uri; |
+ |
+ TypeInferrer(this.coreTypes, this.classHierarchy); |
+ |
+ /// Performs type inference on a method with the given method [body]. |
+ /// |
+ /// [uri] is the URI of the file the method is contained in--this is used for |
+ /// testing. |
+ void inferBody(S body, Uri uri) { |
+ this.uri = uri; |
+ inferStatement(body); |
+ } |
+ |
+ /// Performs type inference on the given [expression]. |
+ /// |
+ /// [typeContext] is the expected type of the expression, based on surrounding |
+ /// code. [typeNeeded] indicates whether it is necessary to compute the |
+ /// actual type of the expression. If [typeNeeded] is `true`, the actual type |
+ /// of the expression is returned; otherwise `null` is returned. |
+ /// |
+ /// Derived classes should override this method with logic that dispatches on |
+ /// the expression type and calls the appropriate specialized "infer" method. |
+ DartType inferExpression(E expression, DartType typeContext, bool typeNeeded); |
+ |
+ /// Performs type inference on the given [statement]. |
+ /// |
+ /// Derived classes should override this method with logic that dispatches on |
+ /// the statement type and calls the appropriate specialized "infer" method. |
+ void inferStatement(S statement); |
+} |