Index: tests/compiler/dart2js/kernel/closed_world_test.dart |
diff --git a/tests/compiler/dart2js/kernel/closed_world_test.dart b/tests/compiler/dart2js/kernel/closed_world_test.dart |
index d91d96a5fcd1015d0586e36b1f0fa2de6248effa..aa21341c486b6532ef270d32d4fc57b6ac76bc4f 100644 |
--- a/tests/compiler/dart2js/kernel/closed_world_test.dart |
+++ b/tests/compiler/dart2js/kernel/closed_world_test.dart |
@@ -9,24 +9,18 @@ library dart2js.kernel.closed_world_test; |
import 'package:async_helper/async_helper.dart'; |
import 'package:compiler/src/commandline_options.dart'; |
import 'package:compiler/src/common.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/constants/expressions.dart'; |
import 'package:compiler/src/dart_types.dart'; |
import 'package:compiler/src/elements/elements.dart'; |
import 'package:compiler/src/enqueue.dart'; |
import 'package:compiler/src/js_backend/backend.dart'; |
import 'package:compiler/src/js_backend/type_variable_handler.dart'; |
-import 'package:compiler/src/resolution/registry.dart'; |
-import 'package:compiler/src/resolution/tree_elements.dart'; |
import 'package:compiler/src/ssa/kernel_impact.dart'; |
import 'package:compiler/src/serialization/equivalence.dart'; |
-import 'package:compiler/src/universe/call_structure.dart'; |
-import 'package:compiler/src/universe/feature.dart'; |
+import 'package:compiler/src/universe/world_builder.dart'; |
import 'package:compiler/src/universe/world_impact.dart'; |
import 'package:compiler/src/world.dart'; |
-import 'package:expect/expect.dart'; |
import 'impact_test.dart'; |
import '../memory_compiler.dart'; |
import '../serialization/helper.dart'; |
@@ -34,7 +28,26 @@ import '../serialization/model_test_helper.dart'; |
const SOURCE = const { |
'main.dart': ''' |
-main() { |
+abstract class A { |
+ // redirecting factory in abstract class to other class |
+ factory A.a() = D.a; |
+ // redirecting factory in abstract class to factory in abstract class |
+ factory A.b() = B.a; |
+} |
+abstract class B implements A { |
+ factory B.a() => null; |
+} |
+class C implements B { |
+ // redirecting factory in concrete to other class |
+ factory C.a() = D.a; |
+} |
+class D implements C { |
+ D.a(); |
+} |
+main(args) { |
+ new A.a(); |
+ new A.b(); |
+ new C.a(); |
print(new List<String>()..add('Hello World!')); |
} |
''' |
@@ -62,6 +75,9 @@ main(List<String> args) { |
Flags.useKernel, |
Flags.enableAssertMessage |
]); |
+ ResolutionWorldBuilderImpl worldBuilder = |
+ compiler.enqueuer.resolution.universe; |
+ worldBuilder.useInstantiationMap = true; |
compiler.resolution.retainCachesForTesting = true; |
await compiler.run(entryPoint); |
compiler.openWorld.closeWorld(compiler.reporter); |
@@ -78,14 +94,20 @@ main(List<String> args) { |
compiler.globalDependencies, |
backend, |
compiler.commonElements, |
- compiler.cacheStrategy); |
+ compiler.cacheStrategy, |
+ 'enqueuer from kernel'); |
// TODO(johnniwinther): Store backend info separately. This replacement is |
// made to reset a field in [TypeVariableHandler] that prevents it from |
// enqueuing twice. |
backend.typeVariableHandler = new TypeVariableHandler(compiler); |
backend.enqueueHelpers(enqueuer); |
- enqueuer.addToWorkList(compiler.mainFunction); |
+ enqueuer.applyImpact( |
+ compiler.impactStrategy, |
+ enqueuer.nativeEnqueuer |
+ .processNativeClasses(compiler.libraryLoader.libraries)); |
+ enqueuer.applyImpact(compiler.impactStrategy, |
+ backend.computeMainImpact(enqueuer, compiler.mainFunction)); |
enqueuer.forEach((work) { |
AstElement element = work.element; |
ResolutionImpact resolutionImpact = build(compiler, element.resolvedAst); |
@@ -106,8 +128,17 @@ main(List<String> args) { |
// Redirecting factory constructors are skipped in kernel. |
return false; |
} |
+ if (element is ClassElement) { |
+ for (ConstructorElement constructor in element.constructors) { |
+ if (!constructor.isRedirectingFactory) { |
+ return true; |
+ } |
+ } |
+ // The class cannot itself be instantiated. |
+ return false; |
+ } |
return true; |
- }, checkInstantiatedTypesAndClasses: false, verbose: arguments.verbose); |
+ }, verbose: arguments.verbose); |
checkClosedWorlds(compiler.closedWorld, closedWorld, |
verbose: arguments.verbose); |
}); |