| Index: pkg/compiler/lib/src/ssa/kernel_ast_adapter.dart
|
| diff --git a/pkg/compiler/lib/src/ssa/kernel_ast_adapter.dart b/pkg/compiler/lib/src/ssa/kernel_ast_adapter.dart
|
| index a865f1c6bd6394767f5ed38b483119306bc2bc27..10b785569074dc8827c81cd09a4238c136f770f6 100644
|
| --- a/pkg/compiler/lib/src/ssa/kernel_ast_adapter.dart
|
| +++ b/pkg/compiler/lib/src/ssa/kernel_ast_adapter.dart
|
| @@ -424,13 +424,16 @@ class KernelAstAdapter {
|
| ir.Procedure get checkSubtypeOfRuntimeType =>
|
| kernel.functions[_backend.helpers.checkSubtypeOfRuntimeType];
|
|
|
| - ir.Procedure get assertHelper =>
|
| - kernel.functions[_backend.helpers.assertHelper];
|
| + ir.Procedure get throwTypeError =>
|
| + kernel.functions[_backend.helpers.throwTypeError];
|
|
|
| TypeMask get throwTypeErrorType =>
|
| TypeMaskFactory.inferredReturnTypeForElement(
|
| _backend.helpers.throwTypeError, _globalInferenceResults);
|
|
|
| + ir.Procedure get assertHelper =>
|
| + kernel.functions[_backend.helpers.assertHelper];
|
| +
|
| TypeMask get assertHelperReturnType =>
|
| TypeMaskFactory.inferredReturnTypeForElement(
|
| _backend.helpers.assertHelper, _globalInferenceResults);
|
| @@ -507,7 +510,12 @@ class KernelAstAdapter {
|
| }
|
|
|
| ResolutionDartType getDartType(ir.DartType type) {
|
| - return type.accept(_typeConverter);
|
| + return _typeConverter.convert(type);
|
| + }
|
| +
|
| + ResolutionDartType getDartTypeIfValid(ir.DartType type) {
|
| + if (type is ir.InvalidType) return null;
|
| + return _typeConverter.convert(type);
|
| }
|
|
|
| List<ResolutionDartType> getDartTypes(List<ir.DartType> types) {
|
| @@ -530,6 +538,7 @@ class KernelAstAdapter {
|
| }
|
|
|
| ResolutionDartType getFunctionReturnType(ir.FunctionNode node) {
|
| + if (node.returnType is ir.InvalidType) return const ResolutionDynamicType();
|
| return getDartType(node.returnType);
|
| }
|
|
|
| @@ -780,12 +789,23 @@ enum ForeignKind {
|
| /// Visitor that converts kernel dart types into [ResolutionDartType].
|
| class DartTypeConverter extends ir.DartTypeVisitor<ResolutionDartType> {
|
| final KernelAstAdapter astAdapter;
|
| + bool topLevel = true;
|
|
|
| DartTypeConverter(this.astAdapter);
|
|
|
| - ResolutionDartType visitType(ir.DartType type) => type.accept(this);
|
| + ResolutionDartType convert(ir.DartType type) {
|
| + topLevel = true;
|
| + return type.accept(this);
|
| + }
|
| +
|
| + /// Visit a inner type.
|
| + ResolutionDartType visitType(ir.DartType type) {
|
| + topLevel = false;
|
| + return type.accept(this);
|
| + }
|
|
|
| List<ResolutionDartType> visitTypes(List<ir.DartType> types) {
|
| + topLevel = false;
|
| return new List.generate(
|
| types.length, (int index) => types[index].accept(this));
|
| }
|
| @@ -844,7 +864,12 @@ class DartTypeConverter extends ir.DartTypeVisitor<ResolutionDartType> {
|
|
|
| @override
|
| ResolutionDartType visitInvalidType(ir.InvalidType node) {
|
| - throw new UnimplementedError("Invalid types not currently supported");
|
| + if (topLevel) {
|
| + throw new UnimplementedError(
|
| + "Outermost invalid types not currently supported");
|
| + }
|
| + // Nested invalid types are treated as `dynamic`.
|
| + return const ResolutionDynamicType();
|
| }
|
| }
|
|
|
|
|