OLD | NEW |
---|---|
1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 /// Converters and codecs for converting between JSON and [Info] classes. | 5 /// Converters and codecs for converting between JSON and [Info] classes. |
6 part of dart2js_info.info; | 6 part of dart2js_info.info; |
7 | 7 |
8 // TODO(sigmund): add unit tests. | 8 // TODO(sigmund): add unit tests. |
9 class JsonToAllInfoConverter extends Converter<Map, AllInfo> { | 9 class JsonToAllInfoConverter extends Converter<Map<String, dynamic>, AllInfo> { |
10 Map<String, Info> registry; | 10 Map<String, Info> registry; |
11 | 11 |
12 AllInfo convert(Map json) { | 12 AllInfo convert(Map<String, dynamic> json) { |
13 registry = <String, Info>{}; | 13 registry = <String, Info>{}; |
14 | 14 |
15 var result = new AllInfo(); | 15 var result = new AllInfo(); |
16 var elements = json['elements']; | 16 var elements = json['elements'] as Map<String, dynamic>; |
17 result.libraries.addAll(elements['library'].values.map(parseLibrary)); | 17 result.libraries.addAll( |
18 result.classes.addAll(elements['class'].values.map(parseClass)); | 18 (elements['library'] as Map<String, Map>).values.map(parseLibrary)); |
Siggi Cherem (dart-lang)
2016/08/10 21:40:28
I believe the way json is parsed that this and the
Harry Terkelsen
2016/08/10 22:18:27
Done.
| |
19 result.functions.addAll(elements['function'].values.map(parseFunction)); | 19 result.classes |
20 result.fields.addAll(elements['field'].values.map(parseField)); | 20 .addAll((elements['class'] as Map<String, Map>).values.map(parseClass)); |
21 result.typedefs.addAll(elements['typedef'].values.map(parseTypedef)); | 21 result.functions.addAll( |
22 (elements['function'] as Map<String, Map>).values.map(parseFunction)); | |
23 result.fields | |
24 .addAll((elements['field'] as Map<String, Map>).values.map(parseField)); | |
25 result.typedefs.addAll( | |
26 (elements['typedef'] as Map<String, Map>).values.map(parseTypedef)); | |
22 | 27 |
23 // TODO(sigmund): remove null check on next breaking version | 28 // TODO(sigmund): remove null check on next breaking version |
24 var constants = elements['constant']; | 29 var constants = elements['constant']; |
25 if (constants != null) { | 30 if (constants != null) { |
26 result.constants.addAll(constants.values.map(parseConstant)); | 31 result.constants |
32 .addAll((constants as Map<String, Map>).values.map(parseConstant)); | |
27 } | 33 } |
28 | 34 |
29 var idMap = {}; | 35 var idMap = <String, Info>{}; |
30 for (var f in result.functions) { | 36 for (var f in result.functions) { |
31 idMap[f.serializedId] = f; | 37 idMap[f.serializedId] = f; |
32 } | 38 } |
33 for (var f in result.fields) { | 39 for (var f in result.fields) { |
34 idMap[f.serializedId] = f; | 40 idMap[f.serializedId] = f; |
35 } | 41 } |
36 | 42 |
37 json['holding'].forEach((k, deps) { | 43 json['holding'].forEach((k, deps) { |
38 var src = idMap[k]; | 44 var src = idMap[k]; |
39 assert(src != null); | 45 assert(src != null); |
40 for (var dep in deps) { | 46 for (var dep in deps) { |
41 var target = idMap[dep['id']]; | 47 var target = idMap[dep['id']]; |
42 assert(target != null); | 48 assert(target != null); |
43 src.uses.add(new DependencyInfo(target, dep['mask'])); | 49 (src as CodeInfo).uses.add(new DependencyInfo(target, dep['mask'])); |
44 } | 50 } |
45 }); | 51 }); |
46 | 52 |
47 json['dependencies']?.forEach((k, deps) { | 53 json['dependencies']?.forEach((String k, List<String> deps) { |
48 result.dependencies[idMap[k]] = deps.map((d) => idMap[d]).toList(); | 54 result.dependencies[idMap[k]] = deps.map((d) => idMap[d]).toList(); |
49 }); | 55 }); |
50 | 56 |
51 result.outputUnits.addAll(json['outputUnits'].map(parseOutputUnit)); | 57 result.outputUnits |
58 .addAll((json['outputUnits'] as List<Map>).map(parseOutputUnit)); | |
52 | 59 |
53 result.program = parseProgram(json['program']); | 60 result.program = parseProgram(json['program']); |
54 // todo: version, etc | 61 // todo: version, etc |
55 return result; | 62 return result; |
56 } | 63 } |
57 | 64 |
58 OutputUnitInfo parseOutputUnit(Map json) { | 65 OutputUnitInfo parseOutputUnit(Map json) { |
59 OutputUnitInfo result = parseId(json['id']); | 66 OutputUnitInfo result = parseId(json['id']); |
60 result | 67 result |
61 ..name = json['name'] | 68 ..name = json['name'] |
62 ..size = json['size']; | 69 ..size = json['size']; |
63 result.imports.addAll(json['imports'] ?? const []); | 70 result.imports.addAll((json['imports'] as List<String>) ?? const []); |
Siggi Cherem (dart-lang)
2016/08/10 21:40:28
same here and below, I think this cast will fail u
Harry Terkelsen
2016/08/10 22:18:28
Done.
| |
64 return result; | 71 return result; |
65 } | 72 } |
66 | 73 |
67 LibraryInfo parseLibrary(Map json) { | 74 LibraryInfo parseLibrary(Map json) { |
68 LibraryInfo result = parseId(json['id']); | 75 LibraryInfo result = parseId(json['id']); |
69 result | 76 result |
70 ..name = json['name'] | 77 ..name = json['name'] |
71 ..uri = Uri.parse(json['canonicalUri']) | 78 ..uri = Uri.parse(json['canonicalUri']) |
72 ..outputUnit = parseId(json['outputUnit']) | 79 ..outputUnit = parseId(json['outputUnit']) |
73 ..size = json['size']; | 80 ..size = json['size']; |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
112 ..name = json['name'] | 119 ..name = json['name'] |
113 ..parent = parseId(json['parent']) | 120 ..parent = parseId(json['parent']) |
114 ..coverageId = json['coverageId'] | 121 ..coverageId = json['coverageId'] |
115 ..outputUnit = parseId(json['outputUnit']) | 122 ..outputUnit = parseId(json['outputUnit']) |
116 ..size = json['size'] | 123 ..size = json['size'] |
117 ..type = json['type'] | 124 ..type = json['type'] |
118 ..inferredType = json['inferredType'] | 125 ..inferredType = json['inferredType'] |
119 ..code = json['code'] | 126 ..code = json['code'] |
120 ..isConst = json['const'] ?? false | 127 ..isConst = json['const'] ?? false |
121 ..initializer = parseId(json['initializer']) | 128 ..initializer = parseId(json['initializer']) |
122 ..closures = json['children'].map(parseId).toList(); | 129 ..closures = (json['children'] as List<String>).map(parseId).toList(); |
123 } | 130 } |
124 | 131 |
125 ConstantInfo parseConstant(Map json) { | 132 ConstantInfo parseConstant(Map json) { |
126 ConstantInfo result = parseId(json['id']); | 133 ConstantInfo result = parseId(json['id']); |
127 return result | 134 return result |
128 ..code = json['code'] | 135 ..code = json['code'] |
129 ..size = json['size']; | 136 ..size = json['size']; |
130 } | 137 } |
131 | 138 |
132 TypedefInfo parseTypedef(Map json) { | 139 TypedefInfo parseTypedef(Map json) { |
(...skipping 13 matching lines...) Expand all Loading... | |
146 FunctionInfo result = parseId(json['id']); | 153 FunctionInfo result = parseId(json['id']); |
147 return result | 154 return result |
148 ..name = json['name'] | 155 ..name = json['name'] |
149 ..parent = parseId(json['parent']) | 156 ..parent = parseId(json['parent']) |
150 ..coverageId = json['coverageId'] | 157 ..coverageId = json['coverageId'] |
151 ..outputUnit = parseId(json['outputUnit']) | 158 ..outputUnit = parseId(json['outputUnit']) |
152 ..size = json['size'] | 159 ..size = json['size'] |
153 ..type = json['type'] | 160 ..type = json['type'] |
154 ..returnType = json['returnType'] | 161 ..returnType = json['returnType'] |
155 ..inferredReturnType = json['inferredReturnType'] | 162 ..inferredReturnType = json['inferredReturnType'] |
156 ..parameters = json['parameters'].map(parseParameter).toList() | 163 ..parameters = |
164 (json['parameters'] as List<Map>).map(parseParameter).toList() | |
157 ..code = json['code'] | 165 ..code = json['code'] |
158 ..sideEffects = json['sideEffects'] | 166 ..sideEffects = json['sideEffects'] |
159 ..modifiers = parseModifiers(json['modifiers']) | 167 ..modifiers = parseModifiers(json['modifiers'] as Map<String, bool>) |
160 ..closures = json['children'].map(parseId).toList() | 168 ..closures = (json['children'] as List<String>).map(parseId).toList() |
161 ..measurements = parseMeasurements(json['measurements']); | 169 ..measurements = parseMeasurements(json['measurements']); |
162 } | 170 } |
163 | 171 |
164 ParameterInfo parseParameter(Map json) => | 172 ParameterInfo parseParameter(Map json) => |
165 new ParameterInfo(json['name'], json['type'], json['declaredType']); | 173 new ParameterInfo(json['name'], json['type'], json['declaredType']); |
166 | 174 |
167 Measurements parseMeasurements(Map json) { | 175 Measurements parseMeasurements(Map json) { |
168 if (json == null) return null; | 176 if (json == null) return null; |
169 var uri = json['sourceFile']; | 177 var uri = json['sourceFile']; |
170 var res = new Measurements(uri == null ? null : Uri.parse(uri)); | 178 var res = new Measurements(uri == null ? null : Uri.parse(uri)); |
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
299 | 307 |
300 Map _visitBasicInfo(BasicInfo info) { | 308 Map _visitBasicInfo(BasicInfo info) { |
301 var res = { | 309 var res = { |
302 'id': info.serializedId, | 310 'id': info.serializedId, |
303 'kind': kindToString(info.kind), | 311 'kind': kindToString(info.kind), |
304 'name': info.name, | 312 'name': info.name, |
305 'size': info.size, | 313 'size': info.size, |
306 }; | 314 }; |
307 // TODO(sigmund): Omit this also when outputUnit.id == 0 (most code is in | 315 // TODO(sigmund): Omit this also when outputUnit.id == 0 (most code is in |
308 // the main output unit by default). | 316 // the main output unit by default). |
309 if (info.outputUnit != null) res['outputUnit'] = | 317 if (info.outputUnit != null) |
Siggi Cherem (dart-lang)
2016/08/10 21:40:28
let's add braces here now that it doesn't fit on a
Harry Terkelsen
2016/08/10 22:18:27
Done.
| |
310 info.outputUnit.serializedId; | 318 res['outputUnit'] = info.outputUnit.serializedId; |
311 if (info.coverageId != null) res['coverageId'] = info.coverageId; | 319 if (info.coverageId != null) res['coverageId'] = info.coverageId; |
312 if (info.parent != null) res['parent'] = info.parent.serializedId; | 320 if (info.parent != null) res['parent'] = info.parent.serializedId; |
313 return res; | 321 return res; |
314 } | 322 } |
315 | 323 |
316 Map visitLibrary(LibraryInfo info) { | 324 Map visitLibrary(LibraryInfo info) { |
317 return _visitBasicInfo(info) | 325 return _visitBasicInfo(info) |
318 ..addAll({ | 326 ..addAll({ |
319 'children': [] | 327 'children': [] |
320 ..addAll(info.topLevelFunctions.map((f) => f.serializedId)) | 328 ..addAll(info.topLevelFunctions.map((f) => f.serializedId)) |
(...skipping 18 matching lines...) Expand all Loading... | |
339 Map visitField(FieldInfo info) { | 347 Map visitField(FieldInfo info) { |
340 var result = _visitBasicInfo(info) | 348 var result = _visitBasicInfo(info) |
341 ..addAll({ | 349 ..addAll({ |
342 'children': info.closures.map((i) => i.serializedId).toList(), | 350 'children': info.closures.map((i) => i.serializedId).toList(), |
343 'inferredType': info.inferredType, | 351 'inferredType': info.inferredType, |
344 'code': info.code, | 352 'code': info.code, |
345 'type': info.type, | 353 'type': info.type, |
346 }); | 354 }); |
347 if (info.isConst) { | 355 if (info.isConst) { |
348 result['const'] = true; | 356 result['const'] = true; |
349 if (info.initializer != null) result['initializer'] = | 357 if (info.initializer != null) |
Siggi Cherem (dart-lang)
2016/08/10 21:40:28
same here
Harry Terkelsen
2016/08/10 22:18:28
Done.
| |
350 info.initializer.serializedId; | 358 result['initializer'] = info.initializer.serializedId; |
351 } | 359 } |
352 return result; | 360 return result; |
353 } | 361 } |
354 | 362 |
355 Map visitConstant(ConstantInfo info) => | 363 Map visitConstant(ConstantInfo info) => |
356 _visitBasicInfo(info)..addAll({'code': info.code}); | 364 _visitBasicInfo(info)..addAll({'code': info.code}); |
357 | 365 |
358 // TODO(sigmund): exclude false values (requires bumping the format version): | 366 // TODO(sigmund): exclude false values (requires bumping the format version): |
359 // var res = <String, bool>{}; | 367 // var res = <String, bool>{}; |
360 // if (isStatic) res['static'] = true; | 368 // if (isStatic) res['static'] = true; |
361 // if (isConst) res['const'] = true; | 369 // if (isConst) res['const'] = true; |
362 // if (isFactory) res['factory'] = true; | 370 // if (isFactory) res['factory'] = true; |
363 // if (isExternal) res['external'] = true; | 371 // if (isExternal) res['external'] = true; |
364 // return res; | 372 // return res; |
365 Map _visitFunctionModifiers(FunctionModifiers mods) => { | 373 Map _visitFunctionModifiers(FunctionModifiers mods) => { |
366 'static': mods.isStatic, | 374 'static': mods.isStatic, |
367 'const': mods.isConst, | 375 'const': mods.isConst, |
368 'factory': mods.isFactory, | 376 'factory': mods.isFactory, |
369 'external': mods.isExternal, | 377 'external': mods.isExternal, |
370 }; | 378 }; |
371 | 379 |
372 Map _visitParameterInfo(ParameterInfo info) => | 380 Map _visitParameterInfo(ParameterInfo info) => |
373 {'name': info.name, 'type': info.type, 'declaredType': info.declaredType}; | 381 {'name': info.name, 'type': info.type, 'declaredType': info.declaredType}; |
374 | 382 |
375 String _visitMetric(Metric metric) => metric.name; | 383 String _visitMetric(Metric metric) => metric.name; |
376 | 384 |
377 Map _visitMeasurements(Measurements measurements) { | 385 Map _visitMeasurements(Measurements measurements) { |
Siggi Cherem (dart-lang)
2016/08/10 21:40:28
FYI - I deleted the measurements code in d2js, so
Harry Terkelsen
2016/08/10 22:18:28
Acknowledged.
| |
378 if (measurements == null) return null; | 386 if (measurements == null) return null; |
379 var jsonEntries = <String, List<Map>>{}; | 387 var jsonEntries = <String, List<int>>{}; |
380 measurements.entries.forEach((metric, values) { | 388 measurements.entries.forEach((metric, values) { |
381 jsonEntries[_visitMetric(metric)] = | 389 jsonEntries[_visitMetric(metric)] = |
382 values.expand((e) => [e.begin, e.end]).toList(); | 390 values.expand((e) => [e.begin, e.end]).toList(); |
383 }); | 391 }); |
384 var json = {'entries': jsonEntries}; | 392 var json = <String, dynamic>{'entries': jsonEntries}; |
385 // TODO(sigmund): encode uri as an offset of the URIs available in the parts | 393 // TODO(sigmund): encode uri as an offset of the URIs available in the parts |
386 // of the library info. | 394 // of the library info. |
387 if (measurements.uri != null) json['sourceFile'] = '${measurements.uri}'; | 395 if (measurements.uri != null) json['sourceFile'] = '${measurements.uri}'; |
388 if (measurements.counters[Metric.functions] != null) { | 396 if (measurements.counters[Metric.functions] != null) { |
389 json[_visitMetric(Metric.functions)] = | 397 json[_visitMetric(Metric.functions)] = |
390 measurements.counters[Metric.functions]; | 398 measurements.counters[Metric.functions]; |
391 } | 399 } |
392 if (measurements.counters[Metric.reachableFunctions] != null) { | 400 if (measurements.counters[Metric.reachableFunctions] != null) { |
393 json[_visitMetric(Metric.reachableFunctions)] = | 401 json[_visitMetric(Metric.reachableFunctions)] = |
394 measurements.counters[Metric.reachableFunctions]; | 402 measurements.counters[Metric.reachableFunctions]; |
(...skipping 23 matching lines...) Expand all Loading... | |
418 visitTypedef(TypedefInfo info) => _visitBasicInfo(info)..['type'] = info.type; | 426 visitTypedef(TypedefInfo info) => _visitBasicInfo(info)..['type'] = info.type; |
419 | 427 |
420 visitOutput(OutputUnitInfo info) => | 428 visitOutput(OutputUnitInfo info) => |
421 _visitBasicInfo(info)..['imports'] = info.imports; | 429 _visitBasicInfo(info)..['imports'] = info.imports; |
422 } | 430 } |
423 | 431 |
424 class AllInfoJsonCodec extends Codec<AllInfo, Map> { | 432 class AllInfoJsonCodec extends Codec<AllInfo, Map> { |
425 final Converter<AllInfo, Map> encoder = new AllInfoToJsonConverter(); | 433 final Converter<AllInfo, Map> encoder = new AllInfoToJsonConverter(); |
426 final Converter<Map, AllInfo> decoder = new JsonToAllInfoConverter(); | 434 final Converter<Map, AllInfo> decoder = new JsonToAllInfoConverter(); |
427 } | 435 } |
OLD | NEW |