diff --git a/pkg/analyzer/lib/src/dart/analysis/driver.dart b/pkg/analyzer/lib/src/dart/analysis/driver.dart
index 07ede06b..b90401a 100644
--- a/pkg/analyzer/lib/src/dart/analysis/driver.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/driver.dart
@@ -80,7 +80,7 @@
 /// TODO(scheglov) Clean up the list of implicitly analyzed files.
 class AnalysisDriver implements AnalysisDriverGeneric {
   /// The version of data format, should be incremented on every format change.
-  static const int DATA_VERSION = 128;
+  static const int DATA_VERSION = 130;
 
   /// The length of the list returned by [_computeDeclaredVariablesSignature].
   static const int _declaredVariablesSignatureLength = 4;
diff --git a/pkg/analyzer/lib/src/pubspec/pubspec_validator.dart b/pkg/analyzer/lib/src/pubspec/pubspec_validator.dart
index 36d2133..140cbd2 100644
--- a/pkg/analyzer/lib/src/pubspec/pubspec_validator.dart
+++ b/pkg/analyzer/lib/src/pubspec/pubspec_validator.dart
@@ -157,7 +157,7 @@
     }
 
     for (var dependency in declaredDevDependencies.entries) {
-      var packageName = dependency.key;
+      var packageName = dependency.key as YamlNode;
       if (declaredDependencies.containsKey(packageName)) {
         _reportErrorForNode(reporter, packageName,
             PubspecWarningCode.UNNECESSARY_DEV_DEPENDENCY, [packageName.value]);
diff --git a/pkg/analyzer/lib/src/summary2/bundle_reader.dart b/pkg/analyzer/lib/src/summary2/bundle_reader.dart
index ecace4e..383977d 100644
--- a/pkg/analyzer/lib/src/summary2/bundle_reader.dart
+++ b/pkg/analyzer/lib/src/summary2/bundle_reader.dart
@@ -630,51 +630,60 @@
     if (tag == Tag.NullType) {
       return null;
     } else if (tag == Tag.DynamicType) {
-      return DynamicTypeImpl.instance;
+      var type = DynamicTypeImpl.instance;
+      return _readAliasElementArguments(type);
     } else if (tag == Tag.FunctionType) {
-      return _readFunctionType();
+      var type = _readFunctionType();
+      return _readAliasElementArguments(type);
     } else if (tag == Tag.InterfaceType) {
       var element = nextElement() as ClassElement;
       var typeArguments = _readTypeList();
       var nullability = _readNullability();
-      return InterfaceTypeImpl(
+      var type = InterfaceTypeImpl(
         element: element,
         typeArguments: typeArguments,
         nullabilitySuffix: nullability,
       );
+      return _readAliasElementArguments(type);
     } else if (tag == Tag.InterfaceType_noTypeArguments_none) {
       var element = nextElement() as ClassElement;
-      return InterfaceTypeImpl(
+      var type = InterfaceTypeImpl(
         element: element,
         typeArguments: const <DartType>[],
         nullabilitySuffix: NullabilitySuffix.none,
       );
+      return _readAliasElementArguments(type);
     } else if (tag == Tag.InterfaceType_noTypeArguments_question) {
       var element = nextElement() as ClassElement;
-      return InterfaceTypeImpl(
+      var type = InterfaceTypeImpl(
         element: element,
         typeArguments: const <DartType>[],
         nullabilitySuffix: NullabilitySuffix.question,
       );
+      return _readAliasElementArguments(type);
     } else if (tag == Tag.InterfaceType_noTypeArguments_star) {
       var element = nextElement() as ClassElement;
-      return InterfaceTypeImpl(
+      var type = InterfaceTypeImpl(
         element: element,
         typeArguments: const <DartType>[],
         nullabilitySuffix: NullabilitySuffix.star,
       );
+      return _readAliasElementArguments(type);
     } else if (tag == Tag.NeverType) {
       var nullability = _readNullability();
-      return NeverTypeImpl.instance.withNullability(nullability);
+      var type = NeverTypeImpl.instance.withNullability(nullability);
+      return _readAliasElementArguments(type);
     } else if (tag == Tag.TypeParameterType) {
       var element = nextElement() as TypeParameterElement;
       var nullability = _readNullability();
-      return TypeParameterTypeImpl(
+      var type = TypeParameterTypeImpl(
         element: element,
         nullabilitySuffix: nullability,
       );
+      return _readAliasElementArguments(type);
     } else if (tag == Tag.VoidType) {
-      return VoidTypeImpl.instance;
+      var type = VoidTypeImpl.instance;
+      return _readAliasElementArguments(type);
     } else {
       throw UnimplementedError('$tag');
     }
@@ -711,6 +720,40 @@
     }
   }
 
+  DartType _readAliasElementArguments(DartType type) {
+    var aliasElement = _readRawElement();
+    if (aliasElement is TypeAliasElement) {
+      var aliasArguments = _readTypeList();
+      if (type is DynamicType) {
+        // TODO(scheglov) add support for `dynamic` aliasing
+        return type;
+      } else if (type is FunctionType) {
+        return FunctionTypeImpl(
+          typeFormals: type.typeFormals,
+          parameters: type.parameters,
+          returnType: type.returnType,
+          nullabilitySuffix: type.nullabilitySuffix,
+          aliasElement: aliasElement,
+          aliasArguments: aliasArguments,
+        );
+      } else if (type is InterfaceType) {
+        return InterfaceTypeImpl(
+          element: type.element,
+          typeArguments: type.typeArguments,
+          nullabilitySuffix: type.nullabilitySuffix,
+          aliasElement: aliasElement,
+          aliasArguments: aliasArguments,
+        );
+      } else if (type is VoidType) {
+        // TODO(scheglov) add support for `void` aliasing
+        return type;
+      } else {
+        throw UnimplementedError('${type.runtimeType}');
+      }
+    }
+    return type;
+  }
+
   /// TODO(scheglov) Optimize for write/read of types without type parameters.
   FunctionType _readFunctionType() {
     var typeParameters = <TypeParameterElement>[];
@@ -727,9 +770,6 @@
       element.bound = bound;
     }
 
-    var aliasElement = nextElement() as TypeAliasElement?;
-    var aliasArguments = aliasElement != null ? _readTypeList() : null;
-
     var returnType = nextType()!;
 
     var formalParameters = <ParameterElement>[];
@@ -756,8 +796,6 @@
       parameters: formalParameters,
       returnType: returnType,
       nullabilitySuffix: nullability,
-      aliasElement: aliasElement,
-      aliasArguments: aliasArguments,
     );
   }
 
diff --git a/pkg/analyzer/lib/src/summary2/bundle_writer.dart b/pkg/analyzer/lib/src/summary2/bundle_writer.dart
index 687b4f2..9f0dbdd 100644
--- a/pkg/analyzer/lib/src/summary2/bundle_writer.dart
+++ b/pkg/analyzer/lib/src/summary2/bundle_writer.dart
@@ -427,8 +427,10 @@
       writeByte(Tag.NullType);
     } else if (type is DynamicType) {
       writeByte(Tag.DynamicType);
+      _writeTypeAliasElementArguments(type);
     } else if (type is FunctionType) {
       _writeFunctionType(type);
+      _writeTypeAliasElementArguments(type);
     } else if (type is InterfaceType) {
       var typeArguments = type.typeArguments;
       var nullabilitySuffix = type.nullabilitySuffix;
@@ -452,17 +454,20 @@
         }
         _writeNullabilitySuffix(nullabilitySuffix);
       }
+      _writeTypeAliasElementArguments(type);
     } else if (type is NeverType) {
       writeByte(Tag.NeverType);
       _writeNullabilitySuffix(type.nullabilitySuffix);
+      _writeTypeAliasElementArguments(type);
     } else if (type is TypeParameterType) {
       writeByte(Tag.TypeParameterType);
       writeElement(type.element);
       _writeNullabilitySuffix(type.nullabilitySuffix);
+      _writeTypeAliasElementArguments(type);
     } else if (type is VoidType) {
       writeByte(Tag.VoidType);
+      _writeTypeAliasElementArguments(type);
     } else {
-      // TODO
       throw UnimplementedError('${type.runtimeType}');
     }
   }
@@ -530,12 +535,6 @@
       writeType(typeParameter.bound);
     }
 
-    var aliasElement = type.aliasElement;
-    writeElement(aliasElement);
-    if (aliasElement != null) {
-      _writeTypeList(type.aliasArguments!);
-    }
-
     writeType(type.returnType);
 
     var parameters = type.parameters;
@@ -561,6 +560,14 @@
     _sink.writeUInt30(index);
   }
 
+  void _writeTypeAliasElementArguments(DartType type) {
+    var aliasElement = type.aliasElement;
+    writeElement0(aliasElement);
+    if (aliasElement != null) {
+      _writeTypeList(type.aliasArguments!);
+    }
+  }
+
   void _writeTypeList(List<DartType> types) {
     _sink.writeUInt30(types.length);
     for (var type in types) {
diff --git a/pkg/analyzer/lib/src/util/yaml.dart b/pkg/analyzer/lib/src/util/yaml.dart
index 1696085..98f91e8 100644
--- a/pkg/analyzer/lib/src/util/yaml.dart
+++ b/pkg/analyzer/lib/src/util/yaml.dart
@@ -118,8 +118,12 @@
       merged[k] = v;
     });
     m2.nodes.forEach((k, v) {
+      // TODO(srawlins): The key should always be a [YamlNode], but is not (see
+      // https://pub.dev/documentation/yaml/latest/yaml/YamlMap/nodes.html).
+      // We could write an extension method which does this cast for us.
+      var value = (k as YamlNode).value;
       var mergedKey =
-          merged.keys.firstWhere((key) => key.value == k.value, orElse: () => k)
+          merged.keys.firstWhere((key) => key.value == value, orElse: () => k)
               as YamlScalar;
       var o1 = merged[mergedKey];
       if (o1 != null) {
diff --git a/pkg/analyzer/lib/src/workspace/package_build.dart b/pkg/analyzer/lib/src/workspace/package_build.dart
index 09a3446..8f09c11 100644
--- a/pkg/analyzer/lib/src/workspace/package_build.dart
+++ b/pkg/analyzer/lib/src/workspace/package_build.dart
@@ -287,7 +287,7 @@
       // pubspec, to know the package name that package:build will assume.
       if (dartToolBuildDir.exists && pubspec.exists) {
         try {
-          final yaml = loadYaml(pubspec.readAsStringSync());
+          final yaml = loadYaml(pubspec.readAsStringSync()) as YamlMap;
           final packageName = yaml['name'] as String;
           final generatedRootPath = provider.pathContext
               .joinAll([folder.path, ..._generatedPathParts]);
diff --git a/pkg/analyzer/test/src/summary/element_text.dart b/pkg/analyzer/test/src/summary/element_text.dart
index 69609aa..a159287 100644
--- a/pkg/analyzer/test/src/summary/element_text.dart
+++ b/pkg/analyzer/test/src/summary/element_text.dart
@@ -11,6 +11,7 @@
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/src/summary2/reference.dart';
 import 'package:analyzer/src/task/inference_error.dart';
 import 'package:test/test.dart';
 
@@ -47,6 +48,7 @@
 void checkElementText(
   LibraryElement library,
   String expected, {
+  bool withAliasElementArguments = false,
   bool withCodeRanges = false,
   bool withConstElements = true,
   bool withExportScope = false,
@@ -59,6 +61,7 @@
 }) {
   var writer = _ElementWriter(
     selfUriStr: '${library.source.uri}',
+    withAliasElementArguments: withAliasElementArguments,
     withCodeRanges: withCodeRanges,
     withConstElements: withConstElements,
     withExportScope: withExportScope,
@@ -129,6 +132,7 @@
 /// Writes the canonical text presentation of elements.
 class _ElementWriter {
   final String? selfUriStr;
+  final bool withAliasElementArguments;
   final bool withCodeRanges;
   final bool withExportScope;
   final bool withFullyResolvedAst;
@@ -144,6 +148,7 @@
 
   _ElementWriter({
     this.selfUriStr,
+    this.withAliasElementArguments = false,
     this.withCodeRanges = false,
     this.withConstElements = true,
     this.withExportScope = false,
@@ -1011,6 +1016,17 @@
   void writeType(DartType type) {
     var typeStr = _typeStr(type);
     buffer.write(typeStr);
+
+    if (withAliasElementArguments) {
+      var aliasElement = type.aliasElement;
+      if (aliasElement is TypeAliasElementImpl) {
+        buffer.write('<aliasElement: ');
+        buffer.write(_referenceToString(aliasElement.reference!));
+        var typeArguments = type.aliasArguments!;
+        writeList(', aliasArguments: [', ']', typeArguments, ', ', writeType);
+        buffer.write('>');
+      }
+    }
   }
 
   void writeType2(DartType type) {
@@ -1175,6 +1191,25 @@
     return components.join(';');
   }
 
+  String _referenceToString(Reference reference) {
+    var parent = reference.parent!;
+    if (parent.parent == null) {
+      var libraryUriStr = reference.name;
+      if (libraryUriStr == selfUriStr) {
+        return 'self';
+      }
+      return libraryUriStr;
+    }
+
+    // Ignore the unit, skip to the library.
+    if (parent.name == '@unit') {
+      return _referenceToString(parent.parent!);
+    }
+
+    var name = reference.name;
+    return _referenceToString(parent) + '::$name';
+  }
+
   String? _typeStr(DartType? type) {
     return type?.getDisplayString(
       withNullability: true,
diff --git a/pkg/analyzer/test/src/summary/resynthesize_common.dart b/pkg/analyzer/test/src/summary/resynthesize_common.dart
index 43a2c53..0598c70 100644
--- a/pkg/analyzer/test/src/summary/resynthesize_common.dart
+++ b/pkg/analyzer/test/src/summary/resynthesize_common.dart
@@ -12425,6 +12425,130 @@
 ''');
   }
 
+  @FailingTest(
+    issue: 'https://github.com/dart-lang/sdk/issues/45291',
+    reason: 'Type dynamic is special, no support for its aliases yet',
+  )
+  test_typedef_nonFunction_aliasElement_dynamic() async {
+    featureSet = FeatureSets.nonFunctionTypeAliases;
+    var library = await checkLibrary(r'''
+typedef A = dynamic;
+void f(A a) {}
+''');
+
+    checkElementText(
+        library,
+        r'''
+typedef A = dynamic;
+void f(dynamic<aliasElement: self::@typeAlias::A> a) {}
+''',
+        withAliasElementArguments: true);
+  }
+
+  test_typedef_nonFunction_aliasElement_functionType() async {
+    featureSet = FeatureSets.nonFunctionTypeAliases;
+    var library = await checkLibrary(r'''
+typedef A1 = void Function();
+typedef A2<R> = R Function();
+void f1(A1 a) {}
+void f2(A2<int> a) {}
+''');
+
+    checkElementText(
+        library,
+        r'''
+typedef A1 = void Function();
+typedef A2<R> = R Function();
+void f1(void Function()<aliasElement: self::@typeAlias::A1> a) {}
+void f2(int Function()<aliasElement: self::@typeAlias::A2, aliasArguments: [int]> a) {}
+''',
+        withAliasElementArguments: true);
+  }
+
+  test_typedef_nonFunction_aliasElement_interfaceType() async {
+    featureSet = FeatureSets.nonFunctionTypeAliases;
+    var library = await checkLibrary(r'''
+typedef A1 = List<int>;
+typedef A2<T, U> = Map<T, U>;
+void f1(A1 a) {}
+void f2(A2<int, String> a) {}
+''');
+
+    checkElementText(
+        library,
+        r'''
+typedef A1 = List<int>;
+typedef A2<T, U> = Map<T, U>;
+void f1(List<int><aliasElement: self::@typeAlias::A1> a) {}
+void f2(Map<int, String><aliasElement: self::@typeAlias::A2, aliasArguments: [int, String]> a) {}
+''',
+        withAliasElementArguments: true);
+  }
+
+  @FailingTest(
+    issue: 'https://github.com/dart-lang/sdk/issues/45291',
+    reason: 'Type Never is special, no support for its aliases yet',
+  )
+  test_typedef_nonFunction_aliasElement_never() async {
+    featureSet = FeatureSets.nonFunctionTypeAliases;
+    var library = await checkLibrary(r'''
+typedef A1 = Never;
+typedef A2<T> = Never?;
+void f1(A1 a) {}
+void f2(A2<int> a) {}
+''');
+
+    checkElementText(
+        library,
+        r'''
+typedef A1 = Never;
+typedef A2<T> = Never?;
+void f1(Never<aliasElement: self::@typeAlias::A1> a) {}
+void f2(Never?<aliasElement: self::@typeAlias::A2, aliasArguments: [int]> a) {}
+''',
+        withAliasElementArguments: true);
+  }
+
+  @FailingTest(
+    issue: 'https://github.com/dart-lang/sdk/issues/45291',
+    reason: 'Must be implemented',
+  )
+  test_typedef_nonFunction_aliasElement_typeParameterType() async {
+    featureSet = FeatureSets.nonFunctionTypeAliases;
+    var library = await checkLibrary(r'''
+typedef A<T> = T;
+void f<U>(A<U> a) {}
+''');
+
+    checkElementText(
+        library,
+        r'''
+typedef A<T> = T;
+void f<U>(U<aliasElement: self::@typeAlias::A, aliasArguments: [U]> a) {}
+''',
+        withAliasElementArguments: true);
+  }
+
+  @FailingTest(
+    issue: 'https://github.com/dart-lang/sdk/issues/45291',
+    reason: 'Type void is special, no support for its aliases yet',
+  )
+  test_typedef_nonFunction_aliasElement_void() async {
+    featureSet = FeatureSets.nonFunctionTypeAliases;
+    var library = await checkLibrary(r'''
+typedef A = void;
+void f(A a) {}
+''');
+
+    checkElementText(
+        library,
+        r'''
+typedef A = void;
+void f(void<aliasElement: self::@typeAlias::A> a) {}
+''',
+        withAliasElementArguments: true);
+  }
+
   test_typedef_nonFunction_asInterfaceType_interfaceType_none() async {
     featureSet = FeatureSets.nonFunctionTypeAliases;
     var library = await checkLibrary(r'''
diff --git a/pkg/analyzer/tool/experiments/generate.dart b/pkg/analyzer/tool/experiments/generate.dart
index f57961d..3aabe61 100644
--- a/pkg/analyzer/tool/experiments/generate.dart
+++ b/pkg/analyzer/tool/experiments/generate.dart
@@ -68,7 +68,7 @@
     features = <String, dynamic>{};
     Map yamlFeatures = experimentsYaml['features'];
     for (MapEntry entry in yamlFeatures.entries) {
-      String category = entry.value['category'] ?? 'language';
+      String category = (entry.value as YamlMap)['category'] ?? 'language';
       if (category != "language") {
         // Skip a feature with a category that's not language. In the future
         // possibly allow e.g. 'analyzer' etc.
diff --git a/pkg/analyzer_cli/bin/analyzer.dart b/pkg/analyzer_cli/bin/analyzer.dart
index 4381de7..e7fa96b 100644
--- a/pkg/analyzer_cli/bin/analyzer.dart
+++ b/pkg/analyzer_cli/bin/analyzer.dart
@@ -3,17 +3,12 @@
 // 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 'dart:isolate';
-
 import 'package:analyzer_cli/starter.dart';
 
 /// The entry point for the command-line analyzer.
-///
-/// [sendPort] may be passed in when started in an isolate. If provided, it is
-/// used for bazel worker communication instead of stdin/stdout.
-void main(List<String> args, [SendPort sendPort]) async {
+void main(List<String> args) async {
   var starter = CommandLineStarter();
 
   // Wait for the starter to complete.
-  await starter.start(args, sendPort: sendPort);
+  await starter.start(args);
 }
diff --git a/pkg/analyzer_cli/lib/src/build_mode.dart b/pkg/analyzer_cli/lib/src/build_mode.dart
deleted file mode 100644
index ec18a06..0000000
--- a/pkg/analyzer_cli/lib/src/build_mode.dart
+++ /dev/null
@@ -1,730 +0,0 @@
-// 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.
-
-import 'dart:io' as io;
-import 'dart:isolate';
-import 'dart:typed_data';
-
-import 'package:analyzer/dart/analysis/declared_variables.dart';
-import 'package:analyzer/dart/ast/ast.dart';
-import 'package:analyzer/error/error.dart';
-import 'package:analyzer/file_system/file_system.dart';
-import 'package:analyzer/src/analysis_options/analysis_options_provider.dart';
-import 'package:analyzer/src/context/context.dart';
-import 'package:analyzer/src/context/packages.dart';
-import 'package:analyzer/src/dart/analysis/byte_store.dart';
-import 'package:analyzer/src/dart/analysis/cache.dart';
-import 'package:analyzer/src/dart/analysis/context_root.dart' as api;
-import 'package:analyzer/src/dart/analysis/driver.dart';
-import 'package:analyzer/src/dart/analysis/driver_based_analysis_context.dart'
-    as api;
-import 'package:analyzer/src/dart/analysis/file_state.dart';
-import 'package:analyzer/src/dart/analysis/performance_logger.dart';
-import 'package:analyzer/src/dart/analysis/session.dart';
-import 'package:analyzer/src/generated/engine.dart';
-import 'package:analyzer/src/generated/source.dart';
-import 'package:analyzer/src/generated/source_io.dart';
-import 'package:analyzer/src/source/source_resource.dart';
-import 'package:analyzer/src/summary/package_bundle_reader.dart';
-import 'package:analyzer/src/summary/summary_sdk.dart' show SummaryBasedDartSdk;
-import 'package:analyzer/src/summary2/bundle_reader.dart';
-import 'package:analyzer/src/summary2/link.dart';
-import 'package:analyzer/src/summary2/linked_element_factory.dart';
-import 'package:analyzer/src/summary2/package_bundle_format.dart';
-import 'package:analyzer/src/summary2/reference.dart';
-import 'package:analyzer/src/task/options.dart';
-import 'package:analyzer/src/util/file_paths.dart' as file_paths;
-import 'package:analyzer/src/workspace/bazel.dart';
-import 'package:analyzer_cli/src/driver.dart';
-import 'package:analyzer_cli/src/error_formatter.dart';
-import 'package:analyzer_cli/src/error_severity.dart';
-import 'package:analyzer_cli/src/options.dart';
-import 'package:bazel_worker/bazel_worker.dart';
-import 'package:collection/collection.dart';
-import 'package:convert/convert.dart';
-
-/// Persistent Bazel worker.
-class AnalyzerWorkerLoop extends AsyncWorkerLoop {
-  final ResourceProvider resourceProvider;
-  final PerformanceLog logger = PerformanceLog(null);
-  final String dartSdkPath;
-  WorkerPackageBundleCache packageBundleCache;
-
-  final StringBuffer errorBuffer = StringBuffer();
-  final StringBuffer outBuffer = StringBuffer();
-
-  AnalyzerWorkerLoop(this.resourceProvider, AsyncWorkerConnection connection,
-      {this.dartSdkPath})
-      : super(connection: connection) {
-    packageBundleCache =
-        WorkerPackageBundleCache(resourceProvider, logger, 256 * 1024 * 1024);
-  }
-
-  factory AnalyzerWorkerLoop.sendPort(
-      ResourceProvider resourceProvider, SendPort sendPort,
-      {String dartSdkPath}) {
-    AsyncWorkerConnection connection = SendPortAsyncWorkerConnection(sendPort);
-    return AnalyzerWorkerLoop(resourceProvider, connection,
-        dartSdkPath: dartSdkPath);
-  }
-
-  factory AnalyzerWorkerLoop.std(ResourceProvider resourceProvider,
-      {io.Stdin stdinStream, io.Stdout stdoutStream, String dartSdkPath}) {
-    AsyncWorkerConnection connection = StdAsyncWorkerConnection(
-        inputStream: stdinStream, outputStream: stdoutStream);
-    return AnalyzerWorkerLoop(resourceProvider, connection,
-        dartSdkPath: dartSdkPath);
-  }
-
-  /// Performs analysis with given [options].
-  Future<void> analyze(
-      CommandLineOptions options, Map<String, WorkerInput> inputs) async {
-    var packageBundleProvider =
-        WorkerPackageBundleProvider(packageBundleCache, inputs);
-    var buildMode = BuildMode(resourceProvider, options, AnalysisStats(),
-        logger: logger, packageBundleProvider: packageBundleProvider);
-    await buildMode.analyze();
-    AnalysisEngine.instance.clearCaches();
-  }
-
-  /// Perform a single loop step.
-  @override
-  Future<WorkResponse> performRequest(WorkRequest request) async {
-    return logger.runAsync('Perform request', () async {
-      errorBuffer.clear();
-      outBuffer.clear();
-      try {
-        // Prepare inputs with their digests.
-        var inputs = <String, WorkerInput>{};
-        for (var input in request.inputs) {
-          inputs[input.path] = WorkerInput(input.path, input.digest);
-        }
-
-        // Add in the dart-sdk argument if `dartSdkPath` is not null,
-        // otherwise it will try to find the currently installed sdk.
-        var arguments = request.arguments.toList();
-        if (dartSdkPath != null &&
-            !arguments.any((arg) => arg.startsWith('--dart-sdk'))) {
-          arguments.add('--dart-sdk=$dartSdkPath');
-        }
-
-        // Prepare options.
-        var options = CommandLineOptions.parse(resourceProvider, arguments,
-            printAndFail: (String msg) {
-          throw ArgumentError(msg);
-        });
-
-        // Analyze and respond.
-        await analyze(options, inputs);
-        var msg = _getErrorOutputBuffersText();
-        return WorkResponse()
-          ..exitCode = EXIT_CODE_OK
-          ..output = msg;
-      } catch (e, st) {
-        var msg = _getErrorOutputBuffersText();
-        msg += '$e\n$st';
-        return WorkResponse()
-          ..exitCode = EXIT_CODE_ERROR
-          ..output = msg;
-      }
-    });
-  }
-
-  /// Run the worker loop.
-  @override
-  Future<void> run() async {
-    errorSink = errorBuffer;
-    outSink = outBuffer;
-    exitHandler = (int exitCode) {
-      throw StateError('Exit called: $exitCode');
-    };
-    await super.run();
-  }
-
-  String _getErrorOutputBuffersText() {
-    var msg = '';
-    if (errorBuffer.isNotEmpty) {
-      msg += errorBuffer.toString() + '\n';
-    }
-    if (outBuffer.isNotEmpty) {
-      msg += outBuffer.toString() + '\n';
-    }
-    return msg;
-  }
-}
-
-/// Analyzer used when the "--build-mode" option is supplied.
-class BuildMode {
-  final ResourceProvider resourceProvider;
-  final CommandLineOptions options;
-  final AnalysisStats stats;
-  final PerformanceLog logger;
-  final PackageBundleProvider packageBundleProvider;
-
-  SummaryDataStore summaryDataStore;
-  AnalysisOptionsImpl analysisOptions;
-  Map<Uri, File> uriToFileMap;
-  final List<Source> explicitSources = <Source>[];
-
-  SourceFactory sourceFactory;
-  DeclaredVariables declaredVariables;
-  AnalysisDriver analysisDriver;
-
-  LinkedElementFactory elementFactory;
-
-  // May be null.
-  final DependencyTracker dependencyTracker;
-
-  BuildMode(this.resourceProvider, this.options, this.stats,
-      {PerformanceLog logger, PackageBundleProvider packageBundleProvider})
-      : logger = logger ?? PerformanceLog(null),
-        packageBundleProvider = packageBundleProvider ??
-            DirectPackageBundleProvider(resourceProvider),
-        dependencyTracker = options.summaryDepsOutput != null
-            ? DependencyTracker(options.summaryDepsOutput)
-            : null;
-
-  bool get _shouldOutputSummary =>
-      options.buildSummaryOutput != null ||
-      options.buildSummaryOutputSemantic != null;
-
-  /// Perform package analysis according to the given [options].
-  Future<ErrorSeverity> analyze() async {
-    return await logger.runAsync('Analyze', () async {
-      // Write initial progress message.
-      if (!options.machineFormat) {
-        outSink.writeln("Analyzing ${options.sourceFiles.join(', ')}...");
-      }
-
-      // Create the URI to file map.
-      uriToFileMap = _createUriToFileMap(options.sourceFiles);
-      if (uriToFileMap == null) {
-        io.exitCode = ErrorSeverity.ERROR.ordinal;
-        return ErrorSeverity.ERROR;
-      }
-
-      // BuildMode expects sourceFiles in the format "<uri>|<filepath>",
-      // but the rest of the code base does not understand this format.
-      // Rewrite sourceFiles, stripping the "<uri>|" prefix, so that it
-      // does not cause problems with code that does not expect this format.
-      options.rewriteSourceFiles(options.sourceFiles
-          .map((String uriPipePath) =>
-              uriPipePath.substring(uriPipePath.indexOf('|') + 1))
-          .toList());
-
-      // Prepare the analysis driver.
-      try {
-        logger.run('Prepare analysis driver', () {
-          _createAnalysisDriver();
-        });
-      } on ConflictingSummaryException catch (e) {
-        errorSink.writeln('$e');
-        io.exitCode = ErrorSeverity.ERROR.ordinal;
-        return ErrorSeverity.ERROR;
-      }
-
-      // Add sources.
-      for (var uri in uriToFileMap.keys) {
-        var file = uriToFileMap[uri];
-        if (!file.exists) {
-          errorSink.writeln('File not found: ${file.path}');
-          io.exitCode = ErrorSeverity.ERROR.ordinal;
-          return ErrorSeverity.ERROR;
-        }
-        Source source = FileSource(file, uri);
-        explicitSources.add(source);
-      }
-
-      // Write summary.
-      if (_shouldOutputSummary) {
-        await logger.runAsync('Build and write output summary', () async {
-          // Build and assemble linked libraries.
-          var bytes = _computeLinkedLibraries2();
-
-          // Write the whole package bundle.
-          // TODO(scheglov) Remove support for `buildSummaryOutput`.
-          if (options.buildSummaryOutput != null) {
-            var file = io.File(options.buildSummaryOutput);
-            file.writeAsBytesSync(bytes, mode: io.FileMode.writeOnly);
-          }
-          if (options.buildSummaryOutputSemantic != null) {
-            var file = io.File(options.buildSummaryOutputSemantic);
-            file.writeAsBytesSync(bytes, mode: io.FileMode.writeOnly);
-          }
-        });
-      } else {
-        // Build the graph, e.g. associate parts with libraries.
-        for (var file in uriToFileMap.values) {
-          analysisDriver.fsState.getFileForPath(file.path);
-        }
-      }
-
-      ErrorSeverity severity;
-      if (options.buildSummaryOnly) {
-        severity = ErrorSeverity.NONE;
-      } else {
-        // Process errors.
-        await _printErrors(outputPath: options.buildAnalysisOutput);
-        severity = await _computeMaxSeverity();
-      }
-
-      if (dependencyTracker != null) {
-        var file = io.File(dependencyTracker.outputPath);
-        file.writeAsStringSync(dependencyTracker.dependencies.join('\n'));
-      }
-
-      return severity;
-    });
-  }
-
-  void _applyOptionsFile() {
-    analysisOptions = AnalysisOptionsImpl();
-
-    var path = options.contextBuilderOptions.defaultAnalysisOptionsFilePath;
-    var file = resourceProvider.getFile(path);
-    var provider = AnalysisOptionsProvider(sourceFactory);
-    var map = provider.getOptionsFromFile(file);
-    applyToAnalysisOptions(analysisOptions, map);
-  }
-
-  /// Use [elementFactory] filled with input summaries, and link libraries
-  /// in [explicitSources] to produce linked summary bytes.
-  Uint8List _computeLinkedLibraries2() {
-    return logger.run('Link output summary2', () {
-      var inputLibraries = <LinkInputLibrary>[];
-
-      for (var librarySource in explicitSources) {
-        var path = librarySource.fullName;
-
-        var parseResult = analysisDriver.parseFileSync(path);
-        if (parseResult == null) {
-          throw ArgumentError('No parsed unit for $path');
-        }
-
-        var unit = parseResult.unit;
-        var isPart = unit.directives.any((d) => d is PartOfDirective);
-        if (isPart) {
-          continue;
-        }
-
-        var inputUnits = <LinkInputUnit>[];
-        inputUnits.add(
-          LinkInputUnit(null, librarySource, false, unit),
-        );
-
-        for (var directive in unit.directives) {
-          if (directive is PartDirective) {
-            var partUri = directive.uri.stringValue;
-            var partSource = sourceFactory.resolveUri(librarySource, partUri);
-
-            // Add empty synthetic units for unresolved `part` URIs.
-            if (partSource == null) {
-              continue;
-            }
-
-            var partPath = partSource.fullName;
-            var partParseResult = analysisDriver.parseFileSync(partPath);
-            if (partParseResult == null) {
-              throw ArgumentError('No parsed unit for part $partPath in $path');
-            }
-            inputUnits.add(
-              LinkInputUnit(
-                partUri,
-                partSource,
-                false,
-                partParseResult.unit,
-              ),
-            );
-          }
-        }
-
-        inputLibraries.add(
-          LinkInputLibrary(librarySource, inputUnits),
-        );
-      }
-
-      var linkResult = link(elementFactory, inputLibraries, false);
-
-      var bundleBuilder = PackageBundleBuilder();
-      for (var library in inputLibraries) {
-        bundleBuilder.addLibrary(
-          library.uriStr,
-          library.units.map((e) => e.uriStr).toList(),
-        );
-      }
-      return bundleBuilder.finish(
-        astBytes: linkResult.astBytes,
-        resolutionBytes: linkResult.resolutionBytes,
-      );
-    });
-  }
-
-  Future<ErrorSeverity> _computeMaxSeverity() async {
-    var maxSeverity = ErrorSeverity.NONE;
-    if (!options.buildSuppressExitCode) {
-      for (var source in explicitSources) {
-        var result = await analysisDriver.getErrors(source.fullName);
-        for (var error in result.errors) {
-          var processedSeverity = determineProcessedSeverity(
-              error, options, analysisDriver.analysisOptions);
-          if (processedSeverity != null) {
-            maxSeverity = maxSeverity.max(processedSeverity);
-          }
-        }
-      }
-    }
-    return maxSeverity;
-  }
-
-  void _createAnalysisDriver() {
-    // Read the summaries.
-    summaryDataStore = SummaryDataStore(<String>[]);
-
-    // Adds a bundle at `path` to `summaryDataStore`.
-    PackageBundleReader addBundle(String path) {
-      var bundle = packageBundleProvider.get(path);
-      summaryDataStore.addBundle(path, bundle);
-      return bundle;
-    }
-
-    SummaryBasedDartSdk sdk;
-    logger.run('Add SDK bundle', () {
-      sdk = SummaryBasedDartSdk(options.dartSdkSummaryPath, true);
-      summaryDataStore.addBundle(null, sdk.bundle);
-    });
-
-    var numInputs = options.buildSummaryInputs.length;
-    logger.run('Add $numInputs input summaries', () {
-      for (var path in options.buildSummaryInputs) {
-        addBundle(path);
-      }
-    });
-
-    var rootPath = options.sourceFiles.first;
-
-    var packages = _findPackages(rootPath);
-
-    sourceFactory = SourceFactory(<UriResolver>[
-      DartUriResolver(sdk),
-      TrackingInSummaryUriResolver(
-          InSummaryUriResolver(resourceProvider, summaryDataStore),
-          dependencyTracker),
-      ExplicitSourceResolver(uriToFileMap)
-    ]);
-
-    _applyOptionsFile();
-
-    var scheduler = AnalysisDriverScheduler(logger);
-    analysisDriver = AnalysisDriver(
-      scheduler,
-      logger,
-      resourceProvider,
-      MemoryByteStore(),
-      FileContentOverlay(),
-      null,
-      sourceFactory,
-      analysisOptions,
-      externalSummaries: summaryDataStore,
-      packages: packages,
-    );
-
-    _setAnalysisDriverAnalysisContext(rootPath);
-
-    declaredVariables = DeclaredVariables.fromMap(options.definedVariables);
-    analysisDriver.declaredVariables = declaredVariables;
-
-    _createLinkedElementFactory();
-
-    scheduler.start();
-  }
-
-  void _createLinkedElementFactory() {
-    var analysisContext = AnalysisContextImpl(
-      SynchronousSession(analysisOptions, declaredVariables),
-      sourceFactory,
-    );
-
-    elementFactory = LinkedElementFactory(
-      analysisContext,
-      AnalysisSessionImpl(null),
-      Reference.root(),
-    );
-
-    for (var bundle in summaryDataStore.bundles) {
-      elementFactory.addBundle(
-        BundleReader(
-          elementFactory: elementFactory,
-          astBytes: bundle.astBytes,
-          resolutionBytes: bundle.resolutionBytes,
-        ),
-      );
-    }
-  }
-
-  /// Convert [sourceEntities] (a list of file specifications of the form
-  /// "$uri|$path") to a map from URI to path. If an error occurs, report the
-  /// error and return null.
-  Map<Uri, File> _createUriToFileMap(List<String> sourceEntities) {
-    var uriToFileMap = <Uri, File>{};
-    for (var sourceFile in sourceEntities) {
-      var pipeIndex = sourceFile.indexOf('|');
-      if (pipeIndex == -1) {
-        // TODO(paulberry): add the ability to guess the URI from the path.
-        errorSink.writeln(
-            'Illegal input file (must be "\$uri|\$path"): $sourceFile');
-        return null;
-      }
-      var uri = Uri.parse(sourceFile.substring(0, pipeIndex));
-      var path = sourceFile.substring(pipeIndex + 1);
-      path = resourceProvider.pathContext.absolute(path);
-      path = resourceProvider.pathContext.normalize(path);
-      uriToFileMap[uri] = resourceProvider.getFile(path);
-    }
-    return uriToFileMap;
-  }
-
-  Packages _findPackages(String path) {
-    var configPath = options.packageConfigPath;
-    if (configPath != null) {
-      var configFile = resourceProvider.getFile(configPath);
-      return parsePackagesFile(resourceProvider, configFile);
-    }
-
-    if (path != null) {
-      var file = resourceProvider.getFile(path);
-      return findPackagesFrom(resourceProvider, file);
-    }
-
-    return Packages.empty;
-  }
-
-  /// Print errors for all explicit sources. If [outputPath] is supplied, output
-  /// is sent to a new file at that path.
-  Future<void> _printErrors({String outputPath}) async {
-    await logger.runAsync('Compute and print analysis errors', () async {
-      var buffer = StringBuffer();
-      var severityProcessor = (AnalysisError error) =>
-          determineProcessedSeverity(error, options, analysisOptions);
-      var formatter = options.machineFormat
-          ? MachineErrorFormatter(buffer, options, stats,
-              severityProcessor: severityProcessor)
-          : HumanErrorFormatter(buffer, options, stats,
-              severityProcessor: severityProcessor);
-      for (var source in explicitSources) {
-        var result = await analysisDriver.getErrors(source.fullName);
-        formatter.formatErrors([result]);
-      }
-      formatter.flush();
-      if (!options.machineFormat) {
-        stats.print(buffer);
-      }
-      if (outputPath == null) {
-        var sink = options.machineFormat ? errorSink : outSink;
-        sink.write(buffer);
-      } else {
-        io.File(outputPath).writeAsStringSync(buffer.toString());
-      }
-    });
-  }
-
-  void _setAnalysisDriverAnalysisContext(String rootPath) {
-    rootPath = file_paths.absoluteNormalized(
-      resourceProvider.pathContext,
-      rootPath,
-    );
-
-    var workspace = BazelWorkspace.find(resourceProvider, rootPath);
-
-    var contextRoot = api.ContextRootImpl(
-      resourceProvider,
-      resourceProvider.getFolder(workspace.root),
-      workspace,
-    );
-
-    analysisDriver.configure(
-      analysisContext: api.DriverBasedAnalysisContext(
-        resourceProvider,
-        contextRoot,
-        analysisDriver,
-      ),
-    );
-  }
-}
-
-/// Tracks paths to dependencies, really just a thin api around a Set<String>.
-class DependencyTracker {
-  final _dependencies = <String>{};
-
-  /// The path to the file to create once tracking is done.
-  final String outputPath;
-
-  DependencyTracker(this.outputPath);
-
-  Iterable<String> get dependencies => _dependencies;
-
-  void record(String path) => _dependencies.add(path);
-}
-
-/// [PackageBundleProvider] that always reads from the [ResourceProvider].
-class DirectPackageBundleProvider implements PackageBundleProvider {
-  final ResourceProvider resourceProvider;
-
-  DirectPackageBundleProvider(this.resourceProvider);
-
-  @override
-  PackageBundleReader get(String path) {
-    var bytes = io.File(path).readAsBytesSync();
-    return PackageBundleReader(bytes);
-  }
-}
-
-/// Instances of the class [ExplicitSourceResolver] map URIs to files on disk
-/// using a fixed mapping provided at construction time.
-class ExplicitSourceResolver extends UriResolver {
-  final Map<Uri, File> uriToFileMap;
-  final Map<String, Uri> pathToUriMap;
-
-  /// Construct an [ExplicitSourceResolver] based on the given [uriToFileMap].
-  ExplicitSourceResolver(Map<Uri, File> uriToFileMap)
-      : uriToFileMap = uriToFileMap,
-        pathToUriMap = _computePathToUriMap(uriToFileMap);
-
-  @override
-  Source resolveAbsolute(Uri uri, [Uri actualUri]) {
-    var file = uriToFileMap[uri];
-    actualUri ??= uri;
-    if (file == null) {
-      return null;
-    } else {
-      return FileSource(file, actualUri);
-    }
-  }
-
-  @override
-  Uri restoreAbsolute(Source source) {
-    return pathToUriMap[source.fullName];
-  }
-
-  /// Build the inverse mapping of [uriToSourceMap].
-  static Map<String, Uri> _computePathToUriMap(Map<Uri, File> uriToSourceMap) {
-    var pathToUriMap = <String, Uri>{};
-    uriToSourceMap.forEach((Uri uri, File file) {
-      pathToUriMap[file.path] = uri;
-    });
-    return pathToUriMap;
-  }
-}
-
-/// Provider for [PackageBundleReader]s by file paths.
-abstract class PackageBundleProvider {
-  /// Return the [PackageBundleReader] for the file with the given [path].
-  PackageBundleReader get(String path);
-}
-
-/// Wrapper for [InSummaryUriResolver] that tracks accesses to summaries.
-class TrackingInSummaryUriResolver extends UriResolver {
-  // May be null.
-  final DependencyTracker dependencyTracker;
-  final InSummaryUriResolver inSummaryUriResolver;
-
-  TrackingInSummaryUriResolver(
-      this.inSummaryUriResolver, this.dependencyTracker);
-
-  @override
-  Source resolveAbsolute(Uri uri) {
-    var source = inSummaryUriResolver.resolveAbsolute(uri);
-    if (dependencyTracker != null &&
-        source != null &&
-        source is InSummarySource) {
-      dependencyTracker.record(source.summaryPath);
-    }
-    return source;
-  }
-}
-
-/// Worker input.
-///
-/// Bazel does not specify the format of the digest, so we cannot assume that
-/// the digest itself is enough to uniquely identify inputs. So, we use a pair
-/// of path + digest.
-class WorkerInput {
-  static const _digestEquality = ListEquality<int>();
-
-  final String path;
-  final List<int> digest;
-
-  WorkerInput(this.path, this.digest);
-
-  @override
-  int get hashCode => _digestEquality.hash(digest);
-
-  @override
-  bool operator ==(Object other) {
-    return other is WorkerInput &&
-        other.path == path &&
-        _digestEquality.equals(other.digest, digest);
-  }
-
-  @override
-  String toString() => '$path @ ${hex.encode(digest)}';
-}
-
-/// Value object for [WorkerPackageBundleCache].
-class WorkerPackageBundle {
-  final List<int> bytes;
-  final PackageBundleReader bundle;
-
-  WorkerPackageBundle(this.bytes, this.bundle);
-
-  /// Approximation of a bundle size in memory.
-  int get size => bytes.length * 3;
-}
-
-/// Cache of [PackageBundleReader]s.
-class WorkerPackageBundleCache {
-  final ResourceProvider resourceProvider;
-  final PerformanceLog logger;
-  final Cache<WorkerInput, WorkerPackageBundle> _cache;
-
-  WorkerPackageBundleCache(this.resourceProvider, this.logger, int maxSizeBytes)
-      : _cache = Cache<WorkerInput, WorkerPackageBundle>(
-            maxSizeBytes, (value) => value.size);
-
-  /// Get the [PackageBundleReader] from the file with the given [path] in the context
-  /// of the given worker [inputs].
-  PackageBundleReader get(Map<String, WorkerInput> inputs, String path) {
-    var input = inputs[path];
-
-    // The input must be not null, otherwise we're not expected to read
-    // this file, but we check anyway to be safe.
-    if (input == null) {
-      logger.writeln('Read $path outside of the inputs.');
-      var file = resourceProvider.getFile(path);
-      var bytes = file.readAsBytesSync() as Uint8List;
-      return PackageBundleReader(bytes);
-    }
-
-    return _cache.get(input, () {
-      logger.writeln('Read $input.');
-      var file = resourceProvider.getFile(path);
-      var bytes = file.readAsBytesSync() as Uint8List;
-      var bundle = PackageBundleReader(bytes);
-      return WorkerPackageBundle(bytes, bundle);
-    }).bundle;
-  }
-}
-
-/// [PackageBundleProvider] that reads from [WorkerPackageBundleCache] using
-/// the request specific [inputs].
-class WorkerPackageBundleProvider implements PackageBundleProvider {
-  final WorkerPackageBundleCache cache;
-  final Map<String, WorkerInput> inputs;
-
-  WorkerPackageBundleProvider(this.cache, this.inputs);
-
-  @override
-  PackageBundleReader get(String path) {
-    return cache.get(inputs, path);
-  }
-}
diff --git a/pkg/analyzer_cli/lib/src/driver.dart b/pkg/analyzer_cli/lib/src/driver.dart
index 3d94108..357b5d7 100644
--- a/pkg/analyzer_cli/lib/src/driver.dart
+++ b/pkg/analyzer_cli/lib/src/driver.dart
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'dart:io' as io;
-import 'dart:isolate';
 
 import 'package:analyzer/dart/sdk/build_sdk_summary.dart';
 import 'package:analyzer/error/error.dart';
@@ -31,7 +30,6 @@
 import 'package:analyzer/src/util/yaml.dart';
 import 'package:analyzer_cli/src/analyzer_impl.dart';
 import 'package:analyzer_cli/src/batch_mode.dart';
-import 'package:analyzer_cli/src/build_mode.dart';
 import 'package:analyzer_cli/src/error_formatter.dart';
 import 'package:analyzer_cli/src/error_severity.dart';
 import 'package:analyzer_cli/src/options.dart';
@@ -89,7 +87,7 @@
   }
 
   @override
-  Future<void> start(List<String> args, {SendPort sendPort}) async {
+  Future<void> start(List<String> args) async {
     if (analysisDriver != null) {
       throw StateError('start() can only be called once');
     }
@@ -105,13 +103,7 @@
     _analysisContextProvider = _AnalysisContextProvider(resourceProvider);
 
     // Do analysis.
-    if (options.buildMode) {
-      var severity = await _buildModeAnalyze(options, sendPort);
-      // Propagate issues to the exit code.
-      if (_shouldBeFatal(severity, options)) {
-        io.exitCode = severity.ordinal;
-      }
-    } else if (options.batchMode) {
+    if (options.batchMode) {
       var batchRunner = BatchRunner(outSink, errorSink);
       batchRunner.runAsBatch(args, (List<String> args) async {
         var options = CommandLineOptions.parse(resourceProvider, args);
@@ -375,25 +367,6 @@
     return allResult;
   }
 
-  /// Perform analysis in build mode according to the given [options].
-  ///
-  /// If [sendPort] is provided it is used for bazel worker communication
-  /// instead of stdin/stdout.
-  Future<ErrorSeverity> _buildModeAnalyze(
-      CommandLineOptions options, SendPort sendPort) async {
-    if (options.buildModePersistentWorker) {
-      var workerLoop = sendPort == null
-          ? AnalyzerWorkerLoop.std(resourceProvider,
-              dartSdkPath: options.dartSdkPath)
-          : AnalyzerWorkerLoop.sendPort(resourceProvider, sendPort,
-              dartSdkPath: options.dartSdkPath);
-      await workerLoop.run();
-      return ErrorSeverity.NONE;
-    } else {
-      return await BuildMode(resourceProvider, options, stats).analyze();
-    }
-  }
-
   /// Collect all analyzable files at [filePath], recursively if it's a
   /// directory, ignoring links.
   Iterable<io.File> _collectFiles(String filePath, AnalysisOptions options) {
@@ -475,8 +448,6 @@
             previous.showPackageWarningsPrefix &&
         newOptions.showSdkWarnings == previous.showSdkWarnings &&
         newOptions.lints == previous.lints &&
-        _equalLists(
-            newOptions.buildSummaryInputs, previous.buildSummaryInputs) &&
         newOptions.defaultLanguageVersion == previous.defaultLanguageVersion &&
         newOptions.disableCacheFlushing == previous.disableCacheFlushing &&
         _equalLists(newOptions.enabledExperiments, previous.enabledExperiments);
diff --git a/pkg/analyzer_cli/lib/src/options.dart b/pkg/analyzer_cli/lib/src/options.dart
index 08897e3..56d8ee4 100644
--- a/pkg/analyzer_cli/lib/src/options.dart
+++ b/pkg/analyzer_cli/lib/src/options.dart
@@ -6,7 +6,6 @@
 
 import 'package:analyzer/dart/analysis/features.dart';
 import 'package:analyzer/file_system/file_system.dart';
-import 'package:analyzer/file_system/physical_file_system.dart';
 import 'package:analyzer/src/context/builder.dart';
 import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer/src/generated/engine.dart' show AnalysisOptionsImpl;
@@ -29,7 +28,6 @@
 const _noImplicitDynamicFlag = 'no-implicit-dynamic';
 const _packagesOption = 'packages';
 const _sdkPathOption = 'dart-sdk';
-const _sdkSummaryPathOption = 'dart-sdk-summary';
 
 /// Shared exit handler.
 ///
@@ -53,40 +51,12 @@
 class CommandLineOptions {
   final ArgResults _argResults;
 
-  /// The path to output analysis results when in build mode.
-  final String buildAnalysisOutput;
-
-  /// Whether to use build mode.
-  final bool buildMode;
-
-  /// Whether to use build mode as a Bazel persistent worker.
-  final bool buildModePersistentWorker;
-
-  /// List of summary file paths to use in build mode.
-  final List<String> buildSummaryInputs;
-
-  /// Whether to skip analysis when creating summaries in build mode.
-  final bool buildSummaryOnly;
-
-  /// The path to output the summary when creating summaries in build mode.
-  final String buildSummaryOutput;
-
-  /// The path to output the semantic-only summary when creating summaries in
-  /// build mode.
-  final String buildSummaryOutputSemantic;
-
-  /// Whether to suppress a nonzero exit code in build mode.
-  final bool buildSuppressExitCode;
-
   /// The options defining the context in which analysis is performed.
   final ContextBuilderOptions contextBuilderOptions;
 
   /// The path to the dart SDK.
   String dartSdkPath;
 
-  /// The path to the dart SDK summary file.
-  final String dartSdkSummaryPath;
-
   /// Whether to disable cache flushing. This option can improve analysis
   /// speed at the expense of memory usage. It may also be useful for working
   /// around bugs.
@@ -124,7 +94,7 @@
   final bool showSdkWarnings;
 
   /// The source files to analyze
-  List<String> _sourceFiles;
+  final List<String> sourceFiles;
 
   /// Whether to treat warnings as fatal
   final bool warningsAreFatal;
@@ -146,31 +116,16 @@
   /// Dart analyzer snapshot.
   final bool trainSnapshot;
 
-  /// Path to a file to dump summary dependency information to for any given
-  /// build.
-  final String summaryDepsOutput;
-
   /// Initialize options from the given parsed [args].
   CommandLineOptions._fromArgs(
     ResourceProvider resourceProvider,
     ArgResults args,
   )   : _argResults = args,
-        buildAnalysisOutput = cast(args['build-analysis-output']),
-        buildMode = cast(args['build-mode']),
-        buildModePersistentWorker = cast(args['persistent_worker']),
-        buildSummaryInputs =
-            (args['build-summary-input'] as List).cast<String>(),
-        buildSummaryOnly = cast(args['build-summary-only']),
-        buildSummaryOutput = cast(args['build-summary-output']),
-        buildSummaryOutputSemantic =
-            cast(args['build-summary-output-semantic']),
-        buildSuppressExitCode = cast(args['build-suppress-exit-code']),
         contextBuilderOptions = _createContextBuilderOptions(
           resourceProvider,
           args,
         ),
         dartSdkPath = cast(args[_sdkPathOption]),
-        dartSdkSummaryPath = cast(args[_sdkSummaryPathOption]),
         disableCacheFlushing = cast(args['disable-cache-flushing']),
         disableHints = cast(args['no-hints']),
         displayVersion = cast(args['version']),
@@ -184,14 +139,13 @@
             args['x-package-warnings-prefix'] != null,
         showPackageWarningsPrefix = cast(args['x-package-warnings-prefix']),
         showSdkWarnings = cast(args['sdk-warnings']),
-        _sourceFiles = args.rest,
+        sourceFiles = args.rest,
         infosAreFatal = cast(args['fatal-infos']) || cast(args['fatal-hints']),
         warningsAreFatal = cast(args['fatal-warnings']),
         lintsAreFatal = cast(args['fatal-lints']),
         trainSnapshot = cast(args['train-snapshot']),
         verbose = cast(args['verbose']),
-        color = cast(args['color']),
-        summaryDepsOutput = cast(args['summary-deps-output']);
+        color = cast(args['color']);
 
   /// The path to an analysis options file
   String get analysisOptionsFile =>
@@ -221,14 +175,6 @@
   /// The path to a `.packages` configuration file
   String get packageConfigPath => contextBuilderOptions.defaultPackageFilePath;
 
-  /// The source files to analyze
-  List<String> get sourceFiles => _sourceFiles;
-
-  /// Replace the sourceFiles parsed from the command line.
-  void rewriteSourceFiles(List<String> newSourceFiles) {
-    _sourceFiles = newSourceFiles;
-  }
-
   /// Update the [analysisOptions] with flags that the user specified
   /// explicitly. The [analysisOptions] are usually loaded from one of
   /// `analysis_options.yaml` files, possibly with includes. We consider
@@ -336,7 +282,7 @@
     }
 
     // Check SDK.
-    if (!options.buildModePersistentWorker) {
+    {
       var sdkPath = options.dartSdkPath;
 
       // Check that SDK is existing directory.
@@ -354,60 +300,9 @@
       options.dartSdkPath = file_paths.absoluteNormalized(pathContext, sdkPath);
     }
 
-    // Build mode.
-    if (options.buildMode) {
-      if (options.dartSdkSummaryPath == null) {
-        // It is OK to not specify when persistent worker.
-        // We will be given another set of options with each request.
-        if (!options.buildModePersistentWorker) {
-          printAndFail(
-            'The option --build-mode also requires --dart-sdk-summary '
-            'to be specified.',
-          );
-          return null; // Only reachable in testing.
-        }
-      }
-    } else {
-      if (options.buildModePersistentWorker) {
-        printAndFail(
-          'The option --persistent_worker can be used only '
-          'together with --build-mode.',
-        );
-        return null; // Only reachable in testing.
-      }
-    }
-
     return options;
   }
 
-  /// Preprocess the given list of command line [args].
-  /// If the final arg is `@file_path` (Bazel worker mode),
-  /// then read in all the lines of that file and add those as args.
-  /// Always returns a new modifiable list.
-  static List<String> preprocessArgs(
-      ResourceProvider provider, List<String> args) {
-    args = List.from(args);
-    if (args.isEmpty) {
-      return args;
-    }
-    var lastArg = args.last;
-    if (lastArg.startsWith('@')) {
-      var argsFile = provider.getFile(lastArg.substring(1));
-      try {
-        args.removeLast();
-        args.addAll(argsFile
-            .readAsStringSync()
-            .replaceAll('\r\n', '\n')
-            .replaceAll('\r', '\n')
-            .split('\n')
-            .where((String line) => line.isNotEmpty));
-      } on FileSystemException catch (e) {
-        throw Exception('Failed to read file specified by $lastArg : $e');
-      }
-    }
-    return args;
-  }
-
   /// Use the command-line [args] to create a context builder options.
   static ContextBuilderOptions _createContextBuilderOptions(
     ResourceProvider resourceProvider,
@@ -428,9 +323,6 @@
     //
     // File locations.
     //
-    builderOptions.dartSdkSummaryPath = absoluteNormalizedPath(
-      cast(args[_sdkSummaryPathOption]),
-    );
     builderOptions.defaultAnalysisOptionsFilePath = absoluteNormalizedPath(
       cast(args[_analysisOptionsFileOption]),
     );
@@ -515,8 +407,6 @@
         help: 'The path to the package resolution configuration file, which '
             'supplies a mapping of package names\nto paths.',
         hide: ddc);
-    parser.addOption(_sdkSummaryPathOption,
-        help: 'The path to the Dart SDK summary file.', hide: hide);
     parser.addFlag(_enableInitializingFormalAccessFlag,
         help:
             'Enable support for allowing access to field formal parameters in a '
@@ -547,8 +437,6 @@
     ResourceProvider resourceProvider,
     List<String> args,
   ) {
-    args = preprocessArgs(PhysicalResourceProvider.INSTANCE, args);
-
     var verbose = args.contains('-v') || args.contains('--verbose');
     var hide = !verbose;
 
@@ -593,56 +481,10 @@
           help: 'Verbose output.',
           negatable: false);
 
-    // Build mode options.
-    if (!hide) {
-      parser.addSeparator('Build mode flags:');
-    }
-
-    parser
-      ..addFlag('persistent_worker',
-          help: 'Enable Bazel persistent worker mode.',
-          defaultsTo: false,
-          negatable: false,
-          hide: hide)
-      ..addOption('build-analysis-output',
-          help: 'Specifies the path to the file where analysis results should '
-              'be written.',
-          hide: hide)
-      ..addFlag('build-mode',
-          help: 'Run in build mode; '
-              'this is used to generate analyzer summaries for build systems.',
-          defaultsTo: false,
-          negatable: false,
-          hide: hide)
-      ..addMultiOption('build-summary-input',
-          help: 'Path to a linked summary file that contains information from '
-              'a previous analysis run; may be specified multiple times.',
-          hide: hide)
-      ..addOption('build-summary-output',
-          help: 'Specifies the path to the file where the full summary '
-              'information should be written.',
-          hide: hide)
-      ..addOption('build-summary-output-semantic',
-          help: 'Specifies the path to the file where the semantic summary '
-              'information should be written.',
-          hide: hide)
-      ..addFlag('build-summary-only',
-          help: 'Disable analysis (only generate summaries).',
-          defaultsTo: false,
-          negatable: false,
-          hide: hide)
-      ..addFlag('build-suppress-exit-code',
-          help: 'Exit with code 0 even if errors are found.',
-          defaultsTo: false,
-          negatable: false,
-          hide: hide)
-      ..addFlag('color',
-          help: 'Use ansi colors when printing messages.',
-          defaultsTo: ansi.terminalSupportsAnsi(),
-          hide: hide)
-      ..addOption('summary-deps-output',
-          help: 'Path to a file to dump summary dependency info to.',
-          hide: hide);
+    parser.addFlag('color',
+        help: 'Use ansi colors when printing messages.',
+        defaultsTo: ansi.terminalSupportsAnsi(),
+        hide: hide);
 
     // Hidden flags.
     if (!hide) {
@@ -736,21 +578,6 @@
       }
       var results = parser.parse(args);
 
-      // Persistent worker.
-      if (args.contains('--persistent_worker')) {
-        var hasBuildMode = args.contains('--build-mode');
-        var onlyDartSdkArg = args.length == 2 ||
-            (args.length == 3 && args.any((a) => a.startsWith('--dart-sdk'))) ||
-            (args.length == 4 && args.contains('--dart-sdk'));
-        if (!(hasBuildMode && onlyDartSdkArg)) {
-          printAndFail('The --persistent_worker flag should be used with and '
-              'only with the --build-mode flag, and possibly the --dart-sdk '
-              'option. Got: $args');
-          return null; // Only reachable in testing.
-        }
-        return CommandLineOptions._fromArgs(resourceProvider, results);
-      }
-
       // Help requests.
       if (cast(results['help'])) {
         _showUsage(parser, fromHelp: true);
@@ -766,20 +593,12 @@
           exitHandler(15);
           return null; // Only reachable in testing.
         }
-      } else if (cast(results['persistent_worker'])) {
-        if (results.rest.isNotEmpty) {
-          errorSink.writeln(
-              'No source files expected in the persistent worker mode.');
-          _showUsage(parser);
-          exitHandler(15);
-          return null; // Only reachable in testing.
-        }
       } else if (cast(results['version'])) {
         outSink.writeln('$_binaryName version ${_getVersion()}');
         exitHandler(0);
         return null; // Only reachable in testing.
       } else {
-        if (results.rest.isEmpty && !cast<bool>(results['build-mode'])) {
+        if (results.rest.isEmpty) {
           _showUsage(parser, fromHelp: true);
           exitHandler(15);
           return null; // Only reachable in testing.
diff --git a/pkg/analyzer_cli/lib/starter.dart b/pkg/analyzer_cli/lib/starter.dart
index ad8e268..4f04f28 100644
--- a/pkg/analyzer_cli/lib/starter.dart
+++ b/pkg/analyzer_cli/lib/starter.dart
@@ -2,8 +2,6 @@
 // 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 'dart:isolate';
-
 import 'package:analyzer_cli/src/driver.dart';
 
 /// An object that can be used to start a command-line analysis. This class
@@ -16,8 +14,5 @@
   factory CommandLineStarter() = Driver;
 
   /// Use the given command-line [arguments] to start this analyzer.
-  ///
-  /// If [sendPort] is provided it is used for bazel worker communication
-  /// instead of stdin/stdout.
-  Future<void> start(List<String> arguments, {SendPort sendPort});
+  Future<void> start(List<String> arguments);
 }
diff --git a/pkg/analyzer_cli/pubspec.yaml b/pkg/analyzer_cli/pubspec.yaml
index da7989b..9ad9601 100644
--- a/pkg/analyzer_cli/pubspec.yaml
+++ b/pkg/analyzer_cli/pubspec.yaml
@@ -11,9 +11,6 @@
   analyzer:
     path: ../analyzer
   args: '>=0.13.0 <2.0.0'
-  bazel_worker: ^0.1.0
-  collection: ^1.14.1
-  convert: any
   linter: ^0.1.16
   meta:
     path: ../meta
@@ -23,6 +20,5 @@
 
 dev_dependencies:
   pedantic: ^1.9.0
-  protobuf: ^0.13.0
   test_reflective_loader: ^0.1.8
   test: ^1.0.0
diff --git a/pkg/analyzer_cli/test/all.dart b/pkg/analyzer_cli/test/all.dart
index 55beb94..c56ee1b 100644
--- a/pkg/analyzer_cli/test/all.dart
+++ b/pkg/analyzer_cli/test/all.dart
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'analysis_options_test.dart' as analysis_options;
-import 'build_mode_test.dart' as build_mode;
 import 'driver_test.dart' as driver;
 import 'embedder_test.dart' as embedder;
 import 'errors_reported_once_test.dart' as errors_reported_once;
@@ -16,7 +15,6 @@
 
 void main() {
   analysis_options.main();
-  build_mode.main();
   driver.main();
   embedder.main();
   errors_reported_once.main();
diff --git a/pkg/analyzer_cli/test/build_mode_test.dart b/pkg/analyzer_cli/test/build_mode_test.dart
deleted file mode 100644
index 5027e1f..0000000
--- a/pkg/analyzer_cli/test/build_mode_test.dart
+++ /dev/null
@@ -1,139 +0,0 @@
-// Copyright (c) 2016, 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 'package:analyzer/file_system/memory_file_system.dart';
-import 'package:analyzer_cli/src/build_mode.dart';
-import 'package:analyzer_cli/src/driver.dart';
-import 'package:analyzer_cli/src/options.dart';
-import 'package:bazel_worker/bazel_worker.dart';
-import 'package:bazel_worker/testing.dart';
-import 'package:protobuf/protobuf.dart';
-import 'package:test/test.dart';
-import 'package:test_reflective_loader/test_reflective_loader.dart';
-
-void main() {
-  defineReflectiveTests(WorkerLoopTest);
-}
-
-typedef _TestWorkerLoopAnalyze = void Function(CommandLineOptions options);
-
-/// [AnalyzerWorkerLoop] for testing.
-class TestAnalyzerWorkerLoop extends AnalyzerWorkerLoop {
-  final _TestWorkerLoopAnalyze _analyze;
-
-  TestAnalyzerWorkerLoop(AsyncWorkerConnection connection, [this._analyze])
-      : super(MemoryResourceProvider(), connection);
-
-  @override
-  Future<void> analyze(
-      CommandLineOptions options, Map<String, WorkerInput> inputs) async {
-    if (_analyze != null) {
-      _analyze(options);
-    }
-  }
-}
-
-@reflectiveTest
-class WorkerLoopTest {
-  final TestStdinAsync stdinStream = TestStdinAsync();
-  final TestStdoutStream stdoutStream = TestStdoutStream();
-  TestAsyncWorkerConnection connection;
-
-  WorkerLoopTest() {
-    connection = TestAsyncWorkerConnection(stdinStream, stdoutStream);
-  }
-
-  void setUp() {}
-
-  Future<void> test_run() async {
-    var request = WorkRequest();
-    request.arguments.addAll([
-      '--build-summary-input=/tmp/1.sum',
-      '--build-summary-input=/tmp/2.sum',
-      'package:foo/foo.dart|/inputs/foo/lib/foo.dart',
-      'package:foo/bar.dart|/inputs/foo/lib/bar.dart',
-    ]);
-    stdinStream.addInputBytes(_serializeProto(request));
-    stdinStream.close();
-
-    await TestAnalyzerWorkerLoop(connection, (CommandLineOptions options) {
-      expect(options.buildSummaryInputs,
-          unorderedEquals(['/tmp/1.sum', '/tmp/2.sum']));
-      expect(
-          options.sourceFiles,
-          unorderedEquals([
-            'package:foo/foo.dart|/inputs/foo/lib/foo.dart',
-            'package:foo/bar.dart|/inputs/foo/lib/bar.dart'
-          ]));
-      outSink.writeln('outSink a');
-      errorSink.writeln('errorSink a');
-      outSink.writeln('outSink b');
-      errorSink.writeln('errorSink b');
-    }).run();
-    expect(connection.responses, hasLength(1));
-
-    var response = connection.responses[0];
-    expect(response.exitCode, EXIT_CODE_OK, reason: response.output);
-    expect(
-        response.output,
-        allOf(contains('errorSink a'), contains('errorSink a'),
-            contains('outSink a'), contains('outSink b')));
-
-    // Check that a serialized version was written to std out.
-    expect(stdoutStream.writes, hasLength(1));
-    expect(stdoutStream.writes[0], _serializeProto(response));
-  }
-
-  Future<void> test_run_invalidOptions() async {
-    var request = WorkRequest();
-    request.arguments.addAll(['--unknown-option', '/foo.dart', '/bar.dart']);
-    stdinStream.addInputBytes(_serializeProto(request));
-    stdinStream.close();
-    await TestAnalyzerWorkerLoop(connection).run();
-    expect(connection.responses, hasLength(1));
-
-    var response = connection.responses[0];
-    expect(response.exitCode, EXIT_CODE_ERROR);
-    expect(response.output, anything);
-  }
-
-  Future<void> test_run_invalidRequest_noArgumentsInputs() async {
-    stdinStream.addInputBytes(_serializeProto(WorkRequest()));
-    stdinStream.close();
-
-    await TestAnalyzerWorkerLoop(connection).run();
-    expect(connection.responses, hasLength(1));
-
-    var response = connection.responses[0];
-    expect(response.exitCode, EXIT_CODE_ERROR);
-    expect(response.output, anything);
-  }
-
-  Future<void> test_run_invalidRequest_randomBytes() async {
-    stdinStream.addInputBytes([1, 2, 3]);
-    stdinStream.close();
-    await TestAnalyzerWorkerLoop(connection).run();
-    expect(connection.responses, hasLength(1));
-
-    var response = connection.responses[0];
-    expect(response.exitCode, EXIT_CODE_ERROR);
-    expect(response.output, anything);
-  }
-
-  Future<void> test_run_stopAtEOF() async {
-    stdinStream.close();
-    await TestAnalyzerWorkerLoop(connection).run();
-  }
-
-  List<int> _serializeProto(GeneratedMessage message) {
-    var buffer = message.writeToBuffer();
-    var writer = CodedBufferWriter();
-    writer.writeInt32NoTag(buffer.length);
-
-    var result = <int>[];
-    result.addAll(writer.toBuffer());
-    result.addAll(buffer);
-    return result;
-  }
-}
diff --git a/pkg/analyzer_cli/test/driver_test.dart b/pkg/analyzer_cli/test/driver_test.dart
index 9cdec75..d2a575b 100644
--- a/pkg/analyzer_cli/test/driver_test.dart
+++ b/pkg/analyzer_cli/test/driver_test.dart
@@ -10,7 +10,6 @@
 import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/source.dart';
-import 'package:analyzer/src/summary2/package_bundle_format.dart';
 import 'package:analyzer/src/util/file_paths.dart' as file_paths;
 import 'package:analyzer/src/util/sdk.dart';
 import 'package:analyzer_cli/src/ansi.dart' as ansi;
@@ -25,8 +24,6 @@
 
 void main() {
   defineReflectiveSuite(() {
-    defineReflectiveTests(BuildModeTest);
-    defineReflectiveTests(BuildModeSummaryDependenciesTest);
     defineReflectiveTests(ExitCodesTest);
     defineReflectiveTests(LinterTest);
     defineReflectiveTests(NonDartFilesTest);
@@ -34,52 +31,6 @@
   }, name: 'Driver');
 }
 
-class AbstractBuildModeTest extends BaseTest {
-  List<String> get _sdkSummaryArguments {
-    var sdkPath = path.dirname(
-      path.dirname(
-        Platform.resolvedExecutable,
-      ),
-    );
-
-    var dartSdkSummaryPath = path.join(
-      sdkPath,
-      'lib',
-      '_internal',
-      'strong.sum',
-    );
-
-    return ['--dart-sdk-summary', dartSdkSummaryPath];
-  }
-
-  Future<void> _doDrive(
-    String filePath, {
-    String sourceArgument,
-    String fileUri,
-    List<String> additionalArgs = const [],
-  }) async {
-    filePath = _posixToPlatformPath(filePath);
-
-    var options = _posixToPlatformPath(
-      'data/options_tests_project/' + file_paths.analysisOptionsYaml,
-    );
-
-    var args = <String>[];
-    args.add('--build-mode');
-    args.add('--format=machine');
-
-    args.addAll(_sdkSummaryArguments);
-    args.addAll(additionalArgs);
-
-    if (sourceArgument == null) {
-      fileUri ??= 'file:///test_file.dart';
-      sourceArgument = '$fileUri|$filePath';
-    }
-
-    await drive(sourceArgument, args: args, options: options);
-  }
-}
-
 class BaseTest {
   static const emptyOptionsFile = 'data/empty_options.yaml';
 
@@ -174,597 +125,6 @@
 }
 
 @reflectiveTest
-class BuildModeSummaryDependenciesTest extends AbstractBuildModeTest {
-  String tempDir;
-
-  /// Any direct export is a dependency.
-  Future<void> test_export_direct() async {
-    await _withTempDir(() async {
-      var a = await _buildPackage('a', [], 'class A {}');
-      await _assertDependencies('c', [a], '''
-export 'package:a/a.dart';
-''', [a]);
-    });
-  }
-
-  /// Imports of dependencies are not necessary dependencies.
-  /// Here our dependency does not use its dependency.
-  Future<void> test_import2_notUsed() async {
-    await _withTempDir(() async {
-      var a = await _buildPackage('a', [], '');
-      var b = await _buildPackage('b', [a], '''
-import 'package:a/a.dart';
-''');
-      await _assertDependencies('c', [a, b], '''
-import 'package:b/b.dart';
-''', [b]);
-    });
-  }
-
-  Future<void> test_import2_usedAsFieldType() async {
-    await _withTempDir(() async {
-      var a = await _buildPackage('a', [], 'class A {}');
-      var b = await _buildPackage('b', [a], '''
-import 'package:a/a.dart';
-class B {
-  A f;
-}
-''');
-
-      // We don't use `f`, so don't depend on "a".
-      await _assertDependencies('c', [a, b], '''
-import 'package:b/b.dart';
-var x = B();
-''', [b]);
-
-      // We use `f` for type inference.
-      // So, dependency on "a".
-      await _assertDependencies('c', [a, b], '''
-import 'package:b/b.dart';
-var x = B().f;
-''', [a, b]);
-
-      // We reference `f` in initializer, but not for type inference.
-      // So, no dependency on "a".
-      await _assertDependencies('c', [a, b], '''
-import 'package:b/b.dart';
-Object x = B().f;
-''', [b]);
-
-      // We perform full analysis, so request the type of `f`;
-      // So, dependency on "a".
-      await _assertDependencies(
-        'c',
-        [a, b],
-        '''
-import 'package:b/b.dart';
-Object x = B().f;
-''',
-        [a, b],
-        summaryOnly: false,
-      );
-    });
-  }
-
-  Future<void> test_import2_usedAsSupertype() async {
-    await _withTempDir(() async {
-      var a = await _buildPackage('a', [], 'class A {}');
-      var b = await _buildPackage('b', [], 'class B {}');
-      var c = await _buildPackage('c', [a], '''
-import 'package:a/a.dart';
-import 'package:b/b.dart';
-class C1 extends A {}
-class C2 extends B {}
-''');
-
-      // When we instantiate `C1`, we ask `C1` for its type parameters.
-      // So, we apply resolution to the whole `C1` header (not members).
-      // So, we request `A` that is the superclass of `C1`.
-      // So, dependency on "a".
-      //
-      // But we don't access `C2`, so don't use its supertype `B`.
-      // So, no dependency on "b".
-      await _assertDependencies('d', [a, b, c], '''
-import 'package:c/c.dart';
-C1 x;
-''', [a, c]);
-    });
-  }
-
-  Future<void> test_import2_usedAsTopLevelVariableType() async {
-    await _withTempDir(() async {
-      var a = await _buildPackage('a', [], 'class A {}');
-      var b = await _buildPackage('b', [a], '''
-import 'package:a/a.dart';
-A v;
-''');
-
-      // We don't use `v`.
-      // So, no dependency on "a".
-      await _assertDependencies('c', [a, b], '''
-import 'package:b/b.dart';
-''', [b]);
-
-      // We use `v` for type inference.
-      // So, dependency on "a".
-      await _assertDependencies('c', [a, b], '''
-import 'package:b/b.dart';
-var x = v;
-''', [a, b]);
-
-      // We don't use `v` for type inference.
-      // So, no dependency on "a".
-      await _assertDependencies('c', [a, b], '''
-import 'package:b/b.dart';
-Object x = v;
-''', [b]);
-
-      // We perform full analysis, and request the type of `v`.
-      // So, dependency on "a".
-      await _assertDependencies(
-        'c',
-        [a, b],
-        '''
-import 'package:b/b.dart';
-Object x = v;
-''',
-        [a, b],
-        summaryOnly: false,
-      );
-
-      // We use `v` in a method body.
-      // So, no dependency on "a".
-      await _assertDependencies('c', [a, b], '''
-import 'package:b/b.dart';
-main() {
-  v;
-}
-''', [b]);
-
-      // We perform full analysis, so ask for the type of `v`.
-      // So, dependency on "a".
-      await _assertDependencies(
-        'c',
-        [a, b],
-        '''
-import 'package:b/b.dart';
-main() {
-  v;
-}
-''',
-        [a, b],
-        summaryOnly: false,
-      );
-    });
-  }
-
-  /// Any direct import is a dependency.
-  Future<void> test_import_direct() async {
-    await _withTempDir(() async {
-      var a = await _buildPackage('a', [], '');
-      var b = await _buildPackage('b', [], '');
-      await _assertDependencies('c', [a, b], '''
-import 'package:a/a.dart';
-import 'package:b/b.dart';
-''', [a, b]);
-    });
-  }
-
-  /// Exports of dependencies are dependencies.
-  Future<void> test_import_export() async {
-    await _withTempDir(() async {
-      var a = await _buildPackage('a', [], 'class A {}');
-      var b = await _buildPackage('b', [a], '''
-export 'package:a/a.dart';
-''');
-      await _assertDependencies('c', [a, b], '''
-import 'package:b/b.dart';
-''', [a, b]);
-    });
-  }
-
-  Future<void> _assertDependencies(
-    String name,
-    List<_DependencyPackage> inputPackages,
-    String content,
-    List<_DependencyPackage> expectedPackages, {
-    bool summaryOnly = true,
-  }) async {
-    var pkg = await _buildPackage(name, inputPackages, content,
-        summaryOnly: summaryOnly);
-
-    var depString = File(pkg.dep).readAsStringSync();
-    var expectedList = expectedPackages.map((p) => p.sum).toList();
-    expect(depString.split('\n'), unorderedEquals(expectedList));
-  }
-
-  Future<_DependencyPackage> _buildPackage(
-    String name,
-    List<_DependencyPackage> inputPackages,
-    String content, {
-    bool summaryOnly = true,
-  }) async {
-    var filePath = path.join(tempDir, '$name.dart');
-    File(filePath).writeAsStringSync(content);
-    var pkg = _DependencyPackage(
-      name: name,
-      path: filePath,
-      uri: 'package:$name/$name.dart',
-      sum: path.join(tempDir, '$name.sum'),
-      dep: path.join(tempDir, '$name.dep'),
-    );
-
-    var args = <String>[];
-    if (summaryOnly) {
-      args.add('--build-summary-only');
-    }
-    for (var input in inputPackages) {
-      args.add('--build-summary-input=${input.sum}');
-    }
-    args.add('--build-summary-output=${pkg.sum}');
-    args.add('--summary-deps-output=${pkg.dep}');
-
-    await _doDrive(pkg.path, fileUri: pkg.uri, additionalArgs: args);
-    expect(exitCode, 0);
-
-    return pkg;
-  }
-
-  Future<void> _withTempDir(Future<void> Function() f) async {
-    await withTempDirAsync((tempDir) async {
-      this.tempDir = tempDir;
-      File(path.join(tempDir, 'WORKSPACE')).writeAsStringSync('');
-      await f();
-    });
-  }
-}
-
-@reflectiveTest
-class BuildModeTest extends AbstractBuildModeTest {
-  Future<void> test_buildLinked() async {
-    await withTempDirAsync((tempDir) async {
-      File(path.join(tempDir, 'WORKSPACE')).writeAsStringSync('');
-
-      var inputUri = 'package:dart.my/a.dart';
-      var inputPath = path.join(tempDir, 'dart', 'my', 'lib', 'a.dart');
-      (File(inputPath)..parent.createSync(recursive: true))
-          .writeAsStringSync('');
-
-      var outputPath = path.join(tempDir, 'test_file.dart.sum');
-      await _doDrive(inputPath, fileUri: inputUri, additionalArgs: [
-        '--build-summary-only',
-        '--build-summary-output=$outputPath'
-      ]);
-
-      var output = File(outputPath);
-      expect(output.existsSync(), isTrue);
-      var bundle = PackageBundleReader(await output.readAsBytes());
-
-      expect(_linkedLibraryUriList(bundle), [inputUri]);
-      expect(
-        _linkedLibraryUnitUriList(bundle, inputUri),
-        [inputUri],
-      );
-
-      expect(exitCode, 0);
-    });
-  }
-
-  Future<void> test_buildLinked_invalidPartUri() async {
-    await withTempDirAsync((tempDir) async {
-      File(path.join(tempDir, 'WORKSPACE')).writeAsStringSync('');
-      var aDart = path.join(tempDir, 'a.dart');
-
-      var aUri = 'package:aaa/a.dart';
-
-      var aSum = path.join(tempDir, 'a.sum');
-
-      File(aDart).writeAsStringSync('''
-part '[invalid]';
-''');
-
-      await _doDrive(aDart,
-          fileUri: aUri, additionalArgs: ['--build-summary-output=$aSum']);
-      expect(exitCode, ErrorSeverity.ERROR.ordinal);
-      var bytes = File(aSum).readAsBytesSync();
-      var bundle = PackageBundleReader(bytes);
-      expect(_linkedLibraryUriList(bundle), [aUri]);
-      expect(_linkedLibraryUnitUriList(bundle, aUri), [aUri]);
-    });
-  }
-
-  Future<void> test_buildSuppressExitCode_fail_whenFileNotFound() async {
-    await withTempDirAsync((tempDir) async {
-      File(path.join(tempDir, 'WORKSPACE')).writeAsStringSync('');
-
-      await _doDrive(path.join(tempDir, 'non_existent_file.dart'),
-          additionalArgs: ['--build-suppress-exit-code']);
-      expect(exitCode, isNot(0));
-    });
-  }
-
-  Future<void> test_buildSuppressExitCode_success_evenIfHasError() async {
-    await withTempDirAsync((tempDir) async {
-      File(path.join(tempDir, 'WORKSPACE')).writeAsStringSync('');
-
-      var inputUri = 'package:dart.my/a.dart';
-      var inputPath = path.join(tempDir, 'dart', 'my', 'lib', 'a.dart');
-      (File(inputPath)..parent.createSync(recursive: true))
-          .writeAsStringSync('error');
-
-      await _doDrive(inputPath, fileUri: inputUri, additionalArgs: [
-        '--build-suppress-exit-code',
-      ]);
-      expect(exitCode, 0);
-    });
-  }
-
-  Future<void> test_consumeLinked() async {
-    await withTempDirAsync((tempDir) async {
-      File(path.join(tempDir, 'WORKSPACE')).writeAsStringSync('');
-
-      var aDart = path.join(tempDir, 'a.dart');
-      var bDart = path.join(tempDir, 'b.dart');
-      var cDart = path.join(tempDir, 'c.dart');
-
-      var aUri = 'package:aaa/a.dart';
-      var bUri = 'package:bbb/b.dart';
-      var cUri = 'package:ccc/c.dart';
-
-      var aSum = path.join(tempDir, 'a.sum');
-      var bSum = path.join(tempDir, 'b.sum');
-      var cSum = path.join(tempDir, 'c.sum');
-
-      File(aDart).writeAsStringSync('class A {}');
-      File(bDart).writeAsStringSync('''
-export 'package:aaa/a.dart';
-class B {}
-''');
-      File(cDart).writeAsStringSync('''
-import 'package:bbb/b.dart';
-var a = new A();
-var b = new B();
-''');
-
-      // Analyze package:aaa/a.dart and compute summary.
-      {
-        await _doDrive(aDart,
-            fileUri: aUri, additionalArgs: ['--build-summary-output=$aSum']);
-        expect(exitCode, 0);
-        var bytes = File(aSum).readAsBytesSync();
-        var bundle = PackageBundleReader(bytes);
-        expect(_linkedLibraryUriList(bundle), [aUri]);
-        expect(_linkedLibraryUnitUriList(bundle, aUri), [aUri]);
-      }
-
-      // Analyze package:bbb/b.dart and compute summary.
-      {
-        await _doDrive(bDart, fileUri: bUri, additionalArgs: [
-          '--build-summary-input=$aSum',
-          '--build-summary-output=$bSum'
-        ]);
-        expect(exitCode, 0);
-        var bytes = File(bSum).readAsBytesSync();
-        var bundle = PackageBundleReader(bytes);
-        expect(_linkedLibraryUriList(bundle), [bUri]);
-        expect(_linkedLibraryUnitUriList(bundle, bUri), [bUri]);
-      }
-
-      // Analyze package:ccc/c.dart and compute summary.
-      {
-        await _doDrive(cDart, fileUri: cUri, additionalArgs: [
-          '--build-summary-input=$aSum,$bSum',
-          '--build-summary-output=$cSum'
-        ]);
-        expect(exitCode, 0);
-        var bytes = File(cSum).readAsBytesSync();
-        var bundle = PackageBundleReader(bytes);
-        expect(_linkedLibraryUriList(bundle), [cUri]);
-        expect(_linkedLibraryUnitUriList(bundle, cUri), [cUri]);
-      }
-    });
-  }
-
-  Future<void> test_error_notUriPipePath() async {
-    await withTempDirAsync((tempDir) async {
-      File(path.join(tempDir, 'WORKSPACE')).writeAsStringSync('');
-
-      var testDart = path.join(tempDir, 'test.dart');
-      File(testDart).writeAsStringSync('var v = 42;');
-
-      // We pass just path, not "uri|path", this is a fatal error.
-      await _doDrive(
-        testDart,
-        additionalArgs: ['--build-mode', '--format=machine'],
-        sourceArgument: testDart,
-      );
-      expect(exitCode, ErrorSeverity.ERROR.ordinal);
-    });
-  }
-
-  Future<void> test_fail_whenHasError() async {
-    await withTempDirAsync((tempDir) async {
-      File(path.join(tempDir, 'WORKSPACE')).writeAsStringSync('');
-
-      var inputUri = 'package:my/with_error.dart';
-      var inputPath = path.join(tempDir, 'my', 'lib', 'with_error.dart');
-      (File(inputPath)..parent.createSync(recursive: true))
-          .writeAsStringSync('error');
-
-      await _doDrive(inputPath, fileUri: inputUri);
-      expect(exitCode, isNot(0));
-    });
-  }
-
-  @FailingTest(reason: 'Why do we support this case?')
-  Future<void> test_noInputs() async {
-    await withTempDirAsync((tempDir) async {
-      var outputPath = path.join(tempDir, 'test.sum');
-
-      await driveMany([], args: [
-        '--build-mode',
-        '--format=machine',
-        ..._sdkSummaryArguments,
-        '--build-summary-only',
-        '--build-summary-output=$outputPath',
-      ]);
-
-      var output = File(outputPath);
-      expect(output.existsSync(), isTrue);
-
-      expect(exitCode, 0);
-    });
-  }
-
-  Future<void> test_noStatistics() async {
-    await withTempDirAsync((tempDir) async {
-      File(path.join(tempDir, 'WORKSPACE')).writeAsStringSync('');
-
-      var inputUri = 'package:my/a.dart';
-      var inputPath = path.join(tempDir, 'my', 'lib', 'a.dart');
-      (File(inputPath)..parent.createSync(recursive: true))
-          .writeAsStringSync('class A {}');
-
-      await _doDrive(inputPath, fileUri: inputUri);
-
-      // Should not print statistics summary.
-      expect(outSink.toString(), isEmpty);
-      expect(errorSink.toString(), isEmpty);
-      expect(exitCode, 0);
-    });
-  }
-
-  Future<void> test_onlyErrors_partFirst() async {
-    await withTempDirAsync((tempDir) async {
-      File(path.join(tempDir, 'WORKSPACE')).writeAsStringSync('');
-
-      var aDart = path.join(tempDir, 'a.dart');
-      var bDart = path.join(tempDir, 'b.dart');
-
-      var aUri = 'package:aaa/a.dart';
-      var bUri = 'package:aaa/b.dart';
-
-      File(aDart).writeAsStringSync(r'''
-library lib;
-part 'b.dart';
-class A {}
-''');
-      File(bDart).writeAsStringSync('''
-part of lib;
-class B {}
-var a = new A();
-var b = new B();
-''');
-
-      // Analyze b.dart (part) and then a.dart (its library).
-      // No errors should be reported - the part should know its library.
-      await _doDrive(bDart, fileUri: bUri, additionalArgs: ['$aUri|$aDart']);
-      expect(errorSink, isEmpty);
-    });
-  }
-
-  Future<void> test_packageConfig_packagesOptions() async {
-    await withTempDirAsync((tempDir) async {
-      File(path.join(tempDir, 'WORKSPACE')).writeAsStringSync('');
-
-      var packagesPath = path.join(tempDir, 'aaa.packages');
-
-      var aaaRoot = path.join(tempDir, 'packages', 'aaa');
-      var aPath = path.join(aaaRoot, 'lib', 'a.dart');
-
-      var aUri = 'package:aaa/a.dart';
-
-      File(packagesPath).createSync(recursive: true);
-      File(packagesPath).writeAsStringSync('''
-{
-  "configVersion": 2,
-  "packages": [
-    {
-      "name": "aaa",
-      "rootUri": "${path.toUri(aaaRoot)}",
-      "packageUri": "lib/",
-      "languageVersion": "2.4"
-    }
-  ]
-}
-''');
-
-      File(aPath).createSync(recursive: true);
-      File(aPath).writeAsStringSync(r'''
-extension E on int {}
-''');
-
-      // Analyze package:aaa/a.dart and compute errors.
-      await _doDrive(
-        aPath,
-        fileUri: aUri,
-        additionalArgs: [
-          '--packages=$packagesPath',
-        ],
-      );
-      expect(exitCode, ErrorSeverity.ERROR.ordinal);
-      expect(errorSink.toString(), contains('extension-methods'));
-    });
-  }
-
-  Future<void> test_packageConfig_relativeToFile() async {
-    await withTempDirAsync((tempDir) async {
-      File(path.join(tempDir, 'WORKSPACE')).writeAsStringSync('');
-
-      var packagesPath = path.join(tempDir, '.dart_tool/package_config.json');
-
-      var aaaRoot = path.join(tempDir, 'packages', 'aaa');
-      var aPath = path.join(aaaRoot, 'lib', 'a.dart');
-
-      var aUri = 'package:aaa/a.dart';
-
-      File(packagesPath).createSync(recursive: true);
-      File(packagesPath).writeAsStringSync('''
-{
-  "configVersion": 2,
-  "packages": [
-    {
-      "name": "aaa",
-      "rootUri": "${path.toUri(aaaRoot)}",
-      "packageUri": "lib/",
-      "languageVersion": "2.4"
-    }
-  ]
-}
-''');
-
-      File(aPath).createSync(recursive: true);
-      File(aPath).writeAsStringSync(r'''
-extension E on int {}
-''');
-
-      // Analyze package:aaa/a.dart and compute errors.
-      await _doDrive(
-        aPath,
-        fileUri: aUri,
-        additionalArgs: [],
-      );
-      expect(exitCode, ErrorSeverity.ERROR.ordinal);
-      expect(errorSink.toString(), contains('extension-methods'));
-    });
-  }
-
-  Iterable<String> _linkedLibraryUnitUriList(
-    PackageBundleReader bundle,
-    String libraryUriStr,
-  ) {
-    var libraries = bundle.libraries;
-    var library = libraries.singleWhere((l) => l.uriStr == libraryUriStr);
-    return library.units.map((u) => u.uriStr).toList();
-  }
-
-  Iterable<String> _linkedLibraryUriList(PackageBundleReader bundle) {
-    var libraries = bundle.libraries;
-    return libraries.map((l) => l.uriStr).toList();
-  }
-}
-
-@reflectiveTest
 class ExitCodesTest extends BaseTest {
   @SkippedTest(reason: 'Fails on bots, passes locally. Do not know why.')
   Future<void> test_bazelWorkspace_relativePath() async {
@@ -1145,13 +505,3 @@
   @override
   dynamic noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
 }
-
-class _DependencyPackage {
-  final String name;
-  final String path;
-  final String uri;
-  final String sum;
-  final String dep;
-
-  _DependencyPackage({this.name, this.path, this.uri, this.sum, this.dep});
-}
diff --git a/pkg/analyzer_cli/test/options_test.dart b/pkg/analyzer_cli/test/options_test.dart
index 3085269..10ab651 100644
--- a/pkg/analyzer_cli/test/options_test.dart
+++ b/pkg/analyzer_cli/test/options_test.dart
@@ -55,13 +55,6 @@
       test('defaults', () {
         var options = parse(['--dart-sdk', '.', 'foo.dart']);
         expect(options, isNotNull);
-        expect(options.buildMode, isFalse);
-        expect(options.buildAnalysisOutput, isNull);
-        expect(options.buildSummaryInputs, isEmpty);
-        expect(options.buildSummaryOnly, isFalse);
-        expect(options.buildSummaryOutput, isNull);
-        expect(options.buildSummaryOutputSemantic, isNull);
-        expect(options.buildSuppressExitCode, isFalse);
         expect(options.dartSdkPath, isNotNull);
         expect(options.disableCacheFlushing, isFalse);
         expect(options.disableHints, isFalse);
@@ -270,37 +263,7 @@
       });
     });
   });
-  defineReflectiveTests(CommandLineOptions_BuildMode_Test);
-}
-
-@reflectiveTest
-class AbstractStatusTest {
-  int lastExitHandlerCode;
-  StringBuffer outStringBuffer = StringBuffer();
-  StringBuffer errorStringBuffer = StringBuffer();
-
-  StringSink savedOutSink, savedErrorSink;
-  int savedExitCode;
-  ExitHandler savedExitHandler;
-
-  void setUp() {
-    savedOutSink = outSink;
-    savedErrorSink = errorSink;
-    savedExitHandler = exitHandler;
-    savedExitCode = exitCode;
-    exitHandler = (int code) {
-      lastExitHandlerCode = code;
-    };
-    outSink = outStringBuffer;
-    errorSink = errorStringBuffer;
-  }
-
-  void tearDown() {
-    outSink = savedOutSink;
-    errorSink = savedErrorSink;
-    exitCode = savedExitCode;
-    exitHandler = savedExitHandler;
-  }
+  defineReflectiveTests(ArgumentsTest);
 }
 
 @reflectiveTest
@@ -308,17 +271,6 @@
   CommandLineOptions commandLineOptions;
   String failureMessage;
 
-  void test_dartSdkSummaryPath() {
-    var expected = 'my_sdk.summary';
-    _parse(['--dart-sdk-summary=$expected', 'a.dart']);
-
-    var builderOptions = commandLineOptions.contextBuilderOptions;
-    expect(
-      builderOptions.dartSdkSummaryPath,
-      endsWith(expected),
-    );
-  }
-
   void test_declaredVariables() {
     _parse(['-Da=0', '-Db=', 'a.dart']);
 
@@ -376,46 +328,6 @@
     );
   }
 
-  void test_preprocessArgs_noReplacement() {
-    var original = <String>['--xx' '--yy' 'baz'];
-    var result = CommandLineOptions.preprocessArgs(resourceProvider, original);
-    expect(result, orderedEquals(original));
-    expect(identical(original, result), isFalse);
-  }
-
-  void test_preprocessArgs_replacement_exists() {
-    var filePath = convertPath('/args.txt');
-    newFile(filePath, content: '''
--a
---xx
-
-foo
-bar
-''');
-    var result = CommandLineOptions.preprocessArgs(
-        resourceProvider, ['--preserved', '@$filePath']);
-    expect(result, orderedEquals(['--preserved', '-a', '--xx', 'foo', 'bar']));
-  }
-
-  void test_preprocessArgs_replacement_nonexistent() {
-    var filePath = convertPath('/args.txt');
-    var args = <String>['ignored', '@$filePath'];
-    try {
-      CommandLineOptions.preprocessArgs(resourceProvider, args);
-      fail('Expect exception');
-    } on Exception catch (e) {
-      expect(e.toString(), contains('Failed to read file'));
-      expect(e.toString(), contains('@$filePath'));
-    }
-  }
-
-  void test_preprocessArgs_replacement_notLast() {
-    var filePath = convertPath('/args.txt');
-    var args = <String>['a', '@$filePath', 'b'];
-    var result = CommandLineOptions.preprocessArgs(resourceProvider, args);
-    expect(result, orderedEquals(args));
-  }
-
   void test_updateAnalysisOptions_defaultLanguageVersion() {
     _applyAnalysisOptions(
       ['a.dart'],
@@ -656,140 +568,3 @@
     );
   }
 }
-
-@reflectiveTest
-class CommandLineOptions_BuildMode_Test extends AbstractStatusTest {
-  CommandLineOptions options;
-  String failureMessage;
-
-  void test_buildAnalysisOutput() {
-    _parseBuildMode([
-      '--build-analysis-output=//path/to/output.analysis',
-      'package:p/foo.dart|/path/to/p/lib/foo.dart',
-    ]);
-    expect(options.buildMode, isTrue);
-    expect(options.buildAnalysisOutput, '//path/to/output.analysis');
-  }
-
-  void test_buildMode() {
-    _parseBuildMode([
-      'package:p/foo.dart|/path/to/p/lib/foo.dart',
-    ]);
-    expect(options.buildMode, isTrue);
-  }
-
-  void test_buildMode_allowsEmptyFileList() {
-    _parseBuildMode([]);
-    expect(options.buildMode, isTrue);
-    expect(options.sourceFiles, isEmpty);
-  }
-
-  void test_buildMode_noDartSdkSummary() {
-    _parseBuildMode(
-      ['package:aaa/a.dart|/aaa/lib/a.dart'],
-      withDartSdkSummary: false,
-    );
-    expect(options, isNull);
-    expect(failureMessage, contains('--dart-sdk-summary'));
-  }
-
-  void test_buildSummaryInputs_commaSeparated() {
-    _parseBuildMode([
-      '--build-summary-input=/path/to/aaa.sum,/path/to/bbb.sum',
-      'package:p/foo.dart|/path/to/p/lib/foo.dart',
-    ]);
-    expect(options.buildMode, isTrue);
-    expect(
-        options.buildSummaryInputs, ['/path/to/aaa.sum', '/path/to/bbb.sum']);
-  }
-
-  void test_buildSummaryInputs_commaSeparated_normalMode() {
-    _parse([
-      '--build-summary-input=/path/to/aaa.sum,/path/to/bbb.sum',
-      '/path/to/p/lib/foo.dart',
-    ]);
-    expect(options.buildMode, isFalse);
-    expect(
-        options.buildSummaryInputs, ['/path/to/aaa.sum', '/path/to/bbb.sum']);
-  }
-
-  void test_buildSummaryInputs_separateFlags() {
-    _parseBuildMode([
-      '--build-summary-input=/path/to/aaa.sum',
-      '--build-summary-input=/path/to/bbb.sum',
-      'package:p/foo.dart|/path/to/p/lib/foo.dart',
-    ]);
-    expect(options.buildMode, isTrue);
-    expect(
-        options.buildSummaryInputs, ['/path/to/aaa.sum', '/path/to/bbb.sum']);
-  }
-
-  void test_buildSummaryInputs_separateFlags_normalMode() {
-    _parse([
-      '--build-summary-input=/path/to/aaa.sum',
-      '--build-summary-input=/path/to/bbb.sum',
-      'package:p/foo.dart|/path/to/p/lib/foo.dart',
-    ]);
-    expect(options.buildMode, isFalse);
-    expect(
-        options.buildSummaryInputs, ['/path/to/aaa.sum', '/path/to/bbb.sum']);
-  }
-
-  void test_buildSummaryOnly() {
-    _parseBuildMode([
-      '--build-summary-output=/path/to/aaa.sum',
-      '--build-summary-only',
-      'package:p/foo.dart|/path/to/p/lib/foo.dart',
-    ]);
-    expect(options.buildMode, isTrue);
-    expect(options.buildSummaryOnly, isTrue);
-  }
-
-  void test_buildSummaryOutput() {
-    _parseBuildMode([
-      '--build-summary-output=//path/to/output.sum',
-      'package:p/foo.dart|/path/to/p/lib/foo.dart',
-    ]);
-    expect(options.buildMode, isTrue);
-    expect(options.buildSummaryOutput, '//path/to/output.sum');
-  }
-
-  void test_buildSummaryOutputSemantic() {
-    _parseBuildMode([
-      '--build-summary-output-semantic=//path/to/output.sum',
-      'package:p/foo.dart|/path/to/p/lib/foo.dart',
-    ]);
-    expect(options.buildMode, isTrue);
-    expect(options.buildSummaryOutputSemantic, '//path/to/output.sum');
-  }
-
-  void test_buildSuppressExitCode() {
-    _parseBuildMode([
-      '--build-suppress-exit-code',
-      'package:p/foo.dart|/path/to/p/lib/foo.dart',
-    ]);
-    expect(options.buildMode, isTrue);
-    expect(options.buildSuppressExitCode, isTrue);
-  }
-
-  void _parse(List<String> args) {
-    var resourceProvider = PhysicalResourceProvider.INSTANCE;
-    options =
-        CommandLineOptions.parse(resourceProvider, args, printAndFail: (msg) {
-      failureMessage = msg;
-    });
-  }
-
-  void _parseBuildMode(List<String> specificArguments,
-      {bool withDartSdkSummary = true}) {
-    var args = [
-      '--build-mode',
-      if (withDartSdkSummary) ...[
-        '--dart-sdk-summary',
-        '/sdk/lib/strong.sum',
-      ],
-      ...specificArguments
-    ];
-    _parse(args);
-  }
-}
diff --git a/pkg/front_end/testcases/const_functions/const_functions_block.dart b/pkg/front_end/testcases/const_functions/const_functions_block.dart
index d7a303c..067a7c4 100644
--- a/pkg/front_end/testcases/const_functions/const_functions_block.dart
+++ b/pkg/front_end/testcases/const_functions/const_functions_block.dart
@@ -4,8 +4,6 @@
 
 // Tests blocks and scope with const functions.
 
-// SharedOptions=--enable-experiment=const-functions
-
 import "package:expect/expect.dart";
 
 void blockTest() {
diff --git a/pkg/front_end/testcases/const_functions/const_functions_local_functions.dart b/pkg/front_end/testcases/const_functions/const_functions_local_functions.dart
index 7d2caf5..47dd6a1 100644
--- a/pkg/front_end/testcases/const_functions/const_functions_local_functions.dart
+++ b/pkg/front_end/testcases/const_functions/const_functions_local_functions.dart
@@ -4,8 +4,6 @@
 
 // Tests local function usage, some having references to other constant values.
 
-// SharedOptions=--enable-experiment=const-functions
-
 import "package:expect/expect.dart";
 
 int function1() {
diff --git a/pkg/front_end/testcases/const_functions/const_functions_variable_assignments.dart b/pkg/front_end/testcases/const_functions/const_functions_variable_assignments.dart
index 3a3fc6f..345e14c 100644
--- a/pkg/front_end/testcases/const_functions/const_functions_variable_assignments.dart
+++ b/pkg/front_end/testcases/const_functions/const_functions_variable_assignments.dart
@@ -4,8 +4,6 @@
 
 // Tests variable assignments for const functions.
 
-// SharedOptions=--enable-experiment=const-functions
-
 import "package:expect/expect.dart";
 
 const var1 = varAssignmentTest(1);
diff --git a/pkg/front_end/testcases/const_functions/const_functions_variable_declarations.dart b/pkg/front_end/testcases/const_functions/const_functions_variable_declarations.dart
index 691f46f..4cbaa94 100644
--- a/pkg/front_end/testcases/const_functions/const_functions_variable_declarations.dart
+++ b/pkg/front_end/testcases/const_functions/const_functions_variable_declarations.dart
@@ -4,8 +4,6 @@
 
 // Tests creating new local variables within const functions.
 
-// SharedOptions=--enable-experiment=const-functions
-
 import "package:expect/expect.dart";
 
 const var1 = function1(1, 2);
diff --git a/pkg/front_end/testcases/const_functions/const_functions_variable_declarations.dart.strong.transformed.expect b/pkg/front_end/testcases/const_functions/const_functions_variable_declarations.dart.strong.transformed.expect
index cf33701..de3ed54 100644
--- a/pkg/front_end/testcases/const_functions/const_functions_variable_declarations.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/const_functions/const_functions_variable_declarations.dart.strong.transformed.expect
@@ -48,5 +48,5 @@
 }
 
 Extra constant evaluation status:
-Evaluated: MethodInvocation @ org-dartlang-testcase:///const_functions_variable_declarations.dart:48:23 -> IntConstant(-2)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///const_functions_variable_declarations.dart:46:23 -> IntConstant(-2)
 Extra constant evaluation: evaluated: 20, effectively constant: 1
diff --git a/pkg/front_end/testcases/const_functions/const_functions_variable_declarations.dart.weak.transformed.expect b/pkg/front_end/testcases/const_functions/const_functions_variable_declarations.dart.weak.transformed.expect
index cf33701..de3ed54 100644
--- a/pkg/front_end/testcases/const_functions/const_functions_variable_declarations.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/const_functions/const_functions_variable_declarations.dart.weak.transformed.expect
@@ -48,5 +48,5 @@
 }
 
 Extra constant evaluation status:
-Evaluated: MethodInvocation @ org-dartlang-testcase:///const_functions_variable_declarations.dart:48:23 -> IntConstant(-2)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///const_functions_variable_declarations.dart:46:23 -> IntConstant(-2)
 Extra constant evaluation: evaluated: 20, effectively constant: 1
diff --git a/tools/VERSION b/tools/VERSION
index d465aa8..529971b 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 13
 PATCH 0
-PRERELEASE 133
+PRERELEASE 134
 PRERELEASE_PATCH 0
\ No newline at end of file
