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

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

Issue 2856383003: Begin implementing subtype matching for type inference. (Closed)
Patch Set: Change test library URI 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_schema.dart
diff --git a/pkg/front_end/lib/src/fasta/type_inference/type_schema.dart b/pkg/front_end/lib/src/fasta/type_inference/type_schema.dart
index 5268f62d08a7fe41c855b3e687cfe6c78730b768..8342a2be9388e9794a3e65aeef280761407291a8 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/type_schema.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/type_schema.dart
@@ -6,6 +6,9 @@ import 'package:kernel/ast.dart';
import 'package:kernel/import_table.dart';
import 'package:kernel/text/ast_to_text.dart';
+/// Determines whether a type schema contains `?` somewhere inside it.
+bool isKnown(DartType schema) => schema.accept(new _IsKnownVisitor());
Jennifer Messerly 2017/05/04 18:06:01 since the visitor is stateless, would it be worth
Paul Berry 2017/05/04 19:56:07 Actually what I'd really love to do is change this
+
/// Converts a [DartType] to a string, representing the unknown type as `?`.
String typeSchemaToString(DartType schema) {
StringBuffer buffer = new StringBuffer();
@@ -73,3 +76,40 @@ class UnknownType extends DartType {
@override
visitChildren(Visitor v) {}
}
+
+/// Visitor that computes [isKnown].
+class _IsKnownVisitor extends TypeSchemaVisitor<bool> {
+ @override
+ bool defaultDartType(DartType node) => true;
+
+ @override
+ bool visitFunctionType(FunctionType node) {
+ if (!node.returnType.accept(this)) return false;
+ for (var parameterType in node.positionalParameters) {
+ if (!parameterType.accept(this)) return false;
+ }
+ for (var namedParameterType in node.namedParameters) {
+ if (!namedParameterType.type.accept(this)) return false;
+ }
+ return true;
+ }
+
+ @override
+ bool visitInterfaceType(InterfaceType node) {
+ for (var typeArgument in node.typeArguments) {
+ if (!typeArgument.accept(this)) return false;
+ }
+ return true;
+ }
+
+ @override
+ bool visitTypedefType(TypedefType node) {
+ for (var typeArgument in node.typeArguments) {
+ if (!typeArgument.accept(this)) return false;
+ }
+ return true;
+ }
+
+ @override
+ bool visitUnknownType(UnknownType node) => false;
+}

Powered by Google App Engine
This is Rietveld 408576698