| OLD | NEW |
| 1 // Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2017, 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 // Helper to test compilation equivalence between source and .dill based | 5 // Helper to test compilation equivalence between source and .dill based |
| 6 // compilation. | 6 // compilation. |
| 7 library dart2js.kernel.compile_from_dill_test_helper; | 7 library dart2js.kernel.compile_from_dill_test_helper; |
| 8 | 8 |
| 9 import 'dart:async'; | 9 import 'dart:async'; |
| 10 import 'dart:io'; | 10 import 'dart:io'; |
| 11 | 11 |
| 12 import 'package:compiler/compiler_new.dart'; | 12 import 'package:compiler/compiler_new.dart'; |
| 13 import 'package:compiler/src/commandline_options.dart'; | 13 import 'package:compiler/src/commandline_options.dart'; |
| 14 import 'package:compiler/src/common.dart'; | 14 import 'package:compiler/src/common.dart'; |
| 15 import 'package:compiler/src/compiler.dart'; | 15 import 'package:compiler/src/compiler.dart'; |
| 16 import 'package:compiler/src/elements/elements.dart'; | 16 import 'package:compiler/src/elements/elements.dart'; |
| 17 import 'package:compiler/src/elements/types.dart'; | 17 import 'package:compiler/src/elements/types.dart'; |
| 18 import 'package:compiler/src/kernel/element_map.dart'; | 18 import 'package:compiler/src/kernel/element_map.dart'; |
| 19 import 'package:compiler/src/kernel/kernel_backend_strategy.dart'; |
| 19 import 'package:compiler/src/kernel/kernel_strategy.dart'; | 20 import 'package:compiler/src/kernel/kernel_strategy.dart'; |
| 20 import 'package:compiler/src/serialization/equivalence.dart'; | 21 import 'package:compiler/src/serialization/equivalence.dart'; |
| 21 import 'package:compiler/src/resolution/enum_creator.dart'; | 22 import 'package:compiler/src/resolution/enum_creator.dart'; |
| 22 import 'package:compiler/src/universe/world_builder.dart'; | 23 import 'package:compiler/src/universe/world_builder.dart'; |
| 23 import 'package:compiler/src/world.dart'; | 24 import 'package:compiler/src/world.dart'; |
| 24 import 'package:expect/expect.dart'; | 25 import 'package:expect/expect.dart'; |
| 25 import '../memory_compiler.dart'; | 26 import '../memory_compiler.dart'; |
| 26 import '../equivalence/check_functions.dart'; | 27 import '../equivalence/check_functions.dart'; |
| 27 import '../equivalence/check_helpers.dart'; | 28 import '../equivalence/check_helpers.dart'; |
| 28 import '../serialization/helper.dart'; | 29 import '../serialization/helper.dart'; |
| (...skipping 200 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 229 OutputCollector collector2 = new OutputCollector(); | 230 OutputCollector collector2 = new OutputCollector(); |
| 230 Compiler compiler2 = await compileWithDill( | 231 Compiler compiler2 = await compileWithDill( |
| 231 entryPoint, const {}, <String>[]..addAll(commonOptions)..addAll(options), | 232 entryPoint, const {}, <String>[]..addAll(commonOptions)..addAll(options), |
| 232 printSteps: true, compilerOutput: collector2); | 233 printSteps: true, compilerOutput: collector2); |
| 233 | 234 |
| 234 KernelFrontEndStrategy frontendStrategy = compiler2.frontendStrategy; | 235 KernelFrontEndStrategy frontendStrategy = compiler2.frontendStrategy; |
| 235 KernelToElementMap elementMap = frontendStrategy.elementMap; | 236 KernelToElementMap elementMap = frontendStrategy.elementMap; |
| 236 | 237 |
| 237 Expect.isFalse(compiler2.compilationFailed); | 238 Expect.isFalse(compiler2.compilationFailed); |
| 238 | 239 |
| 239 KernelEquivalence equivalence = new KernelEquivalence(elementMap); | 240 KernelEquivalence equivalence1 = new KernelEquivalence(elementMap); |
| 240 | 241 |
| 241 ClosedWorld closedWorld2 = | 242 ClosedWorld closedWorld2 = |
| 242 compiler2.resolutionWorldBuilder.closedWorldForTesting; | 243 compiler2.resolutionWorldBuilder.closedWorldForTesting; |
| 243 | 244 |
| 244 checkBackendUsage(closedWorld1.backendUsage, closedWorld2.backendUsage, | 245 checkBackendUsage(closedWorld1.backendUsage, closedWorld2.backendUsage, |
| 245 equivalence.defaultStrategy); | 246 equivalence1.defaultStrategy); |
| 246 | 247 |
| 247 print('--- checking resolution enqueuers ----------------------------------'); | 248 print('--- checking resolution enqueuers ----------------------------------'); |
| 248 checkResolutionEnqueuers(closedWorld1.backendUsage, closedWorld2.backendUsage, | 249 checkResolutionEnqueuers(closedWorld1.backendUsage, closedWorld2.backendUsage, |
| 249 compiler1.enqueuer.resolution, compiler2.enqueuer.resolution, | 250 compiler1.enqueuer.resolution, compiler2.enqueuer.resolution, |
| 250 elementEquivalence: (a, b) => equivalence.entityEquivalence(a, b), | 251 elementEquivalence: (a, b) => equivalence1.entityEquivalence(a, b), |
| 251 typeEquivalence: (DartType a, DartType b) { | 252 typeEquivalence: (DartType a, DartType b) { |
| 252 return equivalence.typeEquivalence(unalias(a), b); | 253 return equivalence1.typeEquivalence(unalias(a), b); |
| 253 }, | 254 }, |
| 254 elementFilter: elementFilter, | 255 elementFilter: elementFilter, |
| 255 verbose: verbose); | 256 verbose: verbose); |
| 256 | 257 |
| 257 print('--- checking closed worlds -----------------------------------------'); | 258 print('--- checking closed worlds -----------------------------------------'); |
| 258 checkClosedWorlds(closedWorld1, closedWorld2, | 259 checkClosedWorlds(closedWorld1, closedWorld2, |
| 259 strategy: equivalence.defaultStrategy, | 260 strategy: equivalence1.defaultStrategy, |
| 260 verbose: verbose, | 261 verbose: verbose, |
| 261 // TODO(johnniwinther,efortuna): Require closure class equivalence when | 262 // TODO(johnniwinther,efortuna): Require closure class equivalence when |
| 262 // these are supported. | 263 // these are supported. |
| 263 allowMissingClosureClasses: true); | 264 allowMissingClosureClasses: true); |
| 264 | 265 |
| 265 // TODO(johnniwinther): Perform equivalence tests on the model: codegen world | 266 // TODO(johnniwinther): Perform equivalence tests on the model: codegen world |
| 266 // impacts, program model, etc. | 267 // impacts, program model, etc. |
| 267 | 268 |
| 268 print('--- checking codegen enqueuers--------------------------------------'); | 269 print('--- checking codegen enqueuers--------------------------------------'); |
| 270 |
| 271 KernelBackendStrategy backendStrategy = compiler2.backendStrategy; |
| 272 KernelEquivalence equivalence2 = |
| 273 new KernelEquivalence(backendStrategy.elementMap); |
| 274 |
| 269 checkCodegenEnqueuers(compiler1.enqueuer.codegenEnqueuerForTesting, | 275 checkCodegenEnqueuers(compiler1.enqueuer.codegenEnqueuerForTesting, |
| 270 compiler2.enqueuer.codegenEnqueuerForTesting, | 276 compiler2.enqueuer.codegenEnqueuerForTesting, |
| 271 elementEquivalence: (a, b) => equivalence.entityEquivalence(a, b), | 277 elementEquivalence: (a, b) => equivalence2.entityEquivalence(a, b), |
| 272 typeEquivalence: (DartType a, DartType b) { | 278 typeEquivalence: (DartType a, DartType b) { |
| 273 return equivalence.typeEquivalence(unalias(a), b); | 279 return equivalence2.typeEquivalence(unalias(a), b); |
| 274 }, | 280 }, |
| 275 elementFilter: elementFilter, | 281 elementFilter: elementFilter, |
| 276 verbose: verbose); | 282 verbose: verbose); |
| 277 | 283 |
| 278 checkEmitters(compiler1.backend.emitter, compiler2.backend.emitter, | 284 checkEmitters(compiler1.backend.emitter, compiler2.backend.emitter, |
| 279 elementEquivalence: (a, b) => equivalence.entityEquivalence(a, b), | 285 elementEquivalence: (a, b) => equivalence2.entityEquivalence(a, b), |
| 280 typeEquivalence: (DartType a, DartType b) { | 286 typeEquivalence: (DartType a, DartType b) { |
| 281 return equivalence.typeEquivalence(unalias(a), b); | 287 return equivalence2.typeEquivalence(unalias(a), b); |
| 282 }, | 288 }, |
| 283 verbose: verbose); | 289 verbose: verbose); |
| 284 | 290 |
| 285 if (expectAstEquivalence) { | 291 if (expectAstEquivalence) { |
| 286 checkGeneratedCode(compiler1.backend, compiler2.backend, | 292 checkGeneratedCode(compiler1.backend, compiler2.backend, |
| 287 elementEquivalence: (a, b) => equivalence.entityEquivalence(a, b)); | 293 elementEquivalence: (a, b) => equivalence2.entityEquivalence(a, b)); |
| 288 } | 294 } |
| 289 | 295 |
| 290 if (expectIdenticalOutput) { | 296 if (expectIdenticalOutput) { |
| 291 print('--- checking output------- ---------------------------------------'); | 297 print('--- checking output------- ---------------------------------------'); |
| 292 collector1.outputMap | 298 collector1.outputMap |
| 293 .forEach((OutputType outputType, Map<String, BufferedOutputSink> map1) { | 299 .forEach((OutputType outputType, Map<String, BufferedOutputSink> map1) { |
| 294 if (outputType == OutputType.sourceMap) { | 300 if (outputType == OutputType.sourceMap) { |
| 295 // TODO(johnniwinther): Support source map from .dill. | 301 // TODO(johnniwinther): Support source map from .dill. |
| 296 return; | 302 return; |
| 297 } | 303 } |
| 298 Map<String, BufferedOutputSink> map2 = collector2.outputMap[outputType]; | 304 Map<String, BufferedOutputSink> map2 = collector2.outputMap[outputType]; |
| 299 checkSets(map1.keys, map2.keys, 'output', equality); | 305 checkSets(map1.keys, map2.keys, 'output', equality); |
| 300 map1.forEach((String name, BufferedOutputSink output1) { | 306 map1.forEach((String name, BufferedOutputSink output1) { |
| 301 BufferedOutputSink output2 = map2[name]; | 307 BufferedOutputSink output2 = map2[name]; |
| 302 Expect.stringEquals(output1.text, output2.text); | 308 Expect.stringEquals(output1.text, output2.text); |
| 303 }); | 309 }); |
| 304 }); | 310 }); |
| 305 } | 311 } |
| 306 return ResultKind.success; | 312 return ResultKind.success; |
| 307 } | 313 } |
| OLD | NEW |