Chromium Code Reviews| 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..7b495496463d1db2c6ef2080783eff48e7c93c76 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 getDartTypeInvalidNull(ir.DartType type) { |
|
Siggi Cherem (dart-lang)
2017/01/13 16:36:14
nit: rename, some ideas:
- getDartTypeIfValid (I
sra1
2017/01/13 18:53:11
Done.
|
| + 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(); |
| } |
| } |