| Index: pkg/front_end/test/fasta/shaker_test.dart | 
| diff --git a/pkg/front_end/test/fasta/shaker_test.dart b/pkg/front_end/test/fasta/shaker_test.dart | 
| index 6c1889f362eff64df726932b96aa118b6a745d85..02543553d28bfe8bdab9574cb007591ca230110c 100644 | 
| --- a/pkg/front_end/test/fasta/shaker_test.dart | 
| +++ b/pkg/front_end/test/fasta/shaker_test.dart | 
| @@ -23,7 +23,6 @@ export 'package:testing/testing.dart' show Chain, runMe; | 
| import 'package:front_end/physical_file_system.dart'; | 
| import 'package:front_end/src/fasta/dill/dill_target.dart' show DillTarget; | 
| import 'package:front_end/src/fasta/errors.dart' show InputError; | 
| -import 'package:front_end/src/fasta/kernel/kernel_outline_shaker.dart'; | 
| import 'package:front_end/src/fasta/kernel/kernel_target.dart' | 
| show KernelTarget; | 
| import 'package:front_end/src/fasta/kernel/verifier.dart' show verifyProgram; | 
| @@ -66,8 +65,8 @@ class TreeShakerContext extends ChainContext { | 
| ]; | 
|  | 
| Program loadPlatformOutline() { | 
| -    // Note: we rebuild the platform outline on every test because the | 
| -    // tree-shaker mutates the in-memory representation of the program without | 
| +    // Note: we rebuild the platform outline on every test because the compiler | 
| +    // currently mutates the in-memory representation of the program without | 
| // cloning it. | 
| return loadProgramFromBytes(outlineBytes); | 
| } | 
| @@ -108,15 +107,31 @@ class BuildProgram | 
| await dillTarget.buildOutlines(); | 
|  | 
| var inputUri = description.uri; | 
| + | 
| +      /// We treat the lib.dart library as a special dependency that was | 
| +      /// previously built. To do so, we build it and append it back to the | 
| +      /// dillTarget before building the actual test. | 
| var libUri = inputUri.resolve('lib/lib.dart'); | 
| sourceTarget.read(libUri); | 
| +      dillTarget.loader.appendLibraries( | 
| +          await sourceTarget.buildOutlines(), (uri) => uri == libUri); | 
| + | 
| +      /// This new KernelTarget contains only sources from the test without | 
| +      /// lib.dart. | 
| +      sourceTarget = new KernelTarget( | 
| +          PhysicalFileSystem.instance, dillTarget, context.uriTranslator); | 
| + | 
| +      await dillTarget.buildOutlines(); | 
| sourceTarget.read(inputUri); | 
| var contents = new File.fromUri(inputUri).readAsStringSync(); | 
| var showCoreLibraries = contents.contains("@@SHOW_CORE_LIBRARIES@@"); | 
| + | 
| await sourceTarget.buildOutlines(); | 
| -      var program = await sourceTarget.buildProgram(); | 
| -      bool isIncluded(Uri uri) => !_isTreeShaken(uri); | 
| -      trimProgram(program, isIncluded); | 
| +      // Note: We run the tree-shaker as a separate step on this suite to be | 
| +      // able to specify what libraries to tree shake (by default only the code | 
| +      // in the dillTarget gets tree-shaken). We could apply the tree-shaker | 
| +      // twice, but that seems unnecessary. | 
| +      var program = await sourceTarget.buildProgram(trimDependencies: true); | 
| return pass(new _IntermediateData(inputUri, program, showCoreLibraries)); | 
| } on InputError catch (e, s) { | 
| return fail(null, e.error, s); | 
| @@ -148,10 +163,18 @@ class CheckShaker extends Step<_IntermediateData, String, ChainContext> { | 
|  | 
| String get name => "match shaker expectation"; | 
|  | 
| +  /// Tree-shake dart:* libraries and the library under [_specialLibraryPath]. | 
| +  bool _isTreeShaken(Uri uri) => | 
| +      uri.isScheme('dart') || | 
| +      Uri.base.resolveUri(uri).path.endsWith(_specialLibraryPath); | 
| + | 
| Future<Result<String>> run( | 
| _IntermediateData data, ChainContext context) async { | 
| String actualResult; | 
| -    var entryUri = data.uri; | 
| +    var entryUri = data.program.libraries | 
| +        .firstWhere((l) => !l.importUri.isScheme('dart')) | 
| +        .importUri; | 
| + | 
| var program = data.program; | 
|  | 
| var errors = verifyProgram(program, isOutline: false); | 
| @@ -221,8 +244,3 @@ $buffer"""); | 
| /// A special library used only to test the shaker. The suite above will | 
| /// tree-shake the contents of this library. | 
| const _specialLibraryPath = 'pkg/front_end/testcases/shaker/lib/lib.dart'; | 
| - | 
| -/// Tree-shake dart:* libraries and the library under [_specialLibraryPath]. | 
| -bool _isTreeShaken(Uri uri) => | 
| -    uri.isScheme('dart') || | 
| -    Uri.base.resolveUri(uri).path.endsWith(_specialLibraryPath); | 
|  |