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; |
+} |