Support malformed types

Adds a simple serialization of malformed types.

R=het@google.com

Review URL: https://codereview.chromium.org/2099703002 .
This commit is contained in:
Johnni Winther 2016-06-27 10:10:21 +02:00
parent a4a21f529a
commit 1bafa91055
3 changed files with 24 additions and 4 deletions

View file

@ -8,6 +8,7 @@ import '../common.dart';
import '../constants/constructors.dart';
import '../constants/expressions.dart';
import '../dart_types.dart';
import '../diagnostics/messages.dart';
import '../elements/elements.dart';
import '../elements/modelx.dart' show ErroneousElementX;
import 'constant_serialization.dart';
@ -213,8 +214,8 @@ class ErrorSerializer implements ElementSerializer {
encoder.setEnum(Key.MESSAGE_KIND, element.messageKind);
if (element.messageArguments.isNotEmpty) {
MapEncoder mapEncoder = encoder.createMap(Key.ARGUMENTS);
element.messageArguments.forEach((String key, String value) {
mapEncoder.setString(key, value);
element.messageArguments.forEach((String key, var value) {
mapEncoder.setString(key, Message.convertToString(value));
});
}
}

View file

@ -35,7 +35,9 @@ class TypeSerializer extends DartTypeVisitor<dynamic, ObjectEncoder> {
encoder.setTypes(Key.NAMED_PARAMETER_TYPES, type.namedParameterTypes);
}
void visitMalformedType(MalformedType type, ObjectEncoder encoder) {}
void visitMalformedType(MalformedType type, ObjectEncoder encoder) {
encoder.setElement(Key.ELEMENT, type.element);
}
void visitInterfaceType(InterfaceType type, ObjectEncoder encoder) {
encoder.setElement(Key.ELEMENT, type.element);
@ -79,8 +81,11 @@ class TypeDeserializer {
return new TypedefType(decoder.getElement(Key.ELEMENT),
decoder.getTypes(Key.TYPE_ARGUMENTS, isOptional: true));
case TypeKind.STATEMENT:
case TypeKind.MALFORMED_TYPE:
throw new UnsupportedError("Unexpected type kind '${typeKind}.");
case TypeKind.MALFORMED_TYPE:
// TODO(johnniwinther): Do we need the 'userProvidedBadType' or maybe
// just a toString of it?
return new MalformedType(decoder.getElement(Key.ELEMENT), null);
case TypeKind.DYNAMIC:
return const DynamicType();
case TypeKind.VOID:

View file

@ -400,6 +400,20 @@ class A {
noSuchMethod(_) => null;
m();
}
''',
}),
const Test('Malformed types', const {
'main.dart': '''
import 'a.dart';
main() {
m();
}
''',
}, preserializedSourceFiles: const {
'a.dart': '''
Unresolved m() {}
''',
}),
];