Chromium Code Reviews| 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; |
| +} |