Chromium Code Reviews| 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 a2f38ad8f67106af785813e87a5c269c503e83e5..0187bf7cfefafd0b700394ea1ff478c6071d8d9d 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] = |
| @@ -243,7 +95,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); |
| @@ -253,18 +105,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]; |
| @@ -284,6 +137,41 @@ class _DeserializerSystem extends DeserializerSystem { |
| } |
| } |
|
Johnni Winther
2016/05/13 12:36:20
This is just moved from above the DeserializerSyst
|
| +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 { |
| @@ -302,9 +190,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(); |
| } |
| } |
| } |
| @@ -333,10 +220,8 @@ class ResolvedAstDeserializerPlugin extends DeserializerPlugin { |
| if (resolvedAst == null) { |
| ObjectDecoder decoder = _decoderMap[element.memberContext]; |
| if (decoder != null) { |
| - ResolvedAstDeserializer.deserialize( |
| - element.memberContext, decoder, parsingContext, findToken, |
| - nativeDataDeserializer, |
| - _resolvedAstMap); |
| + ResolvedAstDeserializer.deserialize(element.memberContext, decoder, |
| + parsingContext, findToken, nativeDataDeserializer, _resolvedAstMap); |
| _decoderMap.remove(element); |
| resolvedAst = _resolvedAstMap[element]; |
| } |
| @@ -349,7 +234,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(); |
| }); |
| @@ -364,4 +249,3 @@ class ResolvedAstDeserializerPlugin extends DeserializerPlugin { |
| } |
| } |
| } |
| - |