Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(181)

Side by Side Diff: pkg/compiler/lib/src/serialization/json_serializer.dart

Issue 1192103002: Support serialization of the compiler backbone. (Closed) Base URL: https://github.com/dart-lang/sdk.git@master
Patch Set: Created 5 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
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
3 // BSD-style license that can be found in the LICENSE file.
4
5 library dart2js.serialization.json;
6
7 import 'dart:convert';
8 import '../constants/expressions.dart';
9 import '../dart_types.dart';
10 import '../elements/elements.dart';
11 import 'keys.dart';
12 import 'serialization.dart';
13 import 'values.dart';
14
15 /// Serialization encoder for JSON.
16 class JsonSerializationEncoder implements SerializationEncoder {
17 const JsonSerializationEncoder();
18
19 String encode(ObjectValue objectValue) {
20 return new JsonEncoder.withIndent(' ').convert(
21 const JsonObjectEncoder().apply(objectValue));
22 }
23
24 JsonDataObject createDataObject(IntValue id, EnumValue kind) {
25 return new JsonDataObject(id, kind);
26 }
27
28 ObjectSerializer createObjectSerializer(Serializer serializer,
29 JsonDataObject dataObject) {
30 return new MapBasedObjectSerializer(serializer, dataObject.map);
31 }
32 }
33
34 /// Serialiation decoder for JSON.
floitsch 2015/06/26 20:54:04 Serialization
Johnni Winther 2015/07/03 12:13:45 Done.
35 class JsonSerializationDecoder implements SerializationDecoder {
36 const JsonSerializationDecoder();
37
38 decode(String text) => JSON.decode(text);
39
40 List readMainData(Map mainData, Key key) => mainData[key.name];
41
42 readEntry(Map data, key) => data[key.toString()];
43 }
44
45 /// A map based [DataObject].
46 class JsonDataObject implements DataObject {
47 final Value id;
48 final ObjectValue objectValue;
49
50 JsonDataObject(Value id, EnumValue kind)
51 : this.id = id,
52 this.objectValue =
53 new ObjectValue(<Key, Value>{Key.ID: id, Key.KIND: kind});
54
55 Map<Key, Value> get map => objectValue.map;
56 }
57
58 /// An [AbstractSerializer] that stores the values in a [Map].
59 abstract class AbstractMapBasedSerializer<K> implements AbstractSerializer<K> {
60 final Serializer _serializer;
61 final Map<K, Value> _map;
62
63 AbstractMapBasedSerializer(this._serializer, this._map);
64
65 @override
66 ListSerializer createList(K key) {
67 List<Value> list = <Value>[];
68 _map[key] = new ListValue(list);
69 return new ListBasedListSerializer(_serializer, list);
70 }
71
72 @override
73 MapSerializer createMap(K key) {
74 Map<String, Value> map = <String, Value>{};
75 _map[key] = new MapValue(map);
76 return new MapBasedMapSerializer(_serializer, map);
77 }
78
79 @override
80 ObjectSerializer createObject(K key) {
81 Map<Key, Value> map = <Key, Value>{};
82 _map[key] = new ObjectValue(map);
83 return new MapBasedObjectSerializer(_serializer, map);
84 }
85
86 @override
87 void setBool(K key, bool value) {
88 _serializer.setBool(_map, key, value);
89 }
90
91 @override
92 void setConstant(K key, ConstantExpression constant) {
93 _serializer.setConstant(_map, key, constant);
94 }
95
96 @override
97 void setConstants(K key, Iterable<ConstantExpression> constants) {
98 _serializer.setConstants(_map, key, constants);
99 }
100
101 @override
102 void setDouble(K key, double value) {
103 _serializer.setDouble(_map, key, value);
104 }
105
106 @override
107 void setElement(K key, Element element) {
108 _serializer.setElement(_map, key, element);
109 }
110
111 @override
112 void setElements(K key, Iterable<Element> elements) {
113 _serializer.setElements(_map, key, elements);
114 }
115
116 @override
117 void setEnum(K key, value) {
118 _serializer.setEnum(_map, key, value);
119 }
120
121 @override
122 void setInt(K key, int value) {
123 _serializer.setInt(_map, key, value);
124 }
125
126 @override
127 void setInts(K key, List<int> values) {
128 _serializer.setInts(_map, key, values);
129 }
130
131 @override
132 void setString(K key, String value) {
133 _serializer.setString(_map, key, value);
134 }
135
136 @override
137 void setStrings(K key, Iterable<String> values) {
138 _serializer.setStrings(_map, key, values);
139 }
140
141 @override
142 void setType(K key, DartType type) {
143 _serializer.setType(_map, key, type);
144 }
145
146 @override
147 void setTypes(K key, List<DartType> types) {
148 _serializer.setTypes(_map, key, types);
149 }
150
151 @override
152 void setUri(K key, Uri baseUri, Uri uri) {
153 _serializer.setUri(_map, key, baseUri, uri);
154 }
155
156 String toString() => _map.toString();
157 }
158
159 /// An [ObjectSerializer] that stores the values in a [Map].
160 class MapBasedObjectSerializer extends AbstractMapBasedSerializer
161 implements ObjectSerializer {
162 MapBasedObjectSerializer(Serializer serializer, Map<dynamic, Value> map)
163 : super(serializer, map);
164 }
165
166 /// An [MapSerializer] that stores the values in a [Map].
167 class MapBasedMapSerializer extends AbstractMapBasedSerializer<String>
168 implements MapSerializer {
169 MapBasedMapSerializer(Serializer serializer, Map<String, Value> map)
170 : super(serializer, map);
171 }
172
173 /// An [ListSerializer] that stores the values in a [List].
174 class ListBasedListSerializer implements ListSerializer {
175 final Serializer _serializer;
176 final List<Value> _list;
177
178 ListBasedListSerializer(this._serializer, this._list);
179
180 @override
181 MapSerializer createMap() {
182 Map<String, Value> map = {};
183 _list.add(new MapValue(map));
184 return new MapBasedMapSerializer(_serializer, map);
185 }
186
187 @override
188 ObjectSerializer createObject() {
189 Map<Key, Value> map = <Key, Value>{};
190 _list.add(new ObjectValue(map));
191 return new MapBasedObjectSerializer(_serializer, map);
192 }
193 }
194
195 /// Base implementation of [AbstractDeserializer] based on a JSON encoded [Map].
196 abstract class AbstractJsonDeserializer<K> implements AbstractDeserializer<K> {
197 final Deserializer _deserializer;
198 final Map<K, dynamic> _map;
199
200 AbstractJsonDeserializer(this._deserializer, this._map) {
201 assert(_deserializer != null);
202 assert(_map != null);
203 }
204
205 @override
206 bool getBool(K key, {bool isOptional: false, bool defaultValue}) {
207 return _deserializer.getBool(
208 _map, key, isOptional: isOptional, defaultValue: defaultValue);
209 }
210
211 @override
212 ConstantExpression getConstant(K key, {bool isOptional: false}) {
213 return _deserializer.getConstant(_map, key, isOptional: isOptional);
214 }
215
216 @override
217 List<ConstantExpression> getConstants(K key, {bool isOptional: false}) {
218 return _deserializer.getConstants(_map, key, isOptional: isOptional);
219 }
220
221 @override
222 double getDouble(K key, {bool isOptional: false, double defaultValue}) {
223 return _deserializer.getDouble(
224 _map, key, isOptional: isOptional, defaultValue: defaultValue);
225 }
226
227 @override
228 Element getElement(K key, {bool isOptional: false}) {
229 return _deserializer.getElement(_map, key, isOptional: isOptional);
230 }
231
232 @override
233 List<Element> getElements(K key, {bool isOptional: false}) {
234 return _deserializer.getElements(_map, key, isOptional: isOptional);
235 }
236
237 @override
238 getEnum(K key, Iterable enumValues, {bool isOptional: false, defaultValue}) {
239 return _deserializer.getEnum(
240 _map, key, enumValues,
241 isOptional: isOptional, defaultValue: defaultValue);
242 }
243
244 @override
245 int getInt(K key, {bool isOptional: false, int defaultValue}) {
246 return _deserializer.getInt(
247 _map, key, isOptional: isOptional, defaultValue: defaultValue);
248 }
249
250 @override
251 List<int> getInts(K key, {bool isOptional: false}) {
252 return _deserializer.getInts(
253 _map, key, isOptional: isOptional);
254 }
255
256 @override
257 ListDeserializer getList(K key, {bool isOptional: false}) {
258 return _deserializer.getList(_map, key, isOptional: isOptional);
259 }
260
261 @override
262 MapDeserializer getMap(K key, {bool isOptional: false}) {
263 return _deserializer.getMap(_map, key, isOptional: isOptional);
264 }
265
266 @override
267 ObjectDeserializer getObject(K key, {bool isOptional: false}) {
268 return _deserializer.getObject(_map, key, isOptional: isOptional);
269 }
270
271 @override
272 String getString(K key, {bool isOptional: false, String defaultValue}) {
273 return _deserializer.getString(
274 _map, key, isOptional: isOptional, defaultValue: defaultValue);
275 }
276
277 @override
278 List<String> getStrings(K key, {bool isOptional: false}) {
279 return _deserializer.getStrings(_map, key, isOptional: isOptional);
280 }
281
282 @override
283 DartType getType(K key, {bool isOptional: false}) {
284 return _deserializer.getType(_map, key, isOptional: isOptional);
285 }
286
287 @override
288 List<DartType> getTypes(K key, {bool isOptional: false}) {
289 return _deserializer.getTypes(_map, key, isOptional: isOptional);
290 }
291
292 @override
293 Uri getUri(K key, {bool isOptional: false, Uri defaultValue}) {
294 return _deserializer.getUri(
295 _map, key, isOptional: isOptional, defaultValue: defaultValue);
296 }
297 }
298
299 /// [ObjectDeserializer] based on a JSON-encoded [Map].
300 class JsonObjectDeserializer extends AbstractJsonDeserializer<Key>
301 implements ObjectDeserializer {
302 JsonObjectDeserializer(Deserializer deserializer, Map map)
303 : super(deserializer, map);
304
305 @override
306 bool containsKey(Key key) => _map.containsKey(key.name);
307 }
308
309 /// [MapDeserializer] based on a JSON-encoded [Map].
310 class JsonMapDeserializer extends AbstractJsonDeserializer<String>
311 implements MapDeserializer {
312 JsonMapDeserializer(Deserializer deserializer, Map<String, dynamic> map)
313 : super(deserializer, map);
314
315 @override
316 bool containsKey(String key) => _map.containsKey(key);
317
318 @override
319 void forEachKey(f(String key)) {
320 _map.keys.forEach(f);
321 }
322 }
323
324 /// [ListDeserializer] based on a JSON encoded [List].
325 class JsonListDeserializer implements ListDeserializer {
326 final Deserializer _deserializer;
327 final List _list;
328
329 JsonListDeserializer(this._deserializer, this._list);
330
331 @override
332 MapDeserializer getMap(int index) {
333 return new JsonMapDeserializer(_deserializer, _list[index]);
334 }
335
336 @override
337 ObjectDeserializer getObject(int index) {
338 return new JsonObjectDeserializer(_deserializer, _list[index]);
339 }
340
341 @override
342 int get length => _list.length;
343 }
344
345 /// A [ValueVisitor] that computes a JSON object value.
346 class JsonObjectEncoder implements ValueVisitor {
347 const JsonObjectEncoder();
348
349 convert(Value value) => apply(value, this);
350
351 @override
352 apply(Value value, [arg]) => value.accept(this, arg);
353
354 @override
355 bool visitBool(BoolValue value, arg) => value.value;
356
357 @override
358 visitConstant(ConstantValue value, arg) => apply(value.id);
359
360 @override
361 double visitDouble(DoubleValue value, arg) => value.value;
362
363 @override
364 visitElement(ElementValue value, arg) => apply(value.id);
365
366 @override
367 visitEnum(EnumValue value, arg) => value.value.index;
368
369 @override
370 int visitInt(IntValue value, arg) => value.value;
371
372 @override
373 List visitList(ListValue value, arg) => value.values.map(apply).toList();
374
375 @override
376 Map visitMap(MapValue value, arg) {
377 Map<String, dynamic> map = <String, dynamic>{};
378 value.map.forEach((String key, Value value) {
379 map[key] = apply(value);
380 });
381 return map;
382 }
383
384 @override
385 Map visitObject(ObjectValue value, arg) {
386 Map<String, dynamic> map = <String, dynamic>{};
387 value.map.forEach((Key key, Value value) {
388 map[key.name] = apply(value);
389 });
390 return map;
391 }
392
393 @override
394 String visitString(StringValue value, arg) => value.value;
395
396 @override
397 visitType(TypeValue value, arg) => apply(value.id);
398
399 @override
400 visitUri(UriValue value, arg) => '${value.value}';
401 }
402
403 /// [ValueVisitor] that generates a verbose JSON-like output.
404 class PrettyPrintEncoder implements ValueVisitor {
405 StringBuffer buffer;
406
407 String toText(Value value) {
408 buffer = new StringBuffer();
409 apply(value, '');
410 String text = buffer.toString();
411 buffer = null;
412 return text;
413 }
414
415 @override
416 void apply(Value value, String indentation) {
417 value.accept(this, indentation);
418 }
419
420 @override
421 void visitBool(BoolValue value, String indentation) {
422 buffer.write(value.value);
423 }
424
425 @override
426 void visitConstant(ConstantValue value, String indentation) {
427 buffer.write('Constant(${value.id}):${value.constant.getText()}');
428 }
429
430 @override
431 void visitDouble(DoubleValue value, String indentation) {
432 buffer.write(value.value);
433 }
434 @override
435 void visitElement(ElementValue value, String indentation) {
436 buffer.write('Element(${value.id}):${value.element}');
437 }
438
439 @override
440 void visitEnum(EnumValue value, String indentation) {
441 buffer.write(value.value);
442 }
443
444 @override
445 void visitInt(IntValue value, String indentation) {
446 buffer.write(value.value);
447 }
448
449 @override
450 void visitList(ListValue value, String indentation) {
451 if (value.values.isEmpty) {
452 buffer.write('[]');
453 } else {
454 buffer.write('[');
455 bool needsComma = false;
456 String nextIndentation = '${indentation} ';
457 for (Value element in value.values) {
458 if (needsComma) {
459 buffer.write(',');
460 }
461 buffer.write('\n$nextIndentation');
462 apply(element, nextIndentation);
463 needsComma = true;
464 }
465 buffer.write('\n$indentation]');
466 }
467 }
468
469 @override
470 void visitMap(MapValue value, String indentation) {
471 if (value.map.isEmpty) {
472 buffer.write('{}');
473 } else {
474 buffer.write('{');
475 bool needsComma = false;
476 String nextIndentation = '${indentation} ';
477 value.map.forEach((String key, Value subvalue) {
478 if (needsComma) {
479 buffer.write(',');
480 }
481 buffer.write('\n$nextIndentation$key: ');
482 apply(subvalue, nextIndentation);
483 needsComma = true;
484 });
485 buffer.write('\n$indentation}');
486 }
487 }
488
489 @override
490 void visitObject(ObjectValue value, String indentation) {
491 if (value.map.isEmpty) {
492 buffer.write('{}');
493 } else {
494 buffer.write('{');
495 bool needsComma = false;
496 String nextIndentation = '${indentation} ';
497 value.map.forEach((Key key, Value subvalue) {
498 if (needsComma) {
499 buffer.write(',');
500 }
501 buffer.write('\n$nextIndentation$key: ');
502 apply(subvalue, nextIndentation);
503 needsComma = true;
504 });
505 buffer.write('\n$indentation}');
506 }
507 }
508
509 @override
510 void visitString(StringValue value, String indentation) {
511 buffer.write('"${value.value}"');
512 }
513
514 @override
515 void visitType(TypeValue value, String indentation) {
516 buffer.write('Type(${value.id}):${value.type}');
517 }
518
519 @override
520 void visitUri(UriValue value, String indentation) {
521 buffer.write('Uri(${value.value})');
522 }
523 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698