Index: pkg/compiler/lib/src/serialization/system.dart |
diff --git a/tests/compiler/dart2js/serialization/helper.dart b/pkg/compiler/lib/src/serialization/system.dart |
similarity index 56% |
copy from tests/compiler/dart2js/serialization/helper.dart |
copy to pkg/compiler/lib/src/serialization/system.dart |
index 8a4aba5f16698f4b3acbebf02121f37f6222fa2b..8db5c4bede2fa7c1552477b06f50802af58745e6 100644 |
--- a/tests/compiler/dart2js/serialization/helper.dart |
+++ b/pkg/compiler/lib/src/serialization/system.dart |
@@ -2,177 +2,31 @@ |
// 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; |
+library dart2js.serialization_system; |
import 'dart:async'; |
-import 'dart:io'; |
- |
-import 'package:compiler/src/commandline_options.dart'; |
-import 'package:compiler/src/common.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/io/source_file.dart'; |
-import 'package:compiler/src/scanner/scanner.dart'; |
-import 'package:compiler/src/script.dart'; |
-import 'package:compiler/src/serialization/impact_serialization.dart'; |
-import 'package:compiler/src/serialization/json_serializer.dart'; |
-import 'package:compiler/src/serialization/modelz.dart'; |
-import 'package:compiler/src/serialization/resolved_ast_serialization.dart'; |
-import 'package:compiler/src/serialization/serialization.dart'; |
-import 'package:compiler/src/serialization/task.dart'; |
-import 'package:compiler/src/tokens/token.dart'; |
-import 'package:compiler/src/universe/call_structure.dart'; |
-import 'package:compiler/src/universe/world_impact.dart'; |
-import 'package:compiler/src/universe/use.dart'; |
- |
-import '../memory_compiler.dart'; |
- |
-class Arguments { |
- final String filename; |
- final int index; |
- final bool loadSerializedData; |
- final bool saveSerializedData; |
- final String serializedDataFileName; |
- final bool verbose; |
- |
- const Arguments({ |
- this.filename, |
- this.index, |
- this.loadSerializedData: false, |
- this.saveSerializedData: false, |
- this.serializedDataFileName: 'out.data', |
- this.verbose: false}); |
- |
- factory Arguments.from(List<String> arguments) { |
- String filename; |
- int index; |
- for (String arg in arguments) { |
- if (!arg.startsWith('-')) { |
- index = int.parse(arg); |
- if (index == null) { |
- filename = arg; |
- } |
- } |
- } |
- bool verbose = arguments.contains('-v'); |
- bool loadSerializedData = arguments.contains('-l'); |
- bool saveSerializedData = arguments.contains('-s'); |
- return new Arguments( |
- filename: filename, |
- index: index, |
- verbose: verbose, |
- loadSerializedData: loadSerializedData, |
- saveSerializedData: saveSerializedData); |
- } |
-} |
- |
- |
-Future<String> serializeDartCore( |
- {Arguments arguments: const Arguments()}) async { |
- print('------------------------------------------------------------------'); |
- print('serialize dart:core'); |
- print('------------------------------------------------------------------'); |
- String serializedData; |
- if (arguments.loadSerializedData) { |
- File file = new File(arguments.serializedDataFileName); |
- if (file.existsSync()) { |
- print('Loading data from $file'); |
- serializedData = file.readAsStringSync(); |
- } |
- } |
- if (serializedData == null) { |
- Compiler compiler = compilerFor( |
- options: [Flags.analyzeAll]); |
- compiler.serialization.supportSerialization = true; |
- await compiler.run(Uris.dart_core); |
- serializedData = serialize( |
- compiler, |
- compiler.libraryLoader.libraries) |
- .toText(const JsonSerializationEncoder()); |
- if (arguments.saveSerializedData) { |
- File file = new File(arguments.serializedDataFileName); |
- print('Saving data to $file'); |
- file.writeAsStringSync(serializedData); |
- } |
- } |
- return serializedData; |
-} |
- |
-Serializer serialize( |
- Compiler compiler, |
- Iterable<LibraryElement> libraries) { |
- assert(compiler.serialization.supportSerialization); |
- |
- Serializer serializer = new Serializer(); |
- SerializerPlugin backendSerializer = |
- compiler.backend.serialization.serializer; |
- serializer.plugins.add(backendSerializer); |
- serializer.plugins.add(new ResolutionImpactSerializer( |
- compiler.resolution, backendSerializer)); |
- serializer.plugins.add(new ResolvedAstSerializerPlugin( |
- compiler.resolution, backendSerializer)); |
- |
- 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( |
- compiler, |
- deserializer, |
- compiler.backend.impactTransformer); |
-} |
- |
- |
-const String WORLD_IMPACT_TAG = 'worldImpact'; |
- |
-class ResolutionImpactSerializer extends SerializerPlugin { |
- final Resolution resolution; |
- final SerializerPlugin nativeDataSerializer; |
- |
- ResolutionImpactSerializer(this.resolution, this.nativeDataSerializer); |
- |
- @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(element, encoder, nativeDataSerializer) |
- .serialize(impact); |
- } |
- } |
-} |
- |
-class ResolutionImpactDeserializer extends DeserializerPlugin { |
- Map<Element, ResolutionImpact> impactMap = <Element, ResolutionImpact>{}; |
- final DeserializerPlugin nativeDataDeserializer; |
- |
- ResolutionImpactDeserializer(this.nativeDataDeserializer); |
- |
- @override |
- void onElement(Element element, ObjectDecoder getDecoder(String tag)) { |
- ObjectDecoder decoder = getDecoder(WORLD_IMPACT_TAG); |
- if (decoder != null) { |
- impactMap[element] = |
- ImpactDeserializer.deserializeImpact( |
- element, decoder, nativeDataDeserializer); |
- } |
- } |
-} |
- |
-class _DeserializerSystem extends DeserializerSystem { |
+import '../commandline_options.dart'; |
+import '../common.dart'; |
+import '../common/backend_api.dart'; |
+import '../common/names.dart'; |
+import '../common/resolution.dart'; |
+import '../compiler.dart'; |
+import '../elements/elements.dart'; |
+import '../io/source_file.dart'; |
+import '../scanner/scanner.dart'; |
+import '../script.dart'; |
+import '../serialization/impact_serialization.dart'; |
+import '../tokens/token.dart'; |
+import '../universe/call_structure.dart'; |
+import '../universe/world_impact.dart'; |
+import '../universe/use.dart'; |
+import 'json_serializer.dart'; |
+import 'modelz.dart'; |
+import 'resolved_ast_serialization.dart'; |
+import 'serialization.dart'; |
+import 'task.dart'; |
+ |
+class DeserializerSystemImpl extends DeserializerSystem { |
final Compiler _compiler; |
final Deserializer _deserializer; |
final List<LibraryElement> deserializedLibraries = <LibraryElement>[]; |
@@ -180,9 +34,7 @@ class _DeserializerSystem extends DeserializerSystem { |
final ResolvedAstDeserializerPlugin _resolvedAstDeserializer; |
final ImpactTransformer _impactTransformer; |
- factory _DeserializerSystem( |
- Compiler compiler, |
- Deserializer deserializer, |
+ factory DeserializerSystemImpl(Compiler compiler, Deserializer deserializer, |
ImpactTransformer impactTransformer) { |
List<DeserializerPlugin> plugins = <DeserializerPlugin>[]; |
DeserializerPlugin backendDeserializer = |
@@ -191,11 +43,11 @@ class _DeserializerSystem extends DeserializerSystem { |
ResolutionImpactDeserializer resolutionImpactDeserializer = |
new ResolutionImpactDeserializer(backendDeserializer); |
deserializer.plugins.add(resolutionImpactDeserializer); |
- ResolvedAstDeserializerPlugin resolvedAstDeserializer |
- = new ResolvedAstDeserializerPlugin( |
+ ResolvedAstDeserializerPlugin resolvedAstDeserializer = |
+ new ResolvedAstDeserializerPlugin( |
compiler.parsingContext, backendDeserializer); |
deserializer.plugins.add(resolvedAstDeserializer); |
- return new _DeserializerSystem._( |
+ return new DeserializerSystemImpl._( |
compiler, |
deserializer, |
impactTransformer, |
@@ -203,14 +55,13 @@ class _DeserializerSystem extends DeserializerSystem { |
resolvedAstDeserializer); |
} |
- _DeserializerSystem._( |
+ DeserializerSystemImpl._( |
this._compiler, |
this._deserializer, |
this._impactTransformer, |
this._resolutionImpactDeserializer, |
this._resolvedAstDeserializer); |
- |
@override |
Future<LibraryElement> readLibrary(Uri resolvedUri) { |
LibraryElement library = _deserializer.lookupLibrary(resolvedUri); |
@@ -219,7 +70,8 @@ class _DeserializerSystem extends DeserializerSystem { |
return Future.forEach(library.compilationUnits, |
(CompilationUnitElement compilationUnit) { |
ScriptZ script = compilationUnit.script; |
- return _compiler.readScript(script.readableUri) |
+ return _compiler |
+ .readScript(script.readableUri) |
.then((Script newScript) { |
script.file = newScript.file; |
_resolvedAstDeserializer.sourceFiles[script.resourceUri] = |
@@ -244,7 +96,7 @@ class _DeserializerSystem extends DeserializerSystem { |
@override |
bool hasResolutionImpact(Element element) { |
if (element.isConstructor && |
- element.enclosingClass.isUnnamedMixinApplication) { |
+ element.enclosingClass.isUnnamedMixinApplication) { |
return true; |
} |
return _resolutionImpactDeserializer.impactMap.containsKey(element); |
@@ -254,18 +106,19 @@ class _DeserializerSystem extends DeserializerSystem { |
ResolutionImpact getResolutionImpact(Element element) { |
if (element.isConstructor && |
element.enclosingClass.isUnnamedMixinApplication) { |
- ClassElement superclass = element.enclosingClass.superclass; |
+ ClassElement superclass = element.enclosingClass.superclass; |
ConstructorElement superclassConstructor = |
superclass.lookupConstructor(element.name); |
assert(invariant(element, superclassConstructor != null, |
message: "Superclass constructor '${element.name}' called from " |
- "${element} not found in ${superclass}.")); |
+ "${element} not found in ${superclass}.")); |
// TODO(johnniwinther): Compute callStructure. Currently not used. |
CallStructure callStructure; |
return _resolutionImpactDeserializer.impactMap.putIfAbsent(element, () { |
- return new DeserializedResolutionImpact( |
- staticUses: <StaticUse>[new StaticUse.superConstructorInvoke( |
- superclassConstructor, callStructure)]); |
+ return new DeserializedResolutionImpact(staticUses: <StaticUse>[ |
+ new StaticUse.superConstructorInvoke( |
+ superclassConstructor, callStructure) |
+ ]); |
}); |
} |
return _resolutionImpactDeserializer.impactMap[element]; |
@@ -288,6 +141,41 @@ class _DeserializerSystem extends DeserializerSystem { |
} |
} |
+const String WORLD_IMPACT_TAG = 'worldImpact'; |
+ |
+class ResolutionImpactSerializer extends SerializerPlugin { |
+ final Resolution resolution; |
+ final SerializerPlugin nativeDataSerializer; |
+ |
+ ResolutionImpactSerializer(this.resolution, this.nativeDataSerializer); |
+ |
+ @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(element, encoder, nativeDataSerializer) |
+ .serialize(impact); |
+ } |
+ } |
+} |
+ |
+class ResolutionImpactDeserializer extends DeserializerPlugin { |
+ Map<Element, ResolutionImpact> impactMap = <Element, ResolutionImpact>{}; |
+ final DeserializerPlugin nativeDataDeserializer; |
+ |
+ ResolutionImpactDeserializer(this.nativeDataDeserializer); |
+ |
+ @override |
+ void onElement(Element element, ObjectDecoder getDecoder(String tag)) { |
+ ObjectDecoder decoder = getDecoder(WORLD_IMPACT_TAG); |
+ if (decoder != null) { |
+ impactMap[element] = ImpactDeserializer.deserializeImpact( |
+ element, decoder, nativeDataDeserializer); |
+ } |
+ } |
+} |
+ |
const String RESOLVED_AST_TAG = 'resolvedAst'; |
class ResolvedAstSerializerPlugin extends SerializerPlugin { |
@@ -306,9 +194,8 @@ class ResolvedAstSerializerPlugin extends SerializerPlugin { |
ResolvedAst resolvedAst = resolution.getResolvedAst(element); |
ObjectEncoder objectEncoder = createEncoder(RESOLVED_AST_TAG); |
new ResolvedAstSerializer( |
- objectEncoder, |
- resolvedAst, |
- nativeDataSerializer).serialize(); |
+ objectEncoder, resolvedAst, nativeDataSerializer) |
+ .serialize(); |
} |
} |
} |
@@ -336,9 +223,8 @@ class ResolvedAstDeserializerPlugin extends DeserializerPlugin { |
ObjectDecoder decoder = _decoderMap[element.memberContext]; |
if (decoder != null) { |
- ResolvedAstDeserializer.deserialize( |
- element.memberContext, decoder, parsingContext, findToken, |
- nativeDataDeserializer); |
+ ResolvedAstDeserializer.deserialize(element.memberContext, decoder, |
+ parsingContext, findToken, nativeDataDeserializer); |
_decoderMap.remove(element); |
assert(invariant(element, element.hasResolvedAst, |
message: "ResolvedAst not computed for $element.")); |
@@ -352,7 +238,7 @@ class ResolvedAstDeserializerPlugin extends DeserializerPlugin { |
SourceFile sourceFile = sourceFiles[uri]; |
if (sourceFile == null) { |
throw 'No source file found for $uri in:\n ' |
- '${sourceFiles.keys.join('\n ')}'; |
+ '${sourceFiles.keys.join('\n ')}'; |
} |
return new Scanner(sourceFile).tokenize(); |
}); |
@@ -367,4 +253,3 @@ class ResolvedAstDeserializerPlugin extends DeserializerPlugin { |
} |
} |
} |
- |