Index: lib/json_info_codec.dart |
diff --git a/lib/json_info_codec.dart b/lib/json_info_codec.dart |
index 5176ce3038bf8f863d00ffe5a4897a6f91aaf1d7..8382bb0c2128ee98dbe91ffeb2e1970e7f9664c2 100644 |
--- a/lib/json_info_codec.dart |
+++ b/lib/json_info_codec.dart |
@@ -7,10 +7,10 @@ part of dart2js_info.info; |
// TODO(sigmund): add unit tests. |
class JsonToAllInfoConverter extends Converter<Map<String, dynamic>, AllInfo> { |
- Map<String, Info> registry; |
+ Map<String, Info> registry = <String, Info>{}; |
AllInfo convert(Map<String, dynamic> json) { |
- registry = <String, Info>{}; |
+ registry.clear(); |
var result = new AllInfo(); |
var elements = json['elements']; |
@@ -19,15 +19,13 @@ class JsonToAllInfoConverter extends Converter<Map<String, dynamic>, AllInfo> { |
result.classes.addAll((elements['class'] as Map).values.map(parseClass)); |
result.functions |
.addAll((elements['function'] as Map).values.map(parseFunction)); |
+ result.closures |
+ .addAll((elements['closure'] as Map).values.map(parseClosure)); |
result.fields.addAll((elements['field'] as Map).values.map(parseField)); |
result.typedefs |
.addAll((elements['typedef'] as Map).values.map(parseTypedef)); |
- |
- // TODO(sigmund): remove null check on next breaking version |
- var constants = elements['constant']; |
- if (constants != null) { |
- result.constants.addAll((constants as Map).values.map(parseConstant)); |
- } |
+ result.constants |
+ .addAll((elements['constant'] as Map).values.map(parseConstant)); |
var idMap = <String, Info>{}; |
for (var f in result.functions) { |
@@ -208,11 +206,23 @@ class JsonToAllInfoConverter extends Converter<Map<String, dynamic>, AllInfo> { |
isExternal: json['external'] == true); |
} |
+ ClosureInfo parseClosure(Map json) { |
+ ClosureInfo result = parseId(json['id']); |
+ return result |
+ ..name = json['name'] |
+ ..parent = parseId(json['parent']) |
+ ..outputUnit = parseId(json['outputUnit']) |
+ ..size = json['size'] |
+ ..function = parseId(json['function']); |
+ } |
+ |
Info parseId(String serializedId) => registry.putIfAbsent(serializedId, () { |
if (serializedId == null) { |
return null; |
} else if (serializedId.startsWith('function/')) { |
return new FunctionInfo._(serializedId); |
+ } else if (serializedId.startsWith('closure/')) { |
+ return new ClosureInfo._(serializedId); |
} else if (serializedId.startsWith('library/')) { |
return new LibraryInfo._(serializedId); |
} else if (serializedId.startsWith('class/')) { |
@@ -249,13 +259,15 @@ class AllInfoToJsonConverter extends Converter<AllInfo, Map> |
var jsonTypedefs = _visitList(info.typedefs); |
var jsonFields = _visitList(info.fields); |
var jsonConstants = _visitList(info.constants); |
+ var jsonClosures = _visitList(info.closures); |
return { |
'library': jsonLibraries, |
'class': jsonClasses, |
'function': jsonFunctions, |
'typedef': jsonTypedefs, |
'field': jsonFields, |
- 'constant': jsonConstants |
+ 'constant': jsonConstants, |
+ 'closure': jsonClosures, |
}; |
} |
@@ -433,6 +445,11 @@ class AllInfoToJsonConverter extends Converter<AllInfo, Map> |
}); |
} |
+ Map visitClosure(ClosureInfo info) { |
+ return _visitBasicInfo(info) |
+ ..addAll({'function': info.function.serializedId}); |
+ } |
+ |
visitTypedef(TypedefInfo info) => _visitBasicInfo(info)..['type'] = info.type; |
visitOutput(OutputUnitInfo info) => |