[tools] Remove patch_sdk tool which is no longer used.

This tool has not been used ever since Fasta learned to parse and apply
patch files directly.

Change-Id: Idfa2a65d106279f208e48ece9967d39d72b6faeb
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/106911
Auto-Submit: Vyacheslav Egorov <vegorov@google.com>
Reviewed-by: Kevin Millikin <kmillikin@google.com>
Commit-Queue: Vyacheslav Egorov <vegorov@google.com>
diff --git a/tools/patch_sdk.dart b/tools/patch_sdk.dart
deleted file mode 100644
index b0ef7d7..0000000
--- a/tools/patch_sdk.dart
+++ /dev/null
@@ -1,831 +0,0 @@
-#!/usr/bin/env dart
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/// Command line tool to merge the SDK libraries and our patch files.
-/// This is currently designed as an offline tool, but we could automate it.
-
-import 'dart:io';
-import 'dart:isolate' show RawReceivePort;
-import 'dart:async';
-import 'dart:math' as math;
-import 'dart:convert' show jsonEncode;
-
-// ignore: deprecated_member_use
-import 'package:analyzer/analyzer.dart'
-    show parseCompilationUnit, parseDirectives;
-import 'package:analyzer/dart/ast/ast.dart';
-import 'package:analyzer/dart/ast/visitor.dart';
-import 'package:analyzer/src/generated/sdk.dart';
-import 'package:compiler/src/kernel/dart2js_target.dart' show Dart2jsTarget;
-import 'package:path/path.dart' as path;
-import 'package:front_end/src/api_prototype/front_end.dart';
-import 'package:front_end/src/base/processed_options.dart';
-import 'package:front_end/src/kernel_generator_impl.dart';
-import 'package:front_end/src/fasta/util/relativize.dart' show relativizeUri;
-import 'package:front_end/src/fasta/get_dependencies.dart' show getDependencies;
-import 'package:front_end/src/fasta/kernel/utils.dart'
-    show writeComponentToFile;
-import 'package:kernel/target/targets.dart';
-import 'package:vm/target/vm.dart' show VmTarget;
-import 'package:vm/target/flutter.dart' show FlutterTarget;
-
-/// Set of input files that were read by this script to generate patched SDK.
-/// We will dump it out into the depfile for ninja to use.
-///
-/// For more information see GN and Ninja references:
-///    https://chromium.googlesource.com/chromium/src/+/56807c6cb383140af0c03da8f6731d77785d7160/tools/gn/docs/reference.md#depfile_string_File-name-for-input-dependencies-for-actions
-///    https://ninja-build.org/manual.html#_depfile
-///
-final deps = new Set<Uri>();
-
-/// Create [File] object from the given path and register it as a dependency.
-File getInputFile(String path, {canBeMissing: false}) {
-  final file = new File(path);
-  if (!file.existsSync()) {
-    if (!canBeMissing)
-      throw "patch_sdk.dart expects all inputs to exist, missing: $path";
-    return null;
-  }
-  deps.add(Uri.base.resolveUri(file.uri));
-  return file;
-}
-
-/// Read the given file synchronously as a string and register this path as
-/// a dependency.
-String readInputFile(String path, {canBeMissing: false}) =>
-    getInputFile(path, canBeMissing: canBeMissing)?.readAsStringSync();
-
-Future main(List<String> argv) async {
-  var port = new RawReceivePort();
-  try {
-    await _main(argv);
-  } finally {
-    port.close();
-  }
-}
-
-void usage(String mode) {
-  var base = path.fromUri(Platform.script);
-  final self = path.relative(base);
-  print('Usage: $self $mode SDK_DIR PATCH_DIR OUTPUT_DIR PACKAGES');
-
-  final repositoryDir = path.relative(path.dirname(path.dirname(base)));
-  final sdkExample = path.relative(path.join(repositoryDir, 'sdk'));
-  final patchExample = path.relative(
-      path.join(repositoryDir, 'out', 'DebugX64', 'obj', 'gen', 'patch'));
-  final outExample = path.relative(
-      path.join(repositoryDir, 'out', 'DebugX64', 'obj', 'gen', 'patched_sdk'));
-  final packagesExample = path.relative(path.join(repositoryDir, '.packages'));
-  print('For example:');
-  print('\$ $self vm $sdkExample $patchExample $outExample $packagesExample');
-
-  exit(1);
-}
-
-const validModes = const ['vm', 'flutter', 'runner'];
-String mode;
-bool get forVm => mode == 'vm';
-bool get forFlutter => mode == 'flutter';
-bool get forRunner => mode == 'runner';
-
-Future _main(List<String> argv) async {
-  if (argv.isEmpty) usage('[${validModes.join('|')}]');
-  mode = argv.first;
-  if (!validModes.contains(mode)) usage('[${validModes.join('|')}]');
-  if (argv.length != 5) usage(mode);
-
-  var input = argv[1];
-  var sdkLibIn = path.join(input, 'lib');
-  var patchIn = argv[2];
-  var outDir = argv[3];
-  var outDirUri = Uri.base.resolveUri(new Uri.directory(outDir));
-  var sdkOut = path.join(outDir, 'lib');
-  var packagesFile = argv[4];
-
-  await new Directory.fromUri(outDirUri).delete(recursive: true);
-
-  // Parse libraries.dart
-  var libContents = readInputFile(path.join(
-      sdkLibIn, '_internal', 'sdk_library_metadata', 'lib', 'libraries.dart'));
-  libContents = _updateLibraryMetadata(sdkOut, libContents);
-  var sdkLibraries = _getSdkLibraries(libContents);
-
-  var locations = <String, Map<String, String>>{};
-
-  // Enumerate core libraries and apply patches
-  for (SdkLibrary library in sdkLibraries) {
-    if (library.isDart2JsLibrary) continue;
-    _applyPatch(library, sdkLibIn, patchIn, sdkOut, locations);
-  }
-
-  _copyExtraLibraries(sdkOut, locations);
-
-  final Uri platform = outDirUri.resolve('platform.dill.tmp');
-  final Uri librariesJson = outDirUri.resolve("lib/libraries.json");
-  final Uri packages = Uri.base.resolveUri(new Uri.file(packagesFile));
-  TargetFlags flags = new TargetFlags(legacyMode: true);
-  Target target;
-
-  switch (mode) {
-    case 'vm':
-      target = new VmTarget(flags);
-      break;
-
-    case 'flutter':
-    case 'flutter_release':
-      target = new FlutterTarget(flags);
-      break;
-
-    case 'dart2js':
-      target = new Dart2jsTarget("dart2js", flags);
-      break;
-
-    default:
-      throw "Unknown mode: $mode";
-  }
-
-  _writeSync(
-      librariesJson.toFilePath(),
-      jsonEncode({
-        mode: {"libraries": locations}
-      }));
-
-  await compilePlatform(outDirUri, target, packages, platform);
-
-  // We generate a dependency file for GN to properly regenerate the patched sdk
-  // folder, outline.dill and platform.dill files when necessary: either when
-  // the sdk sources change or when this script is updated. In particular:
-  //
-  //  - sdk changes: we track the actual sources we are compiling. If we are
-  //    building the dart2js sdk, this includes the dart2js-specific patch
-  //    files.
-  //
-  //    These files are tracked by [deps] and passed below to [writeDepsFile] in
-  //    the extraDependencies argument.
-  //
-  //  - script updates: we track this script file and any code it imports (even
-  //    sdk libraries). Note that this script runs on the standalone VM, so any
-  //    sdk library used by this script indirectly depends on a VM-specific
-  //    patch file.
-  //
-  //    These set of files is discovered by `getDependencies` below, and the
-  //    [platformForDeps] is always the VM-specific `platform.dill` file.
-  var platformForDeps = platform;
-  var sdkDir = outDirUri;
-  if (forFlutter || forRunner) {
-    // Note: this fails if `$root_out_dir/vm_platform.dill` doesn't exist.  The
-    // target to build the flutter patched sdk depends on
-    // //runtime/vm:kernel_platform_files to ensure this file exists.
-    platformForDeps = outDirUri.resolve('../vm_platform.dill');
-    sdkDir = null;
-  }
-  deps.addAll(await getDependencies(Platform.script,
-      sdk: sdkDir, packages: packages, platform: platformForDeps));
-  await writeDepsFile(
-      librariesJson, Uri.base.resolveUri(new Uri.file("$outDir.d")), deps);
-}
-
-/// Generates an outline.dill and platform.dill file containing the result of
-/// compiling a platform's SDK.
-///
-/// Returns a list of dependencies read by the compiler. This list can be used
-/// to create GN dependency files.
-Future<List<Uri>> compilePlatform(
-    Uri patchedSdk, Target target, Uri packages, Uri output) async {
-  var options = new CompilerOptions()
-    ..setExitCodeOnProblem = true
-    ..legacyMode = true
-    ..compileSdk = true
-    ..sdkRoot = patchedSdk
-    ..packagesFileUri = packages
-    ..target = target;
-
-  var inputs = [Uri.parse('dart:core')];
-  var result = await generateKernel(
-      new ProcessedOptions(options: options, inputs: inputs),
-      buildSummary: true,
-      buildComponent: true);
-  await writeComponentToFile(result.component, output);
-  return result.deps;
-}
-
-Future writeDepsFile(
-    Uri output, Uri depsFile, Iterable<Uri> allDependencies) async {
-  if (allDependencies.isEmpty) return;
-  String toRelativeFilePath(Uri uri) {
-    // Ninja expects to find file names relative to the current working
-    // directory. We've tried making them relative to the deps file, but that
-    // doesn't work for downstream projects. Making them absolute also
-    // doesn't work.
-    //
-    // We can test if it works by running ninja twice, for example:
-    //
-    //     ninja -C xcodebuild/ReleaseX64 runtime_kernel -d explain
-    //     ninja -C xcodebuild/ReleaseX64 runtime_kernel -d explain
-    //
-    // The second time, ninja should say:
-    //
-    //     ninja: Entering directory `xcodebuild/ReleaseX64'
-    //     ninja: no work to do.
-    //
-    // It's broken if it says something like this:
-    //
-    //     ninja explain: expected depfile 'patched_sdk.d' to mention
-    //     'patched_sdk/platform.dill', got
-    //     '/.../xcodebuild/ReleaseX64/patched_sdk/platform.dill'
-    return Uri.parse(relativizeUri(uri, base: Uri.base)).toFilePath();
-  }
-
-  StringBuffer sb = new StringBuffer();
-  sb.write(toRelativeFilePath(output));
-  sb.write(":");
-  for (Uri uri in allDependencies) {
-    sb.write(" ");
-    sb.write(toRelativeFilePath(uri));
-  }
-  sb.writeln();
-  await new File.fromUri(depsFile).writeAsString("$sb");
-}
-
-/// Updates the contents of
-/// sdk/lib/_internal/sdk_library_metadata/lib/libraries.dart to include
-/// declarations for vm internal libraries.
-String _updateLibraryMetadata(String sdkOut, String libContents) {
-  if (!forVm && !forFlutter && !forRunner) return libContents;
-  var extraLibraries = new StringBuffer();
-  extraLibraries.write('''
-  "_builtin": const LibraryInfo(
-      "_builtin/_builtin.dart",
-      categories: "Client,Server",
-      implementation: true,
-      documented: false,
-      platforms: VM_PLATFORM),
-
-  "profiler": const LibraryInfo(
-      "profiler/profiler.dart",
-      maturity: Maturity.DEPRECATED,
-      documented: false),
-
-  "_vmservice": const LibraryInfo(
-      "vmservice/vmservice.dart",
-      categories: "Client,Server",
-      implementation: true,
-      documented: false,
-      platforms: VM_PLATFORM),
-
-  "vmservice_io": const LibraryInfo(
-      "vmservice_io/vmservice_io.dart",
-      categories: "Client,Server",
-      implementation: true,
-      documented: false,
-      platforms: VM_PLATFORM),
-  ''');
-
-  if (forFlutter) {
-    extraLibraries.write('''
-      "ui": const LibraryInfo(
-          "ui/ui.dart",
-          categories: "Client,Server",
-          implementation: true,
-          documented: false,
-          platforms: VM_PLATFORM),
-  ''');
-  }
-
-  if (forRunner) {
-    extraLibraries.write('''
-      "fuchsia.builtin": const LibraryInfo(
-          "fuchsia.builtin/builtin.dart",
-          categories: "Client,Server",
-          implementation: true,
-          documented: false,
-          platforms: VM_PLATFORM),
-  ''');
-    extraLibraries.write('''
-      "zircon": const LibraryInfo(
-          "zircon/zircon.dart",
-          categories: "Client,Server",
-          implementation: true,
-          documented: false,
-          platforms: VM_PLATFORM),
-  ''');
-    extraLibraries.write('''
-      "fuchsia": const LibraryInfo(
-          "fuchsia/fuchsia.dart",
-          categories: "Client,Server",
-          implementation: true,
-          documented: false,
-          platforms: VM_PLATFORM),
-  ''');
-  }
-
-  libContents = libContents.replaceAll(
-      ' libraries = const {', ' libraries = const { $extraLibraries');
-  _writeSync(
-      path.join(
-          sdkOut, '_internal', 'sdk_library_metadata', 'lib', 'libraries.dart'),
-      libContents);
-  return libContents;
-}
-
-/// Copy internal libraries that are developed outside the sdk folder into the
-/// patched_sdk folder. For the VM< this includes files under 'runtime/bin/',
-/// for flutter, this is includes also the ui library.
-_copyExtraLibraries(String sdkOut, Map<String, Map<String, String>> locations) {
-  var base = path.fromUri(Platform.script);
-  var dartDir = path.dirname(path.dirname(path.absolute(base)));
-
-  var builtinLibraryIn = path.join(dartDir, 'runtime', 'bin', 'builtin.dart');
-  var builtinLibraryOut = path.join(sdkOut, '_builtin', '_builtin.dart');
-  _writeSync(builtinLibraryOut, readInputFile(builtinLibraryIn));
-  addLocation(locations, '_builtin', path.join('_builtin', '_builtin.dart'));
-  for (var file in ['loader.dart', 'server.dart', 'vmservice_io.dart']) {
-    var libraryIn = path.join(dartDir, 'runtime', 'bin', 'vmservice', file);
-    var libraryOut = path.join(sdkOut, 'vmservice_io', file);
-    _writeSync(libraryOut, readInputFile(libraryIn));
-  }
-  addLocation(locations, 'vmservice_io',
-      path.join('vmservice_io', 'vmservice_io.dart'));
-  addLocation(
-      locations, '_vmservice', path.join('vmservice', 'vmservice.dart'));
-
-  if (forFlutter) {
-    // Flutter repo has this layout:
-    //  engine/src/
-    //       third_party/dart/
-    //       [third_party/]flutter/
-    var srcDir = path
-        .dirname(path.dirname(path.dirname(path.dirname(path.absolute(base)))));
-    var flutterDir = new Directory(path.join(srcDir, 'flutter'));
-    if (!flutterDir.existsSync()) {
-      // In Fuchsia Flutter is under 'third_party'.
-      flutterDir = new Directory(path.join(srcDir, 'third_party', 'flutter'));
-    }
-    var uiLibraryInDir = new Directory(path.join(flutterDir.path, 'lib', 'ui'));
-    for (var file in uiLibraryInDir.listSync()) {
-      if (!file.path.endsWith('.dart')) continue;
-      var name = path.basename(file.path);
-      var uiLibraryOut = path.join(sdkOut, 'ui', name);
-      _writeSync(uiLibraryOut, readInputFile(file.path));
-    }
-    addLocation(locations, 'ui', path.join('ui', 'ui.dart'));
-  }
-
-  if (forRunner) {
-    var gnRoot = path
-        .dirname(path.dirname(path.dirname(path.dirname(path.absolute(base)))));
-
-    var builtinLibraryInDir = new Directory(
-        path.join(gnRoot, 'topaz', 'runtime', 'dart_runner', 'embedder'));
-    for (var file in builtinLibraryInDir.listSync()) {
-      if (!file.path.endsWith('.dart')) continue;
-      var name = path.basename(file.path);
-      var builtinLibraryOut = path.join(sdkOut, 'fuchsia.builtin', name);
-      _writeSync(builtinLibraryOut, readInputFile(file.path));
-    }
-    addLocation(locations, 'fuchsia.builtin',
-        path.join('fuchsia.builtin', 'builtin.dart'));
-
-    var zirconLibraryInDir = new Directory(
-        path.join(gnRoot, 'topaz', 'public', 'dart-pkg', 'zircon', 'lib'));
-    for (var file in zirconLibraryInDir.listSync(recursive: true)) {
-      if (!file.path.endsWith('.dart')) continue;
-      var name = file.path.substring(zirconLibraryInDir.path.length + 1);
-      var zirconLibraryOut = path.join(sdkOut, 'zircon', name);
-      _writeSync(zirconLibraryOut, readInputFile(file.path));
-    }
-    addLocation(locations, 'zircon', path.join('zircon', 'zircon.dart'));
-
-    var fuchsiaLibraryInDir = new Directory(
-        path.join(gnRoot, 'topaz', 'public', 'dart-pkg', 'fuchsia', 'lib'));
-    for (var file in fuchsiaLibraryInDir.listSync(recursive: true)) {
-      if (!file.path.endsWith('.dart')) continue;
-      var name = file.path.substring(fuchsiaLibraryInDir.path.length + 1);
-      var fuchsiaLibraryOut = path.join(sdkOut, 'fuchsia', name);
-      _writeSync(fuchsiaLibraryOut, readInputFile(file.path));
-    }
-    addLocation(locations, 'fuchsia', path.join('fuchsia', 'fuchsia.dart'));
-  }
-}
-
-_applyPatch(SdkLibrary library, String sdkLibIn, String patchIn, String sdkOut,
-    Map<String, Map<String, String>> locations) {
-  var libraryOut = path.join(sdkLibIn, library.path);
-  var libraryIn = libraryOut;
-
-  var libraryFile = getInputFile(libraryIn, canBeMissing: true);
-  if (libraryFile != null) {
-    addLocation(locations, Uri.parse(library.shortName).path,
-        path.relative(libraryOut, from: sdkLibIn));
-    var outPaths = <String>[libraryOut];
-    var libraryContents = libraryFile.readAsStringSync();
-
-    int inputModifyTime = libraryFile.lastModifiedSync().millisecondsSinceEpoch;
-    var partFiles = <File>[];
-    for (var part in parseDirectives(libraryContents).directives) {
-      if (part is PartDirective) {
-        var partPath = part.uri.stringValue;
-        outPaths.add(path.join(path.dirname(libraryOut), partPath));
-
-        var partFile =
-            getInputFile(path.join(path.dirname(libraryIn), partPath));
-        partFiles.add(partFile);
-        inputModifyTime = math.max(inputModifyTime,
-            partFile.lastModifiedSync().millisecondsSinceEpoch);
-      }
-    }
-
-    // See if we can find a patch file.
-    var patchPath = path.join(
-        patchIn, path.basenameWithoutExtension(libraryIn) + '_patch.dart');
-
-    var patchFile = getInputFile(patchPath, canBeMissing: true);
-    if (patchFile != null) {
-      inputModifyTime = math.max(
-          inputModifyTime, patchFile.lastModifiedSync().millisecondsSinceEpoch);
-    }
-
-    // Compute output paths
-    outPaths = outPaths
-        .map((p) => path.join(sdkOut, path.relative(p, from: sdkLibIn)))
-        .toList();
-
-    // Compare output modify time with input modify time.
-    bool needsUpdate = false;
-    for (var outPath in outPaths) {
-      var outFile = new File(outPath);
-      if (!outFile.existsSync() ||
-          outFile.lastModifiedSync().millisecondsSinceEpoch < inputModifyTime) {
-        needsUpdate = true;
-        break;
-      }
-    }
-
-    if (needsUpdate) {
-      var contents = <String>[libraryContents];
-      contents.addAll(partFiles.map((f) => f.readAsStringSync()));
-      if (patchFile != null) {
-        var patchContents = patchFile.readAsStringSync();
-        contents = _patchLibrary(patchFile.path, contents, patchContents);
-      }
-
-      for (var i = 0; i < outPaths.length; i++) {
-        _writeSync(outPaths[i], contents[i]);
-      }
-    }
-  }
-}
-
-/// Writes a file, creating the directory if needed.
-void _writeSync(String filePath, String contents) {
-  var outDir = new Directory(path.dirname(filePath));
-  if (!outDir.existsSync()) outDir.createSync(recursive: true);
-
-  new File(filePath).writeAsStringSync(contents);
-}
-
-/// Merges dart:* library code with code from *_patch.dart file.
-///
-/// Takes a list of the library's parts contents, with the main library contents
-/// first in the list, and the contents of the patch file.
-///
-/// The result will have `@patch` implementations merged into the correct place
-/// (e.g. the class or top-level function declaration) and all other
-/// declarations introduced by the patch will be placed into the main library
-/// file.
-///
-/// This is purely a syntactic transformation. Unlike dart2js patch files, there
-/// is no semantic meaning given to the *_patch files, and they do not magically
-/// get their own library scope, etc.
-///
-/// Editorializing: the dart2js approach requires a Dart front end such as
-/// package:analyzer to semantically model a feature beyond what is specified
-/// in the Dart language. Since this feature is only for the convenience of
-/// writing the dart:* libraries, and not a tool given to Dart developers, it
-/// seems like a non-ideal situation. Instead we keep the preprocessing simple.
-List<String> _patchLibrary(
-    String name, List<String> partsContents, String patchContents) {
-  var results = <StringEditBuffer>[];
-
-  // Parse the patch first. We'll need to extract bits of this as we go through
-  // the other files.
-  final patchFinder = new PatchFinder.parseAndVisit(name, patchContents);
-
-  // Merge `external` declarations with the corresponding `@patch` code.
-  for (var partContent in partsContents) {
-    var partEdits = new StringEditBuffer(partContent);
-    var partUnit = parseCompilationUnit(partContent);
-    partUnit.accept(new PatchApplier(partEdits, patchFinder));
-    results.add(partEdits);
-  }
-
-  if (patchFinder.patches.length != patchFinder.applied.length) {
-    print('Some elements marked as @patch do not have corresponding elements:');
-    for (var patched in patchFinder.patches.keys) {
-      if (!patchFinder.applied.contains(patched)) {
-        print('*** ${patched}');
-      }
-    }
-    throw "Failed to apply all @patch-es";
-  }
-
-  return new List<String>.from(results.map((e) => e.toString()));
-}
-
-final String injectedCidFields = [
-  'Array',
-  'ExternalOneByteString',
-  'GrowableObjectArray',
-  'ImmutableArray',
-  'OneByteString',
-  'TwoByteString',
-].map((name) => "static final int cid${name} = 0;").join('\n');
-
-/// Merge `@patch` declarations into `external` declarations.
-class PatchApplier extends GeneralizingAstVisitor {
-  final StringEditBuffer edits;
-  final PatchFinder patch;
-
-  bool _isLibrary = true; // until proven otherwise.
-
-  PatchApplier(this.edits, this.patch);
-
-  @override
-  visitCompilationUnit(CompilationUnit node) {
-    super.visitCompilationUnit(node);
-    if (_isLibrary) _mergeUnpatched(node);
-  }
-
-  void _merge(AstNode node, int pos) {
-    var code = patch.contents.substring(node.offset, node.end);
-
-    // We inject a number of static fields into dart:internal.ClassID class.
-    // These fields represent various VM class ids and are only used to
-    // make core libraries compile. Kernel reader will actually ignore these
-    // fields and instead inject concrete constants into this class.
-    if (node is ClassDeclaration && node.name.name == 'ClassID') {
-      code = code.replaceFirst(new RegExp(r'}$'), injectedCidFields + '}');
-    }
-    edits.insert(pos, '\n' + code);
-  }
-
-  /// Merges directives and declarations that are not `@patch` into the library.
-  void _mergeUnpatched(CompilationUnit unit) {
-    // Merge imports from the patch
-    // TODO(jmesserly): remove duplicate imports
-
-    // To patch a library, we must have a library directive
-    var libDir = unit.directives.first as LibraryDirective;
-    int importPos = unit.directives
-        .lastWhere((d) => d is ImportDirective, orElse: () => libDir)
-        .end;
-    for (var d in patch.unit.directives.where((d) => d is ImportDirective)) {
-      _merge(d, importPos);
-    }
-
-    int partPos = unit.directives.last.end;
-    for (var d in patch.unit.directives.where((d) => d is PartDirective)) {
-      _merge(d, partPos);
-    }
-
-    // Merge declarations from the patch
-    int declPos = edits.original.length;
-    for (var d in patch.mergeDeclarations) {
-      _merge(d, declPos);
-    }
-  }
-
-  @override
-  visitPartOfDirective(PartOfDirective node) {
-    _isLibrary = false;
-  }
-
-  @override
-  visitFunctionDeclaration(FunctionDeclaration node) {
-    _maybePatch(node);
-  }
-
-  /// Merge patches and extensions into the class
-  @override
-  visitClassDeclaration(ClassDeclaration node) {
-    node.members.forEach(_maybePatch);
-
-    var mergeMembers = patch.mergeMembers[_qualifiedName(node)];
-    if (mergeMembers == null) return;
-
-    // Merge members from the patch
-    var pos = node.members.last.end;
-    for (var member in mergeMembers) {
-      var code = patch.contents.substring(member.offset, member.end);
-      edits.insert(pos, '\n\n  ' + code);
-    }
-  }
-
-  void _maybePatch(AstNode node) {
-    if (node is FieldDeclaration) return;
-
-    var externalKeyword = (node as dynamic).externalKeyword;
-
-    var name = _qualifiedName(node);
-    var patchNode = patch.patches[name];
-    if (patchNode == null) {
-      if (externalKeyword != null) {
-        print('warning: patch not found for $name: $node');
-        exitCode = 1;
-      }
-      return;
-    }
-    patch.applied.add(name);
-
-    Annotation patchMeta = patchNode.metadata.lastWhere(_isPatchAnnotation);
-    int start = patchMeta.endToken.next.offset;
-    var code = patch.contents.substring(start, patchNode.end);
-
-    // For some node like static fields, the node's offset doesn't include
-    // the external keyword. Also starting from the keyword lets us preserve
-    // documentation comments.
-    edits.replace(externalKeyword?.offset ?? node.offset, node.end, code);
-  }
-}
-
-class PatchFinder extends GeneralizingAstVisitor {
-  final String contents;
-  final CompilationUnit unit;
-
-  final Map patches = <String, Declaration>{};
-  final Map mergeMembers = <String, List<ClassMember>>{};
-  final List mergeDeclarations = <CompilationUnitMember>[];
-  final Set<String> applied = new Set<String>();
-
-  PatchFinder.parseAndVisit(String name, String contents)
-      : contents = contents,
-        unit = parseCompilationUnit(contents, name: name) {
-    visitCompilationUnit(unit);
-  }
-
-  @override
-  visitCompilationUnitMember(CompilationUnitMember node) {
-    mergeDeclarations.add(node);
-  }
-
-  @override
-  visitClassDeclaration(ClassDeclaration node) {
-    if (_isPatch(node)) {
-      var members = <ClassMember>[];
-      for (var member in node.members) {
-        if (_isPatch(member)) {
-          patches[_qualifiedName(member)] = member;
-        } else {
-          members.add(member);
-        }
-      }
-      if (members.isNotEmpty) {
-        mergeMembers[_qualifiedName(node)] = members;
-      }
-    } else {
-      mergeDeclarations.add(node);
-    }
-  }
-
-  @override
-  visitFunctionDeclaration(FunctionDeclaration node) {
-    if (_isPatch(node)) {
-      patches[_qualifiedName(node)] = node;
-    } else {
-      mergeDeclarations.add(node);
-    }
-  }
-
-  @override
-  visitFunctionBody(node) {} // skip method bodies
-}
-
-String _qualifiedName(Declaration node) {
-  var parent = node.parent;
-  var className = '';
-  if (parent is ClassDeclaration) {
-    className = parent.name.name + '.';
-  }
-  var name = (node as dynamic).name;
-  name = (name != null ? name.name : '');
-
-  var accessor = '';
-  if (node is MethodDeclaration) {
-    if (node.isGetter)
-      accessor = 'get:';
-    else if (node.isSetter) accessor = 'set:';
-  }
-  return className + accessor + name;
-}
-
-bool _isPatch(AnnotatedNode node) => node.metadata.any(_isPatchAnnotation);
-
-bool _isPatchAnnotation(Annotation m) =>
-    m.name.name == 'patch' && m.constructorName == null && m.arguments == null;
-
-/// Editable string buffer.
-///
-/// Applies a series of edits (insertions, removals, replacements) using
-/// original location information, and composes them into the edited string.
-///
-/// For example, starting with a parsed AST with original source locations,
-/// this type allows edits to be made without regards to other edits.
-class StringEditBuffer {
-  final String original;
-  final _edits = <_StringEdit>[];
-
-  /// Creates a new transaction.
-  StringEditBuffer(this.original);
-
-  bool get hasEdits => _edits.length > 0;
-
-  /// Edit the original text, replacing text on the range [begin] and
-  /// exclusive [end] with the [replacement] string.
-  void replace(int begin, int end, String replacement) {
-    _edits.add(new _StringEdit(begin, end, replacement));
-  }
-
-  /// Insert [string] at [offset].
-  /// Equivalent to `replace(offset, offset, string)`.
-  void insert(int offset, String string) => replace(offset, offset, string);
-
-  /// Remove text from the range [begin] to exclusive [end].
-  /// Equivalent to `replace(begin, end, '')`.
-  void remove(int begin, int end) => replace(begin, end, '');
-
-  /// Applies all pending [edit]s and returns a new string.
-  ///
-  /// This method is non-destructive: it does not discard existing edits or
-  /// change the [original] string. Further edits can be added and this method
-  /// can be called again.
-  ///
-  /// Throws [UnsupportedError] if the edits were overlapping. If no edits were
-  /// made, the original string will be returned.
-  String toString() {
-    var sb = new StringBuffer();
-    if (_edits.length == 0) return original;
-
-    // Sort edits by start location.
-    _edits.sort();
-
-    int consumed = 0;
-    for (var edit in _edits) {
-      if (consumed > edit.begin) {
-        sb = new StringBuffer();
-        sb.write('overlapping edits. Insert at offset ');
-        sb.write(edit.begin);
-        sb.write(' but have consumed ');
-        sb.write(consumed);
-        sb.write(' input characters. List of edits:');
-        for (var e in _edits) {
-          sb.write('\n    ');
-          sb.write(e);
-        }
-        throw new UnsupportedError(sb.toString());
-      }
-
-      // Add characters from the original string between this edit and the last
-      // one, if any.
-      var betweenEdits = original.substring(consumed, edit.begin);
-      sb.write(betweenEdits);
-      sb.write(edit.replace);
-      consumed = edit.end;
-    }
-
-    // Add any text from the end of the original string that was not replaced.
-    sb.write(original.substring(consumed));
-    return sb.toString();
-  }
-}
-
-class _StringEdit implements Comparable<_StringEdit> {
-  final int begin;
-  final int end;
-  final String replace;
-
-  _StringEdit(this.begin, this.end, this.replace);
-
-  int get length => end - begin;
-
-  String toString() => '(Edit @ $begin,$end: "$replace")';
-
-  int compareTo(_StringEdit other) {
-    int diff = begin - other.begin;
-    if (diff != 0) return diff;
-    return end - other.end;
-  }
-}
-
-List<SdkLibrary> _getSdkLibraries(String contents) {
-  var libraryBuilder = new SdkLibrariesReader_LibraryBuilder(false);
-  parseCompilationUnit(contents).accept(libraryBuilder);
-  return libraryBuilder.librariesMap.sdkLibraries;
-}
-
-void addLocation(Map<String, Map<String, String>> locations, String libraryName,
-    String libraryPath) {
-  assert(locations[libraryName] == null);
-  locations[libraryName] = {'uri': '${path.toUri(libraryPath)}'};
-}
diff --git a/utils/compiler/BUILD.gn b/utils/compiler/BUILD.gn
index f40512c..07e8087 100644
--- a/utils/compiler/BUILD.gn
+++ b/utils/compiler/BUILD.gn
@@ -3,7 +3,6 @@
 # BSD-style license that can be found in the LICENSE file.
 
 import("../../utils/compile_platform.gni")
-import("../../utils/generate_patch_sdk.gni")
 import("../create_timestamp.gni")
 import("../application_snapshot.gni")
 
diff --git a/utils/generate_patch_sdk.gni b/utils/generate_patch_sdk.gni
deleted file mode 100644
index f947fb9..0000000
--- a/utils/generate_patch_sdk.gni
+++ /dev/null
@@ -1,51 +0,0 @@
-# Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
-# for details. All rights reserved. Use of this source code is governed by a
-# BSD-style license that can be found in the LICENSE file.
-
-import("../build/dart/dart_action.gni")
-
-_dart_root = get_path_info("..", "abspath")
-
-# Template to generate a patched_sdk folder.
-#
-# This template expects four arguments:
-#   - mode: vm or dart2js (whether to build an sdk for the vm or for dart2js)
-#   - input_patches_dir: directory containing the input library files.
-#   - patched_sdk_dir: the output location
-#   - deps: extra dependencies that must be built ahead of time.
-template("generate_patched_sdk") {
-  assert(defined(invoker.input_patches_dir),
-         "Need input_patches_dir in $target_name")
-  assert(defined(invoker.patched_sdk_dir),
-         "Need patched_sdk_dir in $target_name")
-  assert(defined(invoker.mode), "Need mode in $target_name")
-
-  prebuilt_dart_action(target_name) {
-    forward_variables_from(invoker, [
-      "deps",
-    ])
-
-    depfile = "$root_out_dir/${target_name}_patched_sdk.d"
-
-    script = "$_dart_root/tools/patch_sdk.dart"
-
-    if (defined(invoker.outputs)) {
-      outputs = invoker.outputs
-    } else {
-      outputs = [
-        # Instead of listing all outputs we list those consumed by
-        # other BUILD rules.
-        "$root_out_dir/${invoker.patched_sdk_dir}/platform.dill",
-        "$root_out_dir/${invoker.patched_sdk_dir}/outline.dill",
-      ]
-    }
-
-    args = [
-      invoker.mode,
-      rebase_path("$_dart_root/sdk"),
-      rebase_path(invoker.input_patches_dir),
-      rebase_path("$root_out_dir/${invoker.patched_sdk_dir}", root_build_dir),
-      rebase_path("$_dart_root/.packages"),
-    ]
-  }
-}