| OLD | NEW |
| 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file | 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 | 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. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 library dart2js.serialization_analysis_test; | 5 library dart2js.serialization_analysis_test; |
| 6 | 6 |
| 7 import 'dart:async'; | 7 import 'dart:async'; |
| 8 import 'package:async_helper/async_helper.dart'; | 8 import 'package:async_helper/async_helper.dart'; |
| 9 import 'package:expect/expect.dart'; | 9 import 'package:expect/expect.dart'; |
| 10 import 'package:compiler/src/commandline_options.dart'; | 10 import 'package:compiler/src/commandline_options.dart'; |
| 11 import 'package:compiler/src/common/backend_api.dart'; | 11 import 'package:compiler/src/common/backend_api.dart'; |
| 12 import 'package:compiler/src/common/names.dart'; | 12 import 'package:compiler/src/common/names.dart'; |
| 13 import 'package:compiler/src/common/resolution.dart'; | |
| 14 import 'package:compiler/src/compiler.dart'; | 13 import 'package:compiler/src/compiler.dart'; |
| 15 import 'package:compiler/src/elements/elements.dart'; | |
| 16 import 'package:compiler/src/filenames.dart'; | 14 import 'package:compiler/src/filenames.dart'; |
| 17 import 'package:compiler/src/serialization/element_serialization.dart'; | |
| 18 import 'package:compiler/src/serialization/impact_serialization.dart'; | |
| 19 import 'package:compiler/src/serialization/json_serializer.dart'; | |
| 20 import 'package:compiler/src/serialization/serialization.dart'; | |
| 21 import 'package:compiler/src/serialization/task.dart'; | |
| 22 import 'package:compiler/src/universe/world_impact.dart'; | |
| 23 import 'memory_compiler.dart'; | 15 import 'memory_compiler.dart'; |
| 16 import 'serialization_helper.dart'; |
| 24 | 17 |
| 25 const List<Test> TESTS = const <Test>[ | 18 const List<Test> TESTS = const <Test>[ |
| 26 const Test(const { | 19 const Test(const { |
| 27 'main.dart': 'main() => print("Hello World");' | 20 'main.dart': 'main() => print("Hello World");' |
| 28 }), | 21 }), |
| 29 | 22 |
| 30 const Test(const { | 23 const Test(const { |
| 31 'main.dart': 'main() => print("Hello World", 0);' | 24 'main.dart': 'main() => print("Hello World", 0);' |
| 32 }, | 25 }, |
| 33 expectedWarningCount: 1, | 26 expectedWarningCount: 1, |
| (...skipping 201 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 235 } | 228 } |
| 236 | 229 |
| 237 Future analyze(String serializedData, Uri entryPoint, Test test) async { | 230 Future analyze(String serializedData, Uri entryPoint, Test test) async { |
| 238 DiagnosticCollector diagnosticCollector = new DiagnosticCollector(); | 231 DiagnosticCollector diagnosticCollector = new DiagnosticCollector(); |
| 239 await runCompiler( | 232 await runCompiler( |
| 240 entryPoint: entryPoint, | 233 entryPoint: entryPoint, |
| 241 memorySourceFiles: test != null ? test.sourceFiles : const {}, | 234 memorySourceFiles: test != null ? test.sourceFiles : const {}, |
| 242 options: [Flags.analyzeOnly], | 235 options: [Flags.analyzeOnly], |
| 243 diagnosticHandler: diagnosticCollector, | 236 diagnosticHandler: diagnosticCollector, |
| 244 beforeRun: (Compiler compiler) { | 237 beforeRun: (Compiler compiler) { |
| 245 Deserializer deserializer = new Deserializer.fromText( | 238 deserialize(compiler, serializedData); |
| 246 new DeserializationContext(), | |
| 247 serializedData, | |
| 248 const JsonSerializationDecoder()); | |
| 249 deserializer.plugins.add(compiler.backend.serialization.deserializer); | |
| 250 compiler.serialization.deserializer = | |
| 251 new _DeserializerSystem( | |
| 252 deserializer, | |
| 253 compiler.backend.impactTransformer); | |
| 254 }); | 239 }); |
| 255 if (test != null) { | 240 if (test != null) { |
| 256 Expect.equals(test.expectedErrorCount, diagnosticCollector.errors.length, | 241 Expect.equals(test.expectedErrorCount, diagnosticCollector.errors.length, |
| 257 "Unexpected error count."); | 242 "Unexpected error count."); |
| 258 Expect.equals( | 243 Expect.equals( |
| 259 test.expectedWarningCount, | 244 test.expectedWarningCount, |
| 260 diagnosticCollector.warnings.length, | 245 diagnosticCollector.warnings.length, |
| 261 "Unexpected warning count."); | 246 "Unexpected warning count."); |
| 262 Expect.equals(test.expectedHintCount, diagnosticCollector.hints.length, | 247 Expect.equals(test.expectedHintCount, diagnosticCollector.hints.length, |
| 263 "Unexpected hint count."); | 248 "Unexpected hint count."); |
| 264 Expect.equals(test.expectedInfoCount, diagnosticCollector.infos.length, | 249 Expect.equals(test.expectedInfoCount, diagnosticCollector.infos.length, |
| 265 "Unexpected info count."); | 250 "Unexpected info count."); |
| 266 } | 251 } |
| 267 } | 252 } |
| 268 | 253 |
| 269 Future<String> serializeDartCore() async { | |
| 270 Compiler compiler = compilerFor( | |
| 271 options: [Flags.analyzeAll]); | |
| 272 compiler.serialization.supportSerialization = true; | |
| 273 await compiler.run(Uris.dart_core); | |
| 274 return serialize(compiler); | |
| 275 } | |
| 276 | |
| 277 String serialize(Compiler compiler) { | |
| 278 Serializer serializer = new Serializer(); | |
| 279 serializer.plugins.add(compiler.backend.serialization.serializer); | |
| 280 serializer.plugins.add(new ResolutionImpactSerializer(compiler.resolution)); | |
| 281 | |
| 282 for (LibraryElement library in compiler.libraryLoader.libraries) { | |
| 283 serializer.serialize(library); | |
| 284 } | |
| 285 return serializer.toText(const JsonSerializationEncoder()); | |
| 286 } | |
| 287 | |
| 288 const String WORLD_IMPACT_TAG = 'worldImpact'; | |
| 289 | |
| 290 class ResolutionImpactSerializer extends SerializerPlugin { | |
| 291 final Resolution resolution; | |
| 292 | |
| 293 ResolutionImpactSerializer(this.resolution); | |
| 294 | |
| 295 @override | |
| 296 void onElement(Element element, ObjectEncoder createEncoder(String tag)) { | |
| 297 if (resolution.hasBeenResolved(element)) { | |
| 298 ResolutionImpact impact = resolution.getResolutionImpact(element); | |
| 299 ObjectEncoder encoder = createEncoder(WORLD_IMPACT_TAG); | |
| 300 new ImpactSerializer(encoder).serialize(impact); | |
| 301 } | |
| 302 } | |
| 303 } | |
| 304 | |
| 305 class ResolutionImpactDeserializer extends DeserializerPlugin { | |
| 306 Map<Element, ResolutionImpact> impactMap = <Element, ResolutionImpact>{}; | |
| 307 | |
| 308 @override | |
| 309 void onElement(Element element, ObjectDecoder getDecoder(String tag)) { | |
| 310 ObjectDecoder decoder = getDecoder(WORLD_IMPACT_TAG); | |
| 311 if (decoder != null) { | |
| 312 impactMap[element] = ImpactDeserializer.deserializeImpact(decoder); | |
| 313 } | |
| 314 } | |
| 315 } | |
| 316 | |
| 317 class _DeserializerSystem extends DeserializerSystem { | |
| 318 final Deserializer _deserializer; | |
| 319 final List<LibraryElement> deserializedLibraries = <LibraryElement>[]; | |
| 320 final ResolutionImpactDeserializer _resolutionImpactDeserializer = | |
| 321 new ResolutionImpactDeserializer(); | |
| 322 final ImpactTransformer _impactTransformer; | |
| 323 | |
| 324 _DeserializerSystem(this._deserializer, this._impactTransformer) { | |
| 325 _deserializer.plugins.add(_resolutionImpactDeserializer); | |
| 326 } | |
| 327 | |
| 328 LibraryElement readLibrary(Uri resolvedUri) { | |
| 329 LibraryElement library = _deserializer.lookupLibrary(resolvedUri); | |
| 330 if (library != null) { | |
| 331 deserializedLibraries.add(library); | |
| 332 } | |
| 333 return library; | |
| 334 } | |
| 335 | |
| 336 @override | |
| 337 WorldImpact computeWorldImpact(Element element) { | |
| 338 ResolutionImpact resolutionImpact = | |
| 339 _resolutionImpactDeserializer.impactMap[element]; | |
| 340 if (resolutionImpact == null) { | |
| 341 print('No impact found for $element (${element.library})'); | |
| 342 return const WorldImpact(); | |
| 343 } else { | |
| 344 return _impactTransformer.transformResolutionImpact(resolutionImpact); | |
| 345 } | |
| 346 } | |
| 347 | |
| 348 @override | |
| 349 bool isDeserialized(Element element) { | |
| 350 return deserializedLibraries.contains(element.library); | |
| 351 } | |
| 352 } | |
| OLD | NEW |