Index: tests/compiler/dart2js/serialization_helper.dart |
diff --git a/tests/compiler/dart2js/serialization_helper.dart b/tests/compiler/dart2js/serialization_helper.dart |
index a8f95a6bcc9ccd319242a81df19491f8209b3d21..c8632652030f0a97a4e3beca36193a0682ad3213 100644 |
--- a/tests/compiler/dart2js/serialization_helper.dart |
+++ b/tests/compiler/dart2js/serialization_helper.dart |
@@ -7,6 +7,7 @@ library dart2js.serialization_helper; |
import 'dart:async'; |
import 'package:async_helper/async_helper.dart'; |
import 'package:expect/expect.dart'; |
+import 'package:compiler/compiler_new.dart'; |
import 'package:compiler/src/commandline_options.dart'; |
import 'package:compiler/src/common/backend_api.dart'; |
import 'package:compiler/src/common/names.dart'; |
@@ -14,30 +15,46 @@ 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/io/source_file.dart'; |
+import 'package:compiler/src/scanner/scanner.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/resolved_ast_serialization.dart'; |
import 'package:compiler/src/serialization/serialization.dart'; |
+import 'package:compiler/src/serialization/modelz.dart'; |
import 'package:compiler/src/serialization/task.dart'; |
+import 'package:compiler/src/tokens/token.dart'; |
+import 'package:compiler/src/script.dart'; |
import 'package:compiler/src/universe/world_impact.dart'; |
import 'memory_compiler.dart'; |
-Future<String> serializeDartCore() async { |
+Future<String> serializeDartCore({bool serializeResolvedAst: false}) 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()); |
+ return serialize( |
+ compiler, |
+ compiler.libraryLoader.libraries, |
+ serializeResolvedAst: serializeResolvedAst) |
+ .toText(const JsonSerializationEncoder()); |
} |
-Serializer serialize(Compiler compiler, Iterable<LibraryElement> libraries) { |
+Serializer serialize( |
+ Compiler compiler, |
+ Iterable<LibraryElement> libraries, |
+ {bool serializeResolvedAst: false}) { |
assert(compiler.serialization.supportSerialization); |
Serializer serializer = new Serializer(); |
serializer.plugins.add(compiler.backend.serialization.serializer); |
serializer.plugins.add(new ResolutionImpactSerializer(compiler.resolution)); |
+ if (serializeResolvedAst) { |
+ serializer.plugins.add( |
+ new ResolvedAstSerializerPlugin(compiler.resolution)); |
+ } |
for (LibraryElement library in libraries) { |
serializer.serialize(library); |
@@ -45,7 +62,9 @@ Serializer serialize(Compiler compiler, Iterable<LibraryElement> libraries) { |
return serializer; |
} |
-void deserialize(Compiler compiler, String serializedData) { |
+void deserialize(Compiler compiler, |
+ String serializedData, |
+ {bool deserializeResolvedAst: false}) { |
Deserializer deserializer = new Deserializer.fromText( |
new DeserializationContext(), |
serializedData, |
@@ -53,8 +72,10 @@ void deserialize(Compiler compiler, String serializedData) { |
deserializer.plugins.add(compiler.backend.serialization.deserializer); |
compiler.serialization.deserializer = |
new _DeserializerSystem( |
+ compiler, |
deserializer, |
- compiler.backend.impactTransformer); |
+ compiler.backend.impactTransformer, |
+ deserializeResolvedAst: deserializeResolvedAst); |
} |
@@ -88,24 +109,59 @@ class ResolutionImpactDeserializer extends DeserializerPlugin { |
} |
class _DeserializerSystem extends DeserializerSystem { |
+ final Compiler _compiler; |
final Deserializer _deserializer; |
final List<LibraryElement> deserializedLibraries = <LibraryElement>[]; |
final ResolutionImpactDeserializer _resolutionImpactDeserializer = |
new ResolutionImpactDeserializer(); |
+ final ResolvedAstDeserializerPlugin _resolvedAstDeserializer; |
final ImpactTransformer _impactTransformer; |
- |
- _DeserializerSystem(this._deserializer, this._impactTransformer) { |
+ final bool _deserializeResolvedAst; |
+ |
+ _DeserializerSystem( |
+ Compiler compiler, |
+ this._deserializer, |
+ this._impactTransformer, |
+ {bool deserializeResolvedAst: false}) |
+ : this._compiler = compiler, |
+ this._deserializeResolvedAst = deserializeResolvedAst, |
+ this._resolvedAstDeserializer = deserializeResolvedAst |
+ ? new ResolvedAstDeserializerPlugin(compiler.parsing) : null { |
_deserializer.plugins.add(_resolutionImpactDeserializer); |
+ if (_deserializeResolvedAst) { |
+ _deserializer.plugins.add(_resolvedAstDeserializer); |
+ } |
} |
- LibraryElement readLibrary(Uri resolvedUri) { |
+ @override |
+ Future<LibraryElement> readLibrary(Uri resolvedUri) { |
LibraryElement library = _deserializer.lookupLibrary(resolvedUri); |
if (library != null) { |
deserializedLibraries.add(library); |
+ if (_deserializeResolvedAst) { |
+ return Future.forEach(library.compilationUnits, |
+ (CompilationUnitElement compilationUnit) { |
+ Script script = compilationUnit.script; |
+ return _compiler.readScript(script.readableUri) |
+ .then((Script newScript) { |
+ _resolvedAstDeserializer.sourceFiles[script.resourceUri] = |
+ newScript.file; |
+ }); |
+ }).then((_) => library); |
+ } |
+ } |
+ return new Future<LibraryElement>.value(library); |
+ } |
+ |
+ @override |
+ ResolvedAst getResolvedAst(Element element) { |
+ if (_resolvedAstDeserializer != null) { |
+ return _resolvedAstDeserializer.getResolvedAst(element); |
} |
- return library; |
+ return null; |
} |
+ @override |
ResolutionImpact getResolutionImpact(Element element) { |
return _resolutionImpactDeserializer.impactMap[element]; |
} |
@@ -126,3 +182,66 @@ class _DeserializerSystem extends DeserializerSystem { |
return deserializedLibraries.contains(element.library); |
} |
} |
+ |
+const String RESOLVED_AST_TAG = 'resolvedAst'; |
+ |
+class ResolvedAstSerializerPlugin extends SerializerPlugin { |
+ final Resolution resolution; |
+ |
+ ResolvedAstSerializerPlugin(this.resolution); |
+ |
+ @override |
+ void onElement(Element element, ObjectEncoder createEncoder(String tag)) { |
+ if (element is MemberElement && resolution.hasResolvedAst(element)) { |
+ ResolvedAst resolvedAst = resolution.getResolvedAst(element); |
+ ObjectEncoder objectEncoder = createEncoder(RESOLVED_AST_TAG); |
+ new ResolvedAstSerializer(objectEncoder, resolvedAst).serialize(); |
+ } |
+ } |
+} |
+ |
+class ResolvedAstDeserializerPlugin extends DeserializerPlugin { |
+ final Parsing parsing; |
+ final Map<Uri, SourceFile> sourceFiles = <Uri, SourceFile>{}; |
+ |
+ Map<Element, ResolvedAst> _resolvedAstMap = <Element, ResolvedAst>{}; |
+ Map<Element, ObjectDecoder> _decoderMap = <Element, ObjectDecoder>{}; |
+ Map<Uri, Token> beginTokenMap = <Uri, Token>{}; |
+ |
+ ResolvedAstDeserializerPlugin(this.parsing); |
+ |
+ ResolvedAst getResolvedAst(Element element) { |
+ ResolvedAst resolvedAst = _resolvedAstMap[element]; |
+ if (resolvedAst == null) { |
+ ObjectDecoder decoder = _decoderMap[element]; |
+ if (decoder != null) { |
+ resolvedAst = _resolvedAstMap[element] = |
+ ResolvedAstDeserializer.deserialize( |
+ element, decoder, parsing, findToken); |
+ _decoderMap.remove(element); |
+ } |
+ } |
+ return resolvedAst; |
+ } |
+ |
+ Token findToken(Uri uri, int offset) { |
+ Token beginToken = beginTokenMap.putIfAbsent(uri, () { |
+ SourceFile sourceFile = sourceFiles[uri]; |
+ if (sourceFile == null) { |
+ throw 'No source file found for $uri in:\n ' |
+ '${sourceFiles.keys.join('\n ')}'; |
+ } |
+ return new Scanner(sourceFile).tokenize(); |
+ }); |
+ return ResolvedAstDeserializer.findTokenInStream(beginToken, offset); |
+ } |
+ |
+ @override |
+ void onElement(Element element, ObjectDecoder getDecoder(String tag)) { |
+ ObjectDecoder decoder = getDecoder(RESOLVED_AST_TAG); |
+ if (decoder != null) { |
+ _decoderMap[element] = decoder; |
+ } |
+ } |
+} |
+ |