Index: pkg/front_end/test/incremental_kernel_generator_test.dart |
diff --git a/pkg/front_end/test/incremental_kernel_generator_test.dart b/pkg/front_end/test/incremental_kernel_generator_test.dart |
index 5e02eccc702752fb7654c2760dd7f266dc73e37e..525349477a58ce6821bdd91e5d392a85778a0f30 100644 |
--- a/pkg/front_end/test/incremental_kernel_generator_test.dart |
+++ b/pkg/front_end/test/incremental_kernel_generator_test.dart |
@@ -34,7 +34,7 @@ class IncrementalKernelGeneratorTest { |
WatchUsedFilesFn watchFn = (uri, used) {}; |
/// The object under test. |
- IncrementalKernelGenerator incrementalKernelGenerator; |
+ IncrementalKernelGeneratorImpl incrementalKernelGenerator; |
/// Compute the initial [Program] for the given [entryPoint]. |
Future<Program> getInitialState(Uri entryPoint) async { |
@@ -292,10 +292,9 @@ b() { |
} |
// Update c.dart and compute the delta. |
- // It should include the changed c.dart, the affected b.dart, and |
- // also a.dart because VM requires this (because of possible inlining). |
- // But d.dart is not on the path from main() to the changed c.dart, |
- // so it is not included. |
+ // It should include the changed c.dart, plus b.dart and a.dart because VM |
+ // requires this (because of possible inlining). But d.dart is not on the |
+ // path from main() to the changed c.dart, so it is not included. |
writeFile(cPath, 'c() { print(1); }'); |
incrementalKernelGenerator.invalidate(cUri); |
{ |
@@ -304,9 +303,80 @@ b() { |
_assertLibraryUris(program, |
includes: [aUri, bUri, cUri], |
excludes: [dUri, Uri.parse('dart:core')]); |
+ // While a.dart and b.dart are is included (VM needs them), they were not |
+ // recompiled, because the change to c.dart was in the function body. |
+ _assertCompiledUris([cUri]); |
} |
} |
+ test_compile_recompileMixin() async { |
+ writeFile('/test/.packages', 'test:lib/'); |
+ String aPath = '/test/lib/a.dart'; |
+ String bPath = '/test/lib/b.dart'; |
+ String cPath = '/test/lib/c.dart'; |
+ |
+ Uri aUri = writeFile( |
+ aPath, |
+ r''' |
+import 'b.dart'; |
+main() { |
+ new B().foo(); |
+} |
+'''); |
+ Uri bUri = writeFile( |
+ bPath, |
+ r''' |
+import 'c.dart'; |
+class B extends Object with C {} |
+'''); |
+ Uri cUri = writeFile( |
+ cPath, |
+ r''' |
+class C { |
+ void foo() { |
+ print(0); |
+ } |
+} |
+'''); |
+ |
+ { |
+ Program program = await getInitialState(aUri); |
+ _assertLibraryUris(program, |
+ includes: [aUri, bUri, cUri, Uri.parse('dart:core')]); |
+ } |
+ |
+ // Update c.dart and compute the delta. |
+ // Includes: c.dart, b.dart and a.dart files. |
+ // Compiled: c.dart (changed) and b.dart (has mixin), but not a.dart file. |
+ writeFile( |
+ cPath, |
+ r''' |
+class C { |
+ void foo() { |
+ print(1); |
+ } |
+} |
+'''); |
+ incrementalKernelGenerator.invalidate(cUri); |
+ { |
+ DeltaProgram delta = await incrementalKernelGenerator.computeDelta(); |
+ Program program = delta.newProgram; |
+ _assertLibraryUris(program, |
+ includes: [aUri, bUri, cUri], excludes: [Uri.parse('dart:core')]); |
+ // Compiled: c.dart (changed), and b.dart (has mixin). |
+ _assertCompiledUris([cUri, bUri]); |
+ } |
+ } |
+ |
+ void _assertCompiledUris(Iterable<Uri> expected) { |
+ var compiledCycles = incrementalKernelGenerator.test.compiledCycles; |
+ Set<Uri> compiledUris = compiledCycles |
+ .map((cycle) => cycle.libraries.map((file) => file.uri)) |
+ .expand((uris) => uris) |
+ .toSet(); |
+ expect(compiledUris, unorderedEquals(expected)); |
+ } |
+ |
test_compile_typedef() async { |
writeFile('/test/.packages', 'test:lib/'); |
String aPath = '/test/lib/a.dart'; |