Index: tests/compiler/dart2js/serialization_helper.dart |
diff --git a/tests/compiler/dart2js/serialization_helper.dart b/tests/compiler/dart2js/serialization_helper.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..a8f95a6bcc9ccd319242a81df19491f8209b3d21 |
--- /dev/null |
+++ b/tests/compiler/dart2js/serialization_helper.dart |
@@ -0,0 +1,128 @@ |
+// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file |
+// for details. All rights reserved. Use of this source code is governed by a |
+// BSD-style license that can be found in the LICENSE file. |
+ |
+library dart2js.serialization_helper; |
+ |
+import 'dart:async'; |
+import 'package:async_helper/async_helper.dart'; |
+import 'package:expect/expect.dart'; |
+import 'package:compiler/src/commandline_options.dart'; |
+import 'package:compiler/src/common/backend_api.dart'; |
+import 'package:compiler/src/common/names.dart'; |
+import 'package:compiler/src/common/resolution.dart'; |
+import 'package:compiler/src/compiler.dart'; |
+import 'package:compiler/src/elements/elements.dart'; |
+import 'package:compiler/src/filenames.dart'; |
+import 'package:compiler/src/serialization/element_serialization.dart'; |
+import 'package:compiler/src/serialization/impact_serialization.dart'; |
+import 'package:compiler/src/serialization/json_serializer.dart'; |
+import 'package:compiler/src/serialization/serialization.dart'; |
+import 'package:compiler/src/serialization/task.dart'; |
+import 'package:compiler/src/universe/world_impact.dart'; |
+import 'memory_compiler.dart'; |
+ |
+ |
+Future<String> serializeDartCore() async { |
+ Compiler compiler = compilerFor( |
+ options: [Flags.analyzeAll]); |
+ compiler.serialization.supportSerialization = true; |
+ await compiler.run(Uris.dart_core); |
+ return serialize(compiler, compiler.libraryLoader.libraries) |
+ .toText(const JsonSerializationEncoder()); |
+} |
+ |
+Serializer serialize(Compiler compiler, Iterable<LibraryElement> libraries) { |
+ assert(compiler.serialization.supportSerialization); |
+ |
+ Serializer serializer = new Serializer(); |
+ serializer.plugins.add(compiler.backend.serialization.serializer); |
+ serializer.plugins.add(new ResolutionImpactSerializer(compiler.resolution)); |
+ |
+ for (LibraryElement library in libraries) { |
+ serializer.serialize(library); |
+ } |
+ return serializer; |
+} |
+ |
+void deserialize(Compiler compiler, String serializedData) { |
+ Deserializer deserializer = new Deserializer.fromText( |
+ new DeserializationContext(), |
+ serializedData, |
+ const JsonSerializationDecoder()); |
+ deserializer.plugins.add(compiler.backend.serialization.deserializer); |
+ compiler.serialization.deserializer = |
+ new _DeserializerSystem( |
+ deserializer, |
+ compiler.backend.impactTransformer); |
+} |
+ |
+ |
+const String WORLD_IMPACT_TAG = 'worldImpact'; |
+ |
+class ResolutionImpactSerializer extends SerializerPlugin { |
+ final Resolution resolution; |
+ |
+ ResolutionImpactSerializer(this.resolution); |
+ |
+ @override |
+ void onElement(Element element, ObjectEncoder createEncoder(String tag)) { |
+ if (resolution.hasBeenResolved(element)) { |
+ ResolutionImpact impact = resolution.getResolutionImpact(element); |
+ ObjectEncoder encoder = createEncoder(WORLD_IMPACT_TAG); |
+ new ImpactSerializer(encoder).serialize(impact); |
+ } |
+ } |
+} |
+ |
+class ResolutionImpactDeserializer extends DeserializerPlugin { |
+ Map<Element, ResolutionImpact> impactMap = <Element, ResolutionImpact>{}; |
+ |
+ @override |
+ void onElement(Element element, ObjectDecoder getDecoder(String tag)) { |
+ ObjectDecoder decoder = getDecoder(WORLD_IMPACT_TAG); |
+ if (decoder != null) { |
+ impactMap[element] = ImpactDeserializer.deserializeImpact(decoder); |
+ } |
+ } |
+} |
+ |
+class _DeserializerSystem extends DeserializerSystem { |
+ final Deserializer _deserializer; |
+ final List<LibraryElement> deserializedLibraries = <LibraryElement>[]; |
+ final ResolutionImpactDeserializer _resolutionImpactDeserializer = |
+ new ResolutionImpactDeserializer(); |
+ final ImpactTransformer _impactTransformer; |
+ |
+ _DeserializerSystem(this._deserializer, this._impactTransformer) { |
+ _deserializer.plugins.add(_resolutionImpactDeserializer); |
+ } |
+ |
+ LibraryElement readLibrary(Uri resolvedUri) { |
+ LibraryElement library = _deserializer.lookupLibrary(resolvedUri); |
+ if (library != null) { |
+ deserializedLibraries.add(library); |
+ } |
+ return library; |
+ } |
+ |
+ ResolutionImpact getResolutionImpact(Element element) { |
+ return _resolutionImpactDeserializer.impactMap[element]; |
+ } |
+ |
+ @override |
+ WorldImpact computeWorldImpact(Element element) { |
+ ResolutionImpact resolutionImpact = getResolutionImpact(element); |
+ if (resolutionImpact == null) { |
+ print('No impact found for $element (${element.library})'); |
+ return const WorldImpact(); |
+ } else { |
+ return _impactTransformer.transformResolutionImpact(resolutionImpact); |
+ } |
+ } |
+ |
+ @override |
+ bool isDeserialized(Element element) { |
+ return deserializedLibraries.contains(element.library); |
+ } |
+} |