diff --git a/CHANGELOG.md b/CHANGELOG.md
index 1ed45f0..f165f47 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -412,6 +412,12 @@
 - Add `Enum.compareByName` helper function for comparing enum values by name.
 - Add extension methods on `Iterable<T extends Enum>`, intended for
   `SomeEnumType.values` lists, to look up values by name.
+- Deprecate `IntegerDivisionByZeroException`.
+  Makes the class also implement `Error`. Code throwing the exception will be
+  migrated to throwing an `Error` instead until the class is unused and
+  ready to be removed.
+  Code catching the class should move to catching `Error` instead
+  (or, for integers, check first for whether it's dividing by zero).
 
 #### `dart:io`
 
@@ -421,6 +427,25 @@
 - Add `RawSocket.sendMessage`, `RawSocket.receiveMessage` that allow passing of
   file handle references via Unix domain sockets.
 
+#### `dart:js_util`
+
+- The `js_util` methods `getProperty`, `setProperty`, `callMethod`,
+  `callConstructor`, and `newObject` now support a generic type argument
+  to specify the return type.
+
+#### `dart:web_sql`
+
+- **Breaking Change** [#46316](https://github.com/dart-lang/sdk/issues/46316):
+  The WebSQL standard was abandoned more than 10
+  years ago and is not supported by many browsers. This release completely
+  deletes the `dart:web_sql` library.
+
+#### `dart:html`
+
+- **Breaking Change** [#46316](https://github.com/dart-lang/sdk/issues/46316):
+  Related to the removal of `dart:web_sql` (see above), the
+  `window.openDatabase` has been removed as well.
+
 ### Tools
 
 #### Dart command line
@@ -651,6 +676,7 @@
 - The `Symbol` constructor now accepts any string as argument. Symbols are equal
   if they were created from the same string.
 
+
 #### `dart:ffi`
 
 - Adds the `DynamicLibrary.providesSymbol` function to check whether a symbol is
diff --git a/DEPS b/DEPS
index aea5e2a..3f5007c 100644
--- a/DEPS
+++ b/DEPS
@@ -139,7 +139,7 @@
   "pool_rev": "7abe634002a1ba8a0928eded086062f1307ccfae",
   "process_rev": "56ece43b53b64c63ae51ec184b76bd5360c28d0b",
   "protobuf_rev": "c1eb6cb51af39ccbaa1a8e19349546586a5c8e31",
-  "pub_rev": "35681b0126a1fb48bf2062dd09f74296715402c2",
+  "pub_rev": "400f21e9883ce6555b66d3ef82f0b732ba9b9fc8",
   "pub_semver_rev": "a43ad72fb6b7869607581b5fedcb186d1e74276a",
   "root_certificates_rev": "692f6d6488af68e0121317a9c2c9eb393eb0ee50",
   "rust_revision": "b7856f695d65a8ebc846754f97d15814bcb1c244",
diff --git a/pkg/_fe_analyzer_shared/test/flow_analysis/flow_analysis_test.dart b/pkg/_fe_analyzer_shared/test/flow_analysis/flow_analysis_test.dart
index 07b7e12..249b33d 100644
--- a/pkg/_fe_analyzer_shared/test/flow_analysis/flow_analysis_test.dart
+++ b/pkg/_fe_analyzer_shared/test/flow_analysis/flow_analysis_test.dart
@@ -1302,9 +1302,9 @@
 
     test('initialize() does not promote when final', () {
       var h = Harness();
-      var x = Var('x', 'int?');
+      var x = Var('x', 'int?', isFinal: true);
       h.run([
-        declareInitialized(x, expr('int'), isFinal: true),
+        declareInitialized(x, expr('int')),
         checkNotPromoted(x),
       ]);
     });
@@ -1326,9 +1326,9 @@
         var h = Harness()
           ..addSubtype('T&int', 'T', true)
           ..addFactor('T', 'T&int', 'T');
-        var x = Var('x', 'T', isImplicitlyTyped: true);
+        var x = Var('x', 'T', isFinal: true, isImplicitlyTyped: true);
         h.run([
-          declareInitialized(x, expr('T&int'), isFinal: true),
+          declareInitialized(x, expr('T&int')),
           checkPromoted(x, 'T&int'),
         ]);
       });
@@ -1348,9 +1348,9 @@
 
       test('when final', () {
         var h = Harness();
-        var x = Var('x', 'T');
+        var x = Var('x', 'T', isFinal: true);
         h.run([
-          declareInitialized(x, expr('T&int'), isFinal: true),
+          declareInitialized(x, expr('T&int')),
           checkNotPromoted(x),
         ]);
       });
@@ -1370,9 +1370,9 @@
 
       test('when final', () {
         var h = Harness();
-        var x = Var('x', 'dynamic', isImplicitlyTyped: true);
+        var x = Var('x', 'dynamic', isFinal: true, isImplicitlyTyped: true);
         h.run([
-          declareInitialized(x, expr('Null'), isFinal: true),
+          declareInitialized(x, expr('Null')),
           checkNotPromoted(x),
         ]);
       });
@@ -1398,10 +1398,10 @@
 
     test('initialize() does not store expressionInfo when late', () {
       var h = Harness();
-      var x = Var('x', 'Object');
+      var x = Var('x', 'Object', isLate: true);
       var y = Var('y', 'int?');
       h.run([
-        declareInitialized(x, y.expr.eq(nullLiteral), isLate: true),
+        declareInitialized(x, y.expr.eq(nullLiteral)),
         getSsaNodes((nodes) {
           expect(nodes[x]!.expressionInfo, isNull);
         }),
diff --git a/pkg/_fe_analyzer_shared/test/mini_ast.dart b/pkg/_fe_analyzer_shared/test/mini_ast.dart
index 57ce172..85ae066 100644
--- a/pkg/_fe_analyzer_shared/test/mini_ast.dart
+++ b/pkg/_fe_analyzer_shared/test/mini_ast.dart
@@ -55,16 +55,11 @@
 
 Statement continue_() => new _Continue();
 
-Statement declare(Var variable,
-        {required bool initialized,
-        bool isFinal = false,
-        bool isLate = false}) =>
-    new _Declare(variable, initialized ? expr(variable.type.type) : null,
-        isFinal, isLate);
+Statement declare(Var variable, {required bool initialized}) =>
+    new _Declare(variable, initialized ? expr(variable.type.type) : null);
 
-Statement declareInitialized(Var variable, Expression initializer,
-        {bool isFinal = false, bool isLate = false}) =>
-    new _Declare(variable, initializer, isFinal, isLate);
+Statement declareInitialized(Var variable, Expression initializer) =>
+    new _Declare(variable, initializer);
 
 Statement do_(List<Statement> body, Expression condition) =>
     _Do(block(body), condition);
@@ -664,9 +659,14 @@
 class Var {
   final String name;
   final Type type;
+  final bool isFinal;
   final bool isImplicitlyTyped;
+  final bool isLate;
 
-  Var(this.name, String typeStr, {this.isImplicitlyTyped = false})
+  Var(this.name, String typeStr,
+      {this.isFinal = false,
+      this.isImplicitlyTyped = false,
+      this.isLate = false})
       : type = Type(typeStr);
 
   /// Creates an L-value representing a reference to this variable.
@@ -882,6 +882,7 @@
 class _CheckUnassigned extends Statement {
   final Var variable;
   final bool expectedUnassignedState;
+  final StackTrace _creationTrace = StackTrace.current;
 
   _CheckUnassigned(this.variable, this.expectedUnassignedState) : super._();
 
@@ -896,7 +897,8 @@
 
   @override
   void _visit(Harness h) {
-    expect(h._flow.isUnassigned(variable), expectedUnassignedState);
+    expect(h._flow.isUnassigned(variable), expectedUnassignedState,
+        reason: '$_creationTrace');
     h._irBuilder.atom('null');
   }
 }
@@ -948,16 +950,13 @@
 class _Declare extends Statement {
   final Var variable;
   final Expression? initializer;
-  final bool isFinal;
-  final bool isLate;
 
-  _Declare(this.variable, this.initializer, this.isFinal, this.isLate)
-      : super._();
+  _Declare(this.variable, this.initializer) : super._();
 
   @override
   String toString() {
-    var latePart = isLate ? 'late ' : '';
-    var finalPart = isFinal ? 'final ' : '';
+    var latePart = variable.isLate ? 'late ' : '';
+    var finalPart = variable.isFinal ? 'final ' : '';
     var initializerPart = initializer != null ? ' = $initializer' : '';
     return '$latePart$finalPart$variable${initializerPart};';
   }
@@ -972,9 +971,11 @@
     h._irBuilder.atom(variable.name);
     h._typeAnalyzer.analyzeVariableDeclaration(
         this, variable.type, variable, initializer,
-        isFinal: isFinal, isLate: isLate);
+        isFinal: variable.isFinal, isLate: variable.isLate);
     h._irBuilder.apply(
-        ['declare', if (isLate) 'late', if (isFinal) 'final'].join('_'), 2);
+        ['declare', if (variable.isLate) 'late', if (variable.isFinal) 'final']
+            .join('_'),
+        2);
   }
 }
 
diff --git a/pkg/_js_interop_checks/lib/src/transformations/js_util_optimizer.dart b/pkg/_js_interop_checks/lib/src/transformations/js_util_optimizer.dart
index add033d..2e4f847 100644
--- a/pkg/_js_interop_checks/lib/src/transformations/js_util_optimizer.dart
+++ b/pkg/_js_interop_checks/lib/src/transformations/js_util_optimizer.dart
@@ -138,6 +138,8 @@
         Arguments([
           VariableGet(function.positionalParameters.first),
           StringLiteral(_getExtensionMemberName(node))
+        ], types: [
+          DynamicType()
         ]))
       ..fileOffset = node.fileOffset;
     return ReturnStatement(
@@ -157,6 +159,8 @@
           VariableGet(function.positionalParameters.first),
           StringLiteral(_getExtensionMemberName(node)),
           VariableGet(function.positionalParameters.last)
+        ], types: [
+          DynamicType()
         ]))
       ..fileOffset = node.fileOffset;
     return ReturnStatement(AsExpression(
@@ -178,6 +182,8 @@
               .sublist(1)
               .map((argument) => VariableGet(argument))
               .toList())
+        ], types: [
+          DynamicType()
         ]))
       ..fileOffset = node.fileOffset;
     return ReturnStatement(AsExpression(
@@ -224,7 +230,6 @@
   /// Removing the checks allows further inlining by the compilers.
   StaticInvocation _lowerSetProperty(StaticInvocation node) {
     Arguments arguments = node.arguments;
-    assert(arguments.types.isEmpty);
     assert(arguments.positional.length == 3);
     assert(arguments.named.isEmpty);
 
@@ -244,7 +249,6 @@
   /// Removing the checks allows further inlining by the compilers.
   StaticInvocation _lowerCallMethod(StaticInvocation node) {
     Arguments arguments = node.arguments;
-    assert(arguments.types.isEmpty);
     assert(arguments.positional.length == 3);
     assert(arguments.named.isEmpty);
 
@@ -260,7 +264,6 @@
   /// Removing the checks allows further inlining by the compilers.
   StaticInvocation _lowerCallConstructor(StaticInvocation node) {
     Arguments arguments = node.arguments;
-    assert(arguments.types.isEmpty);
     assert(arguments.positional.length == 2);
     assert(arguments.named.isEmpty);
 
@@ -283,8 +286,13 @@
     // Lower arguments in a List.empty factory call.
     if (argumentsList is StaticInvocation &&
         argumentsList.target == _listEmptyFactory) {
-      return _createCallUncheckedNode(callUncheckedTargets, [],
-          originalArguments, node.fileOffset, node.arguments.fileOffset);
+      return _createCallUncheckedNode(
+          callUncheckedTargets,
+          node.arguments.types,
+          [],
+          originalArguments,
+          node.fileOffset,
+          node.arguments.fileOffset);
     }
 
     // Lower arguments in other kinds of Lists.
@@ -323,6 +331,7 @@
 
     return _createCallUncheckedNode(
         callUncheckedTargets,
+        node.arguments.types,
         callUncheckedArguments,
         originalArguments,
         node.fileOffset,
@@ -333,6 +342,7 @@
   /// with the given 0-4 arguments.
   StaticInvocation _createCallUncheckedNode(
       List<Procedure> callUncheckedTargets,
+      List<DartType> callUncheckedTypes,
       List<Expression> callUncheckedArguments,
       List<Expression> originalArguments,
       int nodeFileOffset,
@@ -342,7 +352,7 @@
         callUncheckedTargets[callUncheckedArguments.length],
         Arguments(
           [...originalArguments, ...callUncheckedArguments],
-          types: [],
+          types: callUncheckedTypes,
         )..fileOffset = argumentsFileOffset)
       ..fileOffset = nodeFileOffset;
   }
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/named_constructor_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/named_constructor_contributor.dart
index c120d04..41fa61c 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/named_constructor_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/named_constructor_contributor.dart
@@ -2,10 +2,13 @@
 // 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:analysis_server/src/protocol_server.dart' as protocol;
 import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
 import 'package:analysis_server/src/services/completion/dart/suggestion_builder.dart';
+import 'package:analysis_server/src/utilities/extensions/completion_request.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/dart/element/type.dart';
 
 /// A contributor that produces suggestions based on the named constructors
 /// defined on a given class. More concretely, this class produces suggestions
@@ -21,28 +24,40 @@
   Future<void> computeSuggestions() async {
     var node = request.target.containingNode;
     if (node is ConstructorName) {
-      var libraryElement = request.libraryElement;
-      var namedType = node.type2;
-      var type = namedType.type;
-      if (type != null) {
-        var element = type.element;
+      if (node.parent is ConstructorReference) {
+        var element = node.type2.name.staticElement;
         if (element is ClassElement) {
-          _buildSuggestions(request, builder, libraryElement, element);
+          _buildSuggestions(element);
         }
+      } else {
+        var type = node.type2.type;
+        if (type is InterfaceType) {
+          var element = type.element;
+          _buildSuggestions(element);
+        }
+      }
+    } else if (node is PrefixedIdentifier) {
+      var element = node.prefix.staticElement;
+      if (element is ClassElement) {
+        _buildSuggestions(element);
       }
     }
   }
 
-  void _buildSuggestions(
-      DartCompletionRequest request,
-      SuggestionBuilder builder,
-      LibraryElement libElem,
-      ClassElement classElem) {
-    var isLocalClassDecl = classElem.library == libElem;
-    for (var constructor in classElem.constructors) {
+  void _buildSuggestions(ClassElement element) {
+    var tearOff = request.shouldSuggestTearOff(element);
+    var isLocalClassDecl = element.library == request.libraryElement;
+    for (var constructor in element.constructors) {
       if (isLocalClassDecl || !constructor.isPrivate) {
-        if (!classElem.isAbstract || constructor.isFactory) {
-          builder.suggestConstructor(constructor, hasClassName: true);
+        if (!element.isAbstract || constructor.isFactory) {
+          builder.suggestConstructor(
+            constructor,
+            hasClassName: true,
+            kind: tearOff
+                ? protocol.CompletionSuggestionKind.IDENTIFIER
+                : protocol.CompletionSuggestionKind.INVOCATION,
+            tearOff: tearOff,
+          );
         }
       }
     }
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/static_member_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/static_member_contributor.dart
index 1faa088..9aa546b 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/static_member_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/static_member_contributor.dart
@@ -4,6 +4,7 @@
 
 import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
 import 'package:analysis_server/src/services/completion/dart/suggestion_builder.dart';
+import 'package:analysis_server/src/utilities/extensions/completion_request.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/element/element.dart';
 
@@ -36,10 +37,12 @@
             builder.suggestAccessor(accessor, inheritanceDistance: 0.0);
           }
         }
-        for (var constructor in element.constructors) {
-          if (isVisible(constructor)) {
-            if (!element.isAbstract || constructor.isFactory) {
-              builder.suggestConstructor(constructor, hasClassName: true);
+        if (!request.shouldSuggestTearOff(element)) {
+          for (var constructor in element.constructors) {
+            if (isVisible(constructor)) {
+              if (!element.isAbstract || constructor.isFactory) {
+                builder.suggestConstructor(constructor, hasClassName: true);
+              }
             }
           }
         }
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/suggestion_builder.dart b/pkg/analysis_server/lib/src/services/completion/dart/suggestion_builder.dart
index a5aab9e..fd83310 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/suggestion_builder.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/suggestion_builder.dart
@@ -352,10 +352,13 @@
   /// period, and hence should not include the name of the class. If the class
   /// can only be referenced using a prefix, and the class name is to be
   /// included in the completion, then the [prefix] should be provided.
-  void suggestConstructor(ConstructorElement constructor,
-      {CompletionSuggestionKind kind = CompletionSuggestionKind.INVOCATION,
-      bool hasClassName = false,
-      String? prefix}) {
+  void suggestConstructor(
+    ConstructorElement constructor, {
+    CompletionSuggestionKind kind = CompletionSuggestionKind.INVOCATION,
+    bool tearOff = false,
+    bool hasClassName = false,
+    String? prefix,
+  }) {
     // If the class name is already in the text, then we don't support
     // prepending a prefix.
     assert(!hasClassName || prefix == null);
@@ -366,7 +369,11 @@
     }
 
     var completion = constructor.name;
-    if (!hasClassName && className.isNotEmpty) {
+    if (tearOff && completion.isEmpty) {
+      completion = 'new';
+    }
+
+    if (!hasClassName) {
       if (completion.isEmpty) {
         completion = className;
       } else {
diff --git a/pkg/analysis_server/lib/src/services/correction/assist_internal.dart b/pkg/analysis_server/lib/src/services/correction/assist_internal.dart
index 825ff4b..586a217 100644
--- a/pkg/analysis_server/lib/src/services/correction/assist_internal.dart
+++ b/pkg/analysis_server/lib/src/services/correction/assist_internal.dart
@@ -88,7 +88,7 @@
     AddDiagnosticPropertyReference.newInstance,
     AddNotNullAssert.newInstance,
     AddReturnType.newInstance,
-    AddTypeAnnotation.newInstance,
+    AddTypeAnnotation.newInstanceBulkFixable,
     AssignToLocalVariable.newInstance,
     ConvertAddAllToSpread.newInstance,
     ConvertClassToMixin.newInstance,
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/add_async.dart b/pkg/analysis_server/lib/src/services/correction/dart/add_async.dart
index 32499c0..2ba981e 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/add_async.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/add_async.dart
@@ -19,6 +19,14 @@
   AddAsync(this.isForMissingReturn);
 
   @override
+  // Not predictably the correct action.
+  bool get canBeAppliedInBulk => false;
+
+  @override
+  // Not predictably the correct action.
+  bool get canBeAppliedToFile => false;
+
+  @override
   FixKind get fixKind => DartFixKind.ADD_ASYNC;
 
   @override
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/add_missing_required_argument.dart b/pkg/analysis_server/lib/src/services/correction/dart/add_missing_required_argument.dart
index 84d563c..2d5231c 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/add_missing_required_argument.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/add_missing_required_argument.dart
@@ -17,6 +17,14 @@
   String _missingParameterName = '';
 
   @override
+  // Not a stand-alone fix; requires follow-up actions.
+  bool get canBeAppliedInBulk => false;
+
+  @override
+  // Not a stand-alone fix; requires follow-up actions.
+  bool get canBeAppliedToFile => false;
+
+  @override
   List<Object> get fixArguments => [_missingParameterName];
 
   @override
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/add_return_type.dart b/pkg/analysis_server/lib/src/services/correction/dart/add_return_type.dart
index b5aed2b..a66c22c 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/add_return_type.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/add_return_type.dart
@@ -158,11 +158,7 @@
     if (current == null) {
       returnType = type;
     } else {
-      if (current is InterfaceType && type is InterfaceType) {
-        returnType = InterfaceType.getSmartLeastUpperBound(current, type);
-      } else {
-        returnType = typeSystem.leastUpperBound(current, type);
-      }
+      returnType = typeSystem.leastUpperBound(current, type);
     }
   }
 }
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/add_trailing_comma.dart b/pkg/analysis_server/lib/src/services/correction/dart/add_trailing_comma.dart
index c66a0a1..0995f2f 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/add_trailing_comma.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/add_trailing_comma.dart
@@ -25,8 +25,6 @@
   Future<void> compute(ChangeBuilder builder) async {
     final node = this.node;
     if (node is! ArgumentList) return;
-    final parent = node.parent;
-    if (parent == null) return;
 
     await builder.addDartFileEdit(file, (builder) {
       builder.addSimpleInsertion(node.arguments.last.end, ',');
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/add_type_annotation.dart b/pkg/analysis_server/lib/src/services/correction/dart/add_type_annotation.dart
index f0e0091..9bb8c12 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/add_type_annotation.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/add_type_annotation.dart
@@ -19,6 +19,16 @@
 
 class AddTypeAnnotation extends CorrectionProducer {
   @override
+  bool canBeAppliedInBulk;
+
+  @override
+  bool canBeAppliedToFile;
+
+  AddTypeAnnotation(bool multi)
+      : canBeAppliedInBulk = multi,
+        canBeAppliedToFile = multi;
+
+  @override
   AssistKind get assistKind => DartAssistKind.ADD_TYPE_ANNOTATION;
 
   @override
@@ -180,7 +190,11 @@
   }
 
   /// Return an instance of this class. Used as a tear-off in `FixProcessor`.
-  static AddTypeAnnotation newInstance() => AddTypeAnnotation();
+  static AddTypeAnnotation newInstance() => AddTypeAnnotation(false);
+
+  /// Return an instance of this class that can apply bulk and in-file fixes.
+  /// Used as a tear-off in `FixProcessor`.
+  static AddTypeAnnotation newInstanceBulkFixable() => AddTypeAnnotation(true);
 }
 
 class _AssignedTypeCollector extends RecursiveAstVisitor<void> {
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/convert_into_block_body.dart b/pkg/analysis_server/lib/src/services/correction/dart/convert_into_block_body.dart
index dbbea0b..6f97951 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/convert_into_block_body.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/convert_into_block_body.dart
@@ -6,11 +6,11 @@
 import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/element/element.dart';
-import 'package:analyzer/source/source_range.dart';
 import 'package:analyzer/src/dart/ast/extensions.dart';
 import 'package:analyzer_plugin/utilities/assist/assist.dart';
 import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
 import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:analyzer_plugin/utilities/range_factory.dart';
 
 import '../fix.dart';
 
@@ -38,11 +38,10 @@
     // prepare prefix
     var prefix = utils.getNodePrefix(body.parent!);
     var indent = utils.getIndent(1);
-    var start = body.beginToken.previous!.end;
-    var length = body.end - start;
+    var sourceRange = range.endEnd(body.beginToken.previous!, body);
 
     await builder.addDartFileEdit(file, (builder) {
-      builder.addReplacement(SourceRange(start, length), (builder) {
+      builder.addReplacement(sourceRange, (builder) {
         builder.write(' ');
         if (body.isAsynchronous) {
           builder.write('async ');
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/convert_quotes.dart b/pkg/analysis_server/lib/src/services/correction/dart/convert_quotes.dart
index 7bcfe13..7f643b6 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/convert_quotes.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/convert_quotes.dart
@@ -67,6 +67,18 @@
   AssistKind get assistKind => DartAssistKind.CONVERT_TO_DOUBLE_QUOTED_STRING;
 
   @override
+  bool get canBeAppliedInBulk => true;
+
+  @override
+  bool get canBeAppliedToFile => true;
+
+  @override
+  FixKind get fixKind => DartFixKind.CONVERT_TO_DOUBLE_QUOTED_STRING;
+
+  @override
+  FixKind get multiFixKind => DartFixKind.CONVERT_TO_DOUBLE_QUOTED_STRING_MULTI;
+
+  @override
   bool get _fromDouble => false;
 
   /// Return an instance of this class. Used as a tear-off in `FixProcessor`.
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/remove_annotation.dart b/pkg/analysis_server/lib/src/services/correction/dart/remove_annotation.dart
index 17594f4..2c03724 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/remove_annotation.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/remove_annotation.dart
@@ -15,6 +15,14 @@
   String _annotationName = '';
 
   @override
+  // Not predictably the correct action.
+  bool get canBeAppliedInBulk => false;
+
+  @override
+  // Not predictably the correct action.
+  bool get canBeAppliedToFile => false;
+
+  @override
   List<Object> get fixArguments => [_annotationName];
 
   @override
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/remove_dead_code.dart b/pkg/analysis_server/lib/src/services/correction/dart/remove_dead_code.dart
index 9f349e7..7f70107 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/remove_dead_code.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/remove_dead_code.dart
@@ -12,6 +12,14 @@
 
 class RemoveDeadCode extends CorrectionProducer {
   @override
+  // Not predictably the correct action.
+  bool get canBeAppliedInBulk => false;
+
+  @override
+  // Not predictably the correct action.
+  bool get canBeAppliedToFile => false;
+
+  @override
   FixKind get fixKind => DartFixKind.REMOVE_DEAD_CODE;
 
   @override
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/remove_name_from_combinator.dart b/pkg/analysis_server/lib/src/services/correction/dart/remove_name_from_combinator.dart
index b6da5d0..889378a 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/remove_name_from_combinator.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/remove_name_from_combinator.dart
@@ -14,6 +14,14 @@
   String _combinatorKind = '';
 
   @override
+  // Not predictably the correct action.
+  bool get canBeAppliedInBulk => false;
+
+  @override
+  // Not predictably the correct action.
+  bool get canBeAppliedToFile => false;
+
+  @override
   List<Object> get fixArguments => [_combinatorKind];
 
   @override
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/remove_unused.dart b/pkg/analysis_server/lib/src/services/correction/dart/remove_unused.dart
index adc0a5e..25d4016 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/remove_unused.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/remove_unused.dart
@@ -16,6 +16,14 @@
 
 class RemoveUnusedElement extends _RemoveUnused {
   @override
+  // Not predictably the correct action.
+  bool get canBeAppliedInBulk => false;
+
+  @override
+  // Not predictably the correct action.
+  bool get canBeAppliedToFile => false;
+
+  @override
   FixKind get fixKind => DartFixKind.REMOVE_UNUSED_ELEMENT;
 
   @override
@@ -70,6 +78,14 @@
 
 class RemoveUnusedField extends _RemoveUnused {
   @override
+  // Not predictably the correct action.
+  bool get canBeAppliedInBulk => false;
+
+  @override
+  // Not predictably the correct action.
+  bool get canBeAppliedToFile => false;
+
+  @override
   FixKind get fixKind => DartFixKind.REMOVE_UNUSED_FIELD;
 
   @override
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/remove_unused_import.dart b/pkg/analysis_server/lib/src/services/correction/dart/remove_unused_import.dart
index 655a778..02fb02d 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/remove_unused_import.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/remove_unused_import.dart
@@ -11,6 +11,7 @@
 
 class RemoveUnusedImport extends CorrectionProducer {
   @override
+  // Bulk application is supported by a distinct import cleanup fix phase.
   bool get canBeAppliedInBulk => false;
 
   @override
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/remove_unused_label.dart b/pkg/analysis_server/lib/src/services/correction/dart/remove_unused_label.dart
index 8f182e9..b06462f 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/remove_unused_label.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/remove_unused_label.dart
@@ -11,6 +11,14 @@
 
 class RemoveUnusedLabel extends CorrectionProducer {
   @override
+  // Not predictably the correct action.
+  bool get canBeAppliedInBulk => false;
+
+  @override
+  // Not predictably the correct action.
+  bool get canBeAppliedToFile => false;
+
+  @override
   FixKind get fixKind => DartFixKind.REMOVE_UNUSED_LABEL;
 
   @override
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/remove_unused_local_variable.dart b/pkg/analysis_server/lib/src/services/correction/dart/remove_unused_local_variable.dart
index f64a7a1..bfc7681 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/remove_unused_local_variable.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/remove_unused_local_variable.dart
@@ -14,6 +14,14 @@
 
 class RemoveUnusedLocalVariable extends CorrectionProducer {
   @override
+  // Not predictably the correct action.
+  bool get canBeAppliedInBulk => false;
+
+  @override
+  // Not predictably the correct action.
+  bool get canBeAppliedToFile => false;
+
+  @override
   FixKind get fixKind => DartFixKind.REMOVE_UNUSED_LOCAL_VARIABLE;
 
   @override
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/replace_with_null_aware.dart b/pkg/analysis_server/lib/src/services/correction/dart/replace_with_null_aware.dart
index 822442d..d990668 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/replace_with_null_aware.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/replace_with_null_aware.dart
@@ -16,6 +16,18 @@
   ReplaceWithNullAware(this.correctionKind);
 
   @override
+  // NNBD makes this obsolete in the "chain" application; for the "single"
+  // application, there are other options and a null-aware replacement is not
+  // predictably correct.
+  bool get canBeAppliedInBulk => false;
+
+  @override
+  // NNBD makes this obsolete in the "chain" application; for the "single"
+  // application, there are other options and a null-aware replacement is not
+  // predictably correct.
+  bool get canBeAppliedToFile => false;
+
+  @override
   FixKind get fixKind => DartFixKind.REPLACE_WITH_NULL_AWARE;
 
   @override
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/update_sdk_constraints.dart b/pkg/analysis_server/lib/src/services/correction/dart/update_sdk_constraints.dart
index 2ade5a5..c12a2e2 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/update_sdk_constraints.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/update_sdk_constraints.dart
@@ -19,6 +19,14 @@
   UpdateSdkConstraints(this._minimumVersion);
 
   @override
+  // Too nuanced to do unattended.
+  bool get canBeAppliedInBulk => false;
+
+  @override
+  // Not applicable (there can only be one constraint per file).
+  bool get canBeAppliedToFile => false;
+
+  @override
   FixKind get fixKind => DartFixKind.UPDATE_SDK_CONSTRAINTS;
 
   @override
diff --git a/pkg/analysis_server/lib/src/services/correction/fix.dart b/pkg/analysis_server/lib/src/services/correction/fix.dart
index c9ec3cf..7dd6fff 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix.dart
@@ -344,6 +344,16 @@
     DartFixKindPriority.IN_FILE,
     "Convert to using 'contains' everywhere in file",
   );
+  static const CONVERT_TO_DOUBLE_QUOTED_STRING = FixKind(
+    'dart.fix.convert.toDoubleQuotedString',
+    DartFixKindPriority.DEFAULT,
+    'Convert to double quoted string',
+  );
+  static const CONVERT_TO_DOUBLE_QUOTED_STRING_MULTI = FixKind(
+    'dart.fix.convert.toDoubleQuotedString.multi',
+    DartFixKindPriority.IN_FILE,
+    'Convert to double quoted strings everywhere in file',
+  );
   static const CONVERT_TO_FOR_ELEMENT = FixKind(
     'dart.fix.convert.toForElement',
     DartFixKindPriority.DEFAULT,
diff --git a/pkg/analysis_server/lib/src/services/correction/fix_internal.dart b/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
index 89bc91f..3b5ed58 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
@@ -334,8 +334,7 @@
       AddRequired.newInstance,
     ],
     LintNames.always_specify_types: [
-      // TODO(brianwilkerson) Consider applying in bulk.
-      AddTypeAnnotation.newInstance,
+      AddTypeAnnotation.newInstanceBulkFixable,
     ],
     LintNames.annotate_overrides: [
       AddOverride.newInstance,
@@ -470,6 +469,9 @@
     LintNames.prefer_contains: [
       ConvertToContains.newInstance,
     ],
+    LintNames.prefer_double_quotes: [
+      ConvertToDoubleQuotes.newInstance,
+    ],
     LintNames.prefer_equal_for_default_values: [
       ReplaceColonWithEquals.newInstance,
     ],
@@ -540,7 +542,7 @@
       ConvertAddAllToSpread.newInstance,
     ],
     LintNames.prefer_typing_uninitialized_variables: [
-      AddTypeAnnotation.newInstance,
+      AddTypeAnnotation.newInstanceBulkFixable,
     ],
     LintNames.prefer_void_to_null: [
       ReplaceNullWithVoid.newInstance,
@@ -558,8 +560,7 @@
       AddTrailingComma.newInstance,
     ],
     LintNames.type_annotate_public_apis: [
-      // TODO(brianwilkerson) Consider applying in bulk.
-      AddTypeAnnotation.newInstance,
+      AddTypeAnnotation.newInstanceBulkFixable,
     ],
     LintNames.type_init_formals: [
       RemoveTypeAnnotation.newInstance,
diff --git a/pkg/analysis_server/lib/src/services/linter/lint_names.dart b/pkg/analysis_server/lib/src/services/linter/lint_names.dart
index b43b980..52aee05 100644
--- a/pkg/analysis_server/lib/src/services/linter/lint_names.dart
+++ b/pkg/analysis_server/lib/src/services/linter/lint_names.dart
@@ -71,6 +71,7 @@
   static const String prefer_const_literals_to_create_immutables =
       'prefer_const_literals_to_create_immutables';
   static const String prefer_contains = 'prefer_contains';
+  static const String prefer_double_quotes = 'prefer_double_quotes';
   static const String prefer_equal_for_default_values =
       'prefer_equal_for_default_values';
   static const String prefer_expression_function_bodies =
diff --git a/pkg/analysis_server/lib/src/services/refactoring/extract_method.dart b/pkg/analysis_server/lib/src/services/refactoring/extract_method.dart
index 4b470bf..163572e 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/extract_method.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/extract_method.dart
@@ -1327,11 +1327,7 @@
     if (returnType == null) {
       return type;
     } else {
-      if (returnType is InterfaceType && type is InterfaceType) {
-        return InterfaceType.getSmartLeastUpperBound(returnType, type);
-      } else {
-        return typeSystem.leastUpperBound(returnType, type);
-      }
+      return typeSystem.leastUpperBound(returnType, type);
     }
   }
 }
diff --git a/pkg/analysis_server/lib/src/utilities/extensions/completion_request.dart b/pkg/analysis_server/lib/src/utilities/extensions/completion_request.dart
new file mode 100644
index 0000000..f0af690
--- /dev/null
+++ b/pkg/analysis_server/lib/src/utilities/extensions/completion_request.dart
@@ -0,0 +1,41 @@
+// Copyright (c) 2021, 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:analysis_server/src/provisional/completion/dart/completion_dart.dart';
+import 'package:analyzer/dart/analysis/features.dart';
+import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/dart/element/nullability_suffix.dart';
+import 'package:analyzer/dart/element/type.dart';
+
+extension DartCompletionRequestExtensions on DartCompletionRequest {
+  /// Return `true` if the constructor tear-offs feature is enabled, and the
+  /// context type is a function type that matches an instantiation of the
+  /// [element].
+  ///
+  /// TODO(scheglov) Validate that suggesting a tear-off instead of invocation
+  /// is statistically a good choice.
+  bool shouldSuggestTearOff(ClassElement element) {
+    if (!libraryElement.featureSet.isEnabled(Feature.constructor_tearoffs)) {
+      return false;
+    }
+
+    final contextType = this.contextType;
+    if (contextType is! FunctionType) {
+      return false;
+    }
+
+    var bottomInstance = element.instantiate(
+      typeArguments: List.filled(
+        element.typeParameters.length,
+        libraryElement.typeProvider.neverType,
+      ),
+      nullabilitySuffix: NullabilitySuffix.none,
+    );
+
+    return libraryElement.typeSystem.isSubtypeOf(
+      bottomInstance,
+      contextType.returnType,
+    );
+  }
+}
diff --git a/pkg/analysis_server/test/abstract_context.dart b/pkg/analysis_server/test/abstract_context.dart
index 4c466d1..d727774 100644
--- a/pkg/analysis_server/test/abstract_context.dart
+++ b/pkg/analysis_server/test/abstract_context.dart
@@ -69,6 +69,8 @@
       '${ExperimentStatus.currentVersion.major}.'
       '${ExperimentStatus.currentVersion.minor}';
 
+  Folder get sdkRoot => newFolder('/sdk');
+
   AnalysisSession get session => contextFor('/home/test').currentSession;
 
   String? get testPackageLanguageVersion => latestLanguageVersion;
@@ -184,8 +186,9 @@
 
     setupResourceProvider();
 
-    MockSdk(
+    createMockSdk(
       resourceProvider: resourceProvider,
+      root: sdkRoot,
     );
 
     writeTestPackageConfig();
@@ -292,7 +295,7 @@
       enableIndex: true,
       includedPaths: collectionIncludedPaths.map(convertPath).toList(),
       resourceProvider: resourceProvider,
-      sdkPath: convertPath(sdkRoot),
+      sdkPath: sdkRoot.path,
     );
 
     _addAnalyzedFilesToDrivers();
diff --git a/pkg/analysis_server/test/analysis_abstract.dart b/pkg/analysis_server/test/analysis_abstract.dart
index 8a7d311..809d27a 100644
--- a/pkg/analysis_server/test/analysis_abstract.dart
+++ b/pkg/analysis_server/test/analysis_abstract.dart
@@ -93,7 +93,12 @@
     //
     // Create an SDK in the mock file system.
     //
-    MockSdk(resourceProvider: resourceProvider);
+    var sdkRoot = newFolder('/sdk');
+    createMockSdk(
+      resourceProvider: resourceProvider,
+      root: sdkRoot,
+    );
+
     //
     // Create server
     //
@@ -102,7 +107,7 @@
         serverChannel,
         resourceProvider,
         options,
-        DartSdkManager(resourceProvider.convertPath('/sdk')),
+        DartSdkManager(sdkRoot.path),
         CrashReportingAttachmentsBuilder.empty,
         InstrumentationService.NULL_SERVICE);
   }
diff --git a/pkg/analysis_server/test/analysis_server_test.dart b/pkg/analysis_server/test/analysis_server_test.dart
index ca5385e..4b41a22 100644
--- a/pkg/analysis_server/test/analysis_server_test.dart
+++ b/pkg/analysis_server/test/analysis_server_test.dart
@@ -76,13 +76,19 @@
 
   void setUp() {
     channel = MockServerChannel();
+
     // Create an SDK in the mock file system.
-    MockSdk(resourceProvider: resourceProvider);
+    var sdkRoot = newFolder('/sdk');
+    createMockSdk(
+      resourceProvider: resourceProvider,
+      root: sdkRoot,
+    );
+
     server = AnalysisServer(
         channel,
         resourceProvider,
         AnalysisServerOptions(),
-        DartSdkManager(convertPath('/sdk')),
+        DartSdkManager(sdkRoot.path),
         CrashReportingAttachmentsBuilder.empty,
         InstrumentationService.NULL_SERVICE);
   }
diff --git a/pkg/analysis_server/test/client/completion_driver_test.dart b/pkg/analysis_server/test/client/completion_driver_test.dart
index 3f888c5..c705575 100644
--- a/pkg/analysis_server/test/client/completion_driver_test.dart
+++ b/pkg/analysis_server/test/client/completion_driver_test.dart
@@ -104,18 +104,8 @@
 
   Future<List<CompletionSuggestion>> getSuggestions() async {
     if (supportsAvailableSuggestions) {
-      // todo (pq): consider moving
-      const internalLibs = [
-        'dart:async2',
-        'dart:_interceptors',
-        'dart:_internal',
-      ];
-      for (var lib in driver.sdk.sdkLibraries) {
-        var uri = lib.shortName;
-        if (!internalLibs.contains(uri)) {
-          await driver.waitForSetWithUri(uri);
-        }
-      }
+      await driver.waitForSetWithUri('dart:core');
+      await driver.waitForSetWithUri('dart:async');
     }
 
     suggestions = await driver.getSuggestions();
diff --git a/pkg/analysis_server/test/client/impl/abstract_client.dart b/pkg/analysis_server/test/client/impl/abstract_client.dart
index d067b8d..51bd14d 100644
--- a/pkg/analysis_server/test/client/impl/abstract_client.dart
+++ b/pkg/analysis_server/test/client/impl/abstract_client.dart
@@ -35,8 +35,6 @@
   final String testFilePath;
   late String testCode;
 
-  late MockSdk sdk;
-
   final AnalysisServerOptions serverOptions;
 
   AbstractClient({
@@ -106,7 +104,10 @@
 
   /// Create an analysis server with the given [sdkPath].
   AnalysisServer createAnalysisServer(String sdkPath) {
-    sdk = MockSdk(resourceProvider: resourceProvider);
+    createMockSdk(
+      resourceProvider: resourceProvider,
+      root: newFolder(sdkPath),
+    );
     return AnalysisServer(
         serverChannel,
         resourceProvider,
diff --git a/pkg/analysis_server/test/domain_analysis_test.dart b/pkg/analysis_server/test/domain_analysis_test.dart
index 0eee133..8ea43c3 100644
--- a/pkg/analysis_server/test/domain_analysis_test.dart
+++ b/pkg/analysis_server/test/domain_analysis_test.dart
@@ -1437,13 +1437,19 @@
     projectPath = convertPath('/project');
     testFile = convertPath('/project/bin/test.dart');
     serverChannel = MockServerChannel();
+
     // Create an SDK in the mock file system.
-    MockSdk(resourceProvider: resourceProvider);
+    var sdkRoot = newFolder('/sdk');
+    createMockSdk(
+      resourceProvider: resourceProvider,
+      root: sdkRoot,
+    );
+
     server = AnalysisServer(
         serverChannel,
         resourceProvider,
         AnalysisServerOptions(),
-        DartSdkManager(convertPath('/sdk')),
+        DartSdkManager(sdkRoot.path),
         CrashReportingAttachmentsBuilder.empty,
         InstrumentationService.NULL_SERVICE);
     handler = AnalysisDomainHandler(server);
diff --git a/pkg/analysis_server/test/lsp/server_abstract.dart b/pkg/analysis_server/test/lsp/server_abstract.dart
index 26cd616..6b8ba52 100644
--- a/pkg/analysis_server/test/lsp/server_abstract.dart
+++ b/pkg/analysis_server/test/lsp/server_abstract.dart
@@ -183,14 +183,20 @@
     httpClient = MockHttpClient();
     processRunner = MockProcessRunner();
     channel = MockLspServerChannel(debugPrintCommunication);
+
     // Create an SDK in the mock file system.
-    MockSdk(resourceProvider: resourceProvider);
+    var sdkRoot = newFolder('/sdk');
+    createMockSdk(
+      resourceProvider: resourceProvider,
+      root: sdkRoot,
+    );
+
     pluginManager = TestPluginManager();
     server = LspAnalysisServer(
         channel,
         resourceProvider,
         serverOptions,
-        DartSdkManager(convertPath('/sdk')),
+        DartSdkManager(sdkRoot.path),
         CrashReportingAttachmentsBuilder.empty,
         InstrumentationService.NULL_SERVICE,
         httpClient: httpClient,
diff --git a/pkg/analysis_server/test/services/completion/dart/named_constructor_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/named_constructor_contributor_test.dart
index 2c3ed18..87db577 100644
--- a/pkg/analysis_server/test/services/completion/dart/named_constructor_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/named_constructor_contributor_test.dart
@@ -19,15 +19,26 @@
 
 @reflectiveTest
 class NamedConstructorContributorTest extends DartCompletionContributorTest {
-  CompletionSuggestion assertSuggestNamedConstructor(
-    String completion,
-    String returnType, {
+  CompletionSuggestion assertConstructorReference({
     required String elementName,
+    required String name,
+    required String returnType,
   }) {
-    var cs = assertSuggest(
-      completion,
-      csKind: CompletionSuggestionKind.INVOCATION,
+    return assertSuggestNamedConstructor(
+      elementName: elementName,
+      kind: CompletionSuggestionKind.IDENTIFIER,
+      name: name,
+      returnType: returnType,
     );
+  }
+
+  CompletionSuggestion assertSuggestNamedConstructor({
+    required String elementName,
+    CompletionSuggestionKind kind = CompletionSuggestionKind.INVOCATION,
+    required String name,
+    required String returnType,
+  }) {
+    var cs = assertSuggest(name, csKind: kind);
     var element = cs.element!;
     expect(element.kind, equals(ElementKind.CONSTRUCTOR));
     expect(element.name, equals(elementName));
@@ -47,6 +58,236 @@
     return NamedConstructorContributor(request, builder);
   }
 
+  Future<void>
+      test_className_period_identifier_functionTypeContext_matchingReturnType() async {
+    addTestSource('''
+class A {
+  A();
+  A.named();
+}
+
+void f() {
+  A Function() v = A.na^;
+}
+''');
+    await computeSuggestions();
+
+    expect(replacementOffset, completionOffset - 2);
+    expect(replacementLength, 2);
+    assertConstructorReference(
+      elementName: 'A',
+      name: 'new',
+      returnType: 'A',
+    );
+    assertConstructorReference(
+      elementName: 'A.named',
+      name: 'named',
+      returnType: 'A',
+    );
+  }
+
+  Future<void> test_className_period_identifier_interfaceTypeContext() async {
+    addTestSource('''
+class A {
+  A();
+  A.named();
+}
+
+void f() {
+  int v = A.na^;
+}
+''');
+    await computeSuggestions();
+
+    expect(replacementOffset, completionOffset - 2);
+    expect(replacementLength, 2);
+    assertSuggestNamedConstructor(
+      elementName: 'A.named',
+      name: 'named',
+      returnType: 'A',
+    );
+  }
+
+  Future<void>
+      test_className_period_nothing_functionTypeContext_matchingReturnType() async {
+    addTestSource('''
+class A {
+  A();
+  A.named();
+}
+
+void f() {
+  A Function() v = A.^;
+}
+''');
+    await computeSuggestions();
+
+    expect(replacementOffset, completionOffset);
+    expect(replacementLength, 0);
+    assertConstructorReference(
+      elementName: 'A',
+      name: 'new',
+      returnType: 'A',
+    );
+    assertConstructorReference(
+      elementName: 'A.named',
+      name: 'named',
+      returnType: 'A',
+    );
+  }
+
+  Future<void> test_className_period_nothing_interfaceTypeContext() async {
+    addTestSource('''
+class A {
+  A();
+  A.named();
+}
+
+void f() {
+  int v = A.^;
+}
+''');
+    await computeSuggestions();
+
+    expect(replacementOffset, completionOffset);
+    expect(replacementLength, 0);
+    assertSuggestNamedConstructor(
+      elementName: 'A.named',
+      name: 'named',
+      returnType: 'A',
+    );
+  }
+
+  Future<void>
+      test_className_typeArguments_period_identifier_functionTypeContext_matchingReturnType() async {
+    addTestSource('''
+class A<T> {
+  A.named();
+  A.new();
+}
+
+void f() {
+  A<int> Function() v = A<int>.na^;
+}
+''');
+    await computeSuggestions();
+
+    expect(replacementOffset, completionOffset - 2);
+    expect(replacementLength, 2);
+    assertConstructorReference(
+      elementName: 'A',
+      name: 'new',
+      returnType: 'A<T>',
+    );
+    assertConstructorReference(
+      elementName: 'A.named',
+      name: 'named',
+      returnType: 'A<T>',
+    );
+  }
+
+  Future<void>
+      test_className_typeArguments_period_nothing_functionTypeContext_matchingReturnType() async {
+    addTestSource('''
+class A<T> {
+  A.named();
+  A.new();
+}
+
+void f() {
+  A<int> Function() v = A<int>.^;
+}
+''');
+    await computeSuggestions();
+
+    expect(replacementOffset, completionOffset);
+    expect(replacementLength, 0);
+    assertConstructorReference(
+      elementName: 'A',
+      name: 'new',
+      returnType: 'A<T>',
+    );
+    assertConstructorReference(
+      elementName: 'A.named',
+      name: 'named',
+      returnType: 'A<T>',
+    );
+  }
+
+  Future<void>
+      test_className_typeArguments_period_nothing_functionTypeContext_matchingReturnType2() async {
+    addTestSource('''
+class A {}
+
+class B<T> extends A {
+  B.named();
+  B.new();
+}
+
+void f() {
+  A Function() v = B<int>.^;
+}
+''');
+    await computeSuggestions();
+
+    expect(replacementOffset, completionOffset);
+    expect(replacementLength, 0);
+    assertConstructorReference(
+      elementName: 'B',
+      name: 'new',
+      returnType: 'B<T>',
+    );
+    assertConstructorReference(
+      elementName: 'B.named',
+      name: 'named',
+      returnType: 'B<T>',
+    );
+  }
+
+  Future<void>
+      test_className_typeArguments_period_nothing_functionTypeContext_notMatchingReturnType() async {
+    addTestSource('''
+class A<T> {
+  A.named();
+}
+
+void f() {
+  List<int> Function() v = A<int>.^;
+}
+''');
+    await computeSuggestions();
+
+    expect(replacementOffset, completionOffset);
+    expect(replacementLength, 0);
+    assertSuggestNamedConstructor(
+      elementName: 'A.named',
+      name: 'named',
+      returnType: 'A<T>',
+    );
+  }
+
+  Future<void>
+      test_className_typeArguments_period_nothing_interfaceContextType() async {
+    addTestSource('''
+class A<T> {
+  A.named();
+}
+
+void f() {
+  A<int> v = A<int>.^;
+}
+''');
+    await computeSuggestions();
+
+    expect(replacementOffset, completionOffset);
+    expect(replacementLength, 0);
+    assertSuggestNamedConstructor(
+      elementName: 'A.named',
+      name: 'named',
+      returnType: 'A<T>',
+    );
+  }
+
   Future<void> test_ConstructorName_importedClass() async {
     // SimpleIdentifier  PrefixedIdentifier  TypeName  ConstructorName
     // InstanceCreationExpression
@@ -63,7 +304,11 @@
     await computeSuggestions();
     expect(replacementOffset, completionOffset);
     expect(replacementLength, 0);
-    assertSuggestNamedConstructor('c', 'X', elementName: 'X.c');
+    assertSuggestNamedConstructor(
+      elementName: 'X.c',
+      name: 'c',
+      returnType: 'X',
+    );
     assertNotSuggested('F1');
     assertNotSuggested('T1');
     assertNotSuggested('_d');
@@ -88,7 +333,11 @@
     await computeSuggestions();
     expect(replacementOffset, completionOffset);
     expect(replacementLength, 0);
-    assertSuggestNamedConstructor('c', 'X', elementName: 'X.c');
+    assertSuggestNamedConstructor(
+      elementName: 'X.c',
+      name: 'c',
+      returnType: 'X',
+    );
     assertNotSuggested('F1');
     assertNotSuggested('T1');
     assertNotSuggested('_d');
@@ -112,7 +361,11 @@
     await computeSuggestions();
     expect(replacementOffset, completionOffset);
     expect(replacementLength, 0);
-    assertSuggestNamedConstructor('c', 'X', elementName: 'X.c');
+    assertSuggestNamedConstructor(
+      elementName: 'X.c',
+      name: 'c',
+      returnType: 'X',
+    );
     assertNotSuggested('F1');
     assertNotSuggested('T1');
     assertNotSuggested('_d');
@@ -129,9 +382,9 @@
     expect(replacementOffset, completionOffset - 2);
     expect(replacementLength, 13);
     assertSuggestNamedConstructor(
-      'fromCharCodes',
-      'String',
       elementName: 'String.fromCharCodes',
+      name: 'fromCharCodes',
+      returnType: 'String',
     );
     assertNotSuggested('isEmpty');
     assertNotSuggested('isNotEmpty');
@@ -151,8 +404,16 @@
     await computeSuggestions();
     expect(replacementOffset, completionOffset);
     expect(replacementLength, 0);
-    assertSuggestNamedConstructor('c', 'X', elementName: 'X.c');
-    assertSuggestNamedConstructor('_d', 'X', elementName: 'X._d');
+    assertSuggestNamedConstructor(
+      elementName: 'X.c',
+      name: 'c',
+      returnType: 'X',
+    );
+    assertSuggestNamedConstructor(
+      elementName: 'X._d',
+      name: '_d',
+      returnType: 'X',
+    );
     assertNotSuggested('F1');
     assertNotSuggested('T1');
     assertNotSuggested('z');
@@ -170,11 +431,50 @@
     await computeSuggestions();
     expect(replacementOffset, completionOffset);
     expect(replacementLength, 0);
-    assertSuggestNamedConstructor('c', 'X', elementName: 'X.c');
-    assertSuggestNamedConstructor('_d', 'X', elementName: 'X._d');
+    assertSuggestNamedConstructor(
+      elementName: 'X.c',
+      name: 'c',
+      returnType: 'X',
+    );
+    assertSuggestNamedConstructor(
+      elementName: 'X._d',
+      name: '_d',
+      returnType: 'X',
+    );
     assertNotSuggested('F1');
     assertNotSuggested('T1');
     assertNotSuggested('z');
     assertNotSuggested('m');
   }
+
+  Future<void>
+      test_importPrefix_className_typeArguments_period_nothing_functionTypeContext_matchingReturnType() async {
+    addSource('/home/test/lib/a.dart', '''
+class A<T> {
+  A.named();
+  A.new();
+}
+''');
+    addTestSource('''
+import 'a.dart' as prefix;
+
+void f() {
+  A<int> Function() v = prefix.A<int>.^;
+}
+''');
+    await computeSuggestions();
+
+    expect(replacementOffset, completionOffset);
+    expect(replacementLength, 0);
+    assertConstructorReference(
+      elementName: 'A',
+      name: 'new',
+      returnType: 'A<T>',
+    );
+    assertConstructorReference(
+      elementName: 'A.named',
+      name: 'named',
+      returnType: 'A<T>',
+    );
+  }
 }
diff --git a/pkg/analysis_server/test/services/completion/dart/static_member_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/static_member_contributor_test.dart
index 1c6e558..919e175 100644
--- a/pkg/analysis_server/test/services/completion/dart/static_member_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/static_member_contributor_test.dart
@@ -178,6 +178,48 @@
     assertSuggestConstructor('bar', elementName: 'A.bar');
   }
 
+  Future<void>
+      test_implicitCreation_functionContextType_matchingReturnType() async {
+    addSource('/home/test/lib/a.dart', '''
+class A {
+  A.foo();
+  A.bar();
+}
+''');
+    addTestSource('''
+import 'a.dart';
+
+main() {
+  A Function() v = A.^;
+}
+''');
+    await computeSuggestions();
+
+    assertNotSuggested('foo');
+    assertNotSuggested('bar');
+  }
+
+  Future<void>
+      test_implicitCreation_functionContextType_notMatchingReturnType() async {
+    addSource('/home/test/lib/a.dart', '''
+class A {
+  A.foo();
+  A.bar();
+}
+''');
+    addTestSource('''
+import 'a.dart';
+
+main() {
+  int Function() v = A.^;
+}
+''');
+    await computeSuggestions();
+
+    assertSuggestConstructor('foo', elementName: 'A.foo');
+    assertSuggestConstructor('bar', elementName: 'A.bar');
+  }
+
   Future<void> test_keyword() async {
     addTestSource('class C { static C get instance => null; } main() {C.in^}');
     await computeSuggestions();
diff --git a/pkg/analysis_server/test/services/refactoring/extract_method_test.dart b/pkg/analysis_server/test/services/refactoring/extract_method_test.dart
index 6e99c97..527b60f 100644
--- a/pkg/analysis_server/test/services/refactoring/extract_method_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/extract_method_test.dart
@@ -2806,7 +2806,7 @@
 // end
 }
 
-List<dynamic> res(bool b) {
+List<Object> res(bool b) {
   if (b) {
     print(true);
     return <int>[];
diff --git a/pkg/analysis_server/test/src/cider/cider_service.dart b/pkg/analysis_server/test/src/cider/cider_service.dart
index b4d2492..32aafc2 100644
--- a/pkg/analysis_server/test/src/cider/cider_service.dart
+++ b/pkg/analysis_server/test/src/cider/cider_service.dart
@@ -6,6 +6,7 @@
 
 import 'package:analyzer/src/dart/analysis/performance_logger.dart';
 import 'package:analyzer/src/dart/micro/resolve_file.dart';
+import 'package:analyzer/src/dart/sdk/sdk.dart';
 import 'package:analyzer/src/test_utilities/mock_sdk.dart';
 import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
 import 'package:analyzer/src/workspace/bazel.dart';
@@ -15,7 +16,6 @@
 class CiderServiceTest with ResourceProviderMixin {
   final StringBuffer logBuffer = StringBuffer();
   late PerformanceLog logger;
-  late MockSdk sdk;
 
   late FileResolver fileResolver;
 
@@ -23,6 +23,13 @@
 
   /// Create a new [FileResolver] into [fileResolver].
   void createFileResolver() {
+    var sdkRoot = newFolder('/sdk');
+    createMockSdk(
+      resourceProvider: resourceProvider,
+      root: sdkRoot,
+    );
+    var sdk = FolderBasedDartSdk(resourceProvider, sdkRoot);
+
     var workspace = BazelWorkspace.find(
       resourceProvider,
       convertPath(testPath),
@@ -43,7 +50,6 @@
     registerLintRules();
 
     logger = PerformanceLog(logBuffer);
-    sdk = MockSdk(resourceProvider: resourceProvider);
 
     newFile('/workspace/WORKSPACE');
     newFile('/workspace/dart/test/BUILD');
diff --git a/pkg/analysis_server/test/src/g3/fixes_test.dart b/pkg/analysis_server/test/src/g3/fixes_test.dart
index 7aab591..34bdfbf 100644
--- a/pkg/analysis_server/test/src/g3/fixes_test.dart
+++ b/pkg/analysis_server/test/src/g3/fixes_test.dart
@@ -4,6 +4,7 @@
 
 import 'package:analysis_server/src/g3/fixes.dart';
 import 'package:analysis_server/src/services/linter/lint_names.dart';
+import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/src/test_utilities/mock_sdk.dart';
 import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
 import 'package:linter/src/rules.dart';
@@ -18,9 +19,14 @@
 
 @reflectiveTest
 class G3FixesTest with ResourceProviderMixin {
+  Folder get sdkRoot => newFolder('/sdk');
+
   void setUp() {
     registerLintRules();
-    MockSdk(resourceProvider: resourceProvider);
+    createMockSdk(
+      resourceProvider: resourceProvider,
+      root: sdkRoot,
+    );
   }
 
   Future<void> test_awaitOnlyFutures() async {
@@ -126,7 +132,7 @@
 
     var tester = LintFixTester(
       resourceProvider: resourceProvider,
-      sdkPath: convertPath(sdkRoot),
+      sdkPath: sdkRoot.path,
       packageConfigPath: null,
     );
 
@@ -157,7 +163,7 @@
 
     var tester = LintFixTester(
       resourceProvider: resourceProvider,
-      sdkPath: convertPath(sdkRoot),
+      sdkPath: sdkRoot.path,
       packageConfigPath: null,
     );
 
diff --git a/pkg/analysis_server/test/src/services/correction/fix/add_type_annotation_test.dart b/pkg/analysis_server/test/src/services/correction/fix/add_type_annotation_test.dart
index edf86dc..c693fe8 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/add_type_annotation_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/add_type_annotation_test.dart
@@ -5,6 +5,7 @@
 import 'package:analysis_server/src/services/correction/fix.dart';
 import 'package:analysis_server/src/services/linter/lint_names.dart';
 import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:test/expect.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import 'fix_processor.dart';
@@ -12,8 +13,15 @@
 void main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(AddTypeAnnotationTest);
+    defineReflectiveTests(AlwaysSpecifyTypesBulkTest);
+    defineReflectiveTests(AlwaysSpecifyTypesInFileTest);
     defineReflectiveTests(AlwaysSpecifyTypesLintTest);
+    defineReflectiveTests(PreferTypingUninitializedVariablesBulkTest);
+    defineReflectiveTests(PreferTypingUninitializedVariablesInFileTest);
     defineReflectiveTests(PreferTypingUninitializedVariablesLintTest);
+    defineReflectiveTests(TypeAnnotatePublicAPIsBulkTest);
+    defineReflectiveTests(TypeAnnotatePublicAPIsInFileTest);
+    defineReflectiveTests(TypeAnnotatePublicAPIsLintTest);
   });
 }
 
@@ -52,6 +60,48 @@
 }
 
 @reflectiveTest
+class AlwaysSpecifyTypesBulkTest extends BulkFixProcessorTest {
+  @override
+  String get lintCode => LintNames.always_specify_types;
+
+  Future<void> test_bulk() async {
+    await resolveTestCode('''
+final a = 0;
+class A {
+  final b = 1;
+}
+''');
+    await assertHasFix('''
+final int a = 0;
+class A {
+  final int b = 1;
+}
+''');
+  }
+}
+
+@reflectiveTest
+class AlwaysSpecifyTypesInFileTest extends FixInFileProcessorTest {
+  Future<void> test_File() async {
+    createAnalysisOptionsFile(lints: [LintNames.always_specify_types]);
+    await resolveTestCode(r'''
+final a = 0;
+class A {
+  final b = 1;
+}
+''');
+    var fixes = await getFixesForFirstError();
+    expect(fixes, hasLength(1));
+    assertProduces(fixes.first, r'''
+final int a = 0;
+class A {
+  final int b = 1;
+}
+''');
+  }
+}
+
+@reflectiveTest
 class AlwaysSpecifyTypesLintTest extends FixProcessorLintTest {
   @override
   FixKind get kind => DartFixKind.ADD_TYPE_ANNOTATION;
@@ -76,6 +126,62 @@
 }
 
 @reflectiveTest
+class PreferTypingUninitializedVariablesBulkTest extends BulkFixProcessorTest {
+  @override
+  String get lintCode => LintNames.prefer_typing_uninitialized_variables;
+
+  Future<void> test_bulk() async {
+    await resolveTestCode('''
+void f() {
+  var a, b;
+  a = 0;
+  b = 1;
+  print(a);
+  print(b);
+}
+''');
+    await assertHasFix('''
+void f() {
+  int a, b;
+  a = 0;
+  b = 1;
+  print(a);
+  print(b);
+}
+''');
+  }
+}
+
+@reflectiveTest
+class PreferTypingUninitializedVariablesInFileTest
+    extends FixInFileProcessorTest {
+  Future<void> test_File() async {
+    createAnalysisOptionsFile(
+        lints: [LintNames.prefer_typing_uninitialized_variables]);
+    await resolveTestCode(r'''
+void f() {
+  var a, b;
+  a = 0;
+  b = 1;
+  print(a);
+  print(b);
+}
+''');
+    var fixes = await getFixesForFirstError();
+    expect(fixes, hasLength(1));
+    assertProduces(fixes.first, r'''
+void f() {
+  int a, b;
+  a = 0;
+  b = 1;
+  print(a);
+  print(b);
+}
+''');
+  }
+}
+
+@reflectiveTest
 class PreferTypingUninitializedVariablesLintTest extends FixProcessorLintTest {
   @override
   FixKind get kind => DartFixKind.ADD_TYPE_ANNOTATION;
@@ -102,3 +208,51 @@
 ''');
   }
 }
+
+@reflectiveTest
+class TypeAnnotatePublicAPIsBulkTest extends BulkFixProcessorTest {
+  @override
+  String get lintCode => LintNames.type_annotate_public_apis;
+
+  Future<void> test_bulk() async {
+    await resolveTestCode('''
+var a = '', b = '';
+''');
+    await assertHasFix('''
+String a = '', b = '';
+''');
+  }
+}
+
+@reflectiveTest
+class TypeAnnotatePublicAPIsInFileTest extends FixInFileProcessorTest {
+  Future<void> test_File() async {
+    createAnalysisOptionsFile(lints: [LintNames.type_annotate_public_apis]);
+    await resolveTestCode(r'''
+var a = '', b = '';
+''');
+    var fixes = await getFixesForFirstError();
+    expect(fixes, hasLength(1));
+    assertProduces(fixes.first, r'''
+String a = '', b = '';
+''');
+  }
+}
+
+@reflectiveTest
+class TypeAnnotatePublicAPIsLintTest extends FixProcessorLintTest {
+  @override
+  FixKind get kind => DartFixKind.ADD_TYPE_ANNOTATION;
+
+  @override
+  String get lintCode => LintNames.type_annotate_public_apis;
+
+  Future<void> test_local() async {
+    await resolveTestCode('''
+var a = '';
+''');
+    await assertHasFix('''
+String a = '';
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/convert_to_double_quoted_string_test.dart b/pkg/analysis_server/test/src/services/correction/fix/convert_to_double_quoted_string_test.dart
new file mode 100644
index 0000000..69058c9
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/convert_to_double_quoted_string_test.dart
@@ -0,0 +1,101 @@
+// Copyright (c) 2021, 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:analysis_server/src/services/correction/fix.dart';
+import 'package:analysis_server/src/services/linter/lint_names.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:test/expect.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'fix_processor.dart';
+
+void main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(ConvertToDoubleQuotedStringBulkTest);
+    defineReflectiveTests(ConvertToDoubleQuotedStringInFileTest);
+    defineReflectiveTests(ConvertToDoubleQuotedStringTest);
+  });
+}
+
+@reflectiveTest
+class ConvertToDoubleQuotedStringBulkTest extends BulkFixProcessorTest {
+  @override
+  String get lintCode => LintNames.prefer_double_quotes;
+
+  Future<void> test_singleFile() async {
+    await resolveTestCode('''
+void f() {
+  print('abc');
+  print('e' + 'f' + 'g');
+}
+''');
+    await assertHasFix('''
+void f() {
+  print("abc");
+  print("e" + "f" + "g");
+}
+''');
+  }
+}
+
+@reflectiveTest
+class ConvertToDoubleQuotedStringInFileTest extends FixInFileProcessorTest {
+  Future<void> test_File() async {
+    createAnalysisOptionsFile(lints: [LintNames.prefer_double_quotes]);
+    await resolveTestCode(r'''
+void f() {
+  print('abc');
+  print('e' + 'f' + 'g');
+}
+''');
+    var fixes = await getFixesForFirstError();
+    expect(fixes, hasLength(1));
+    assertProduces(fixes.first, r'''
+void f() {
+  print("abc");
+  print("e" + "f" + "g");
+}
+''');
+  }
+}
+
+@reflectiveTest
+class ConvertToDoubleQuotedStringTest extends FixProcessorLintTest {
+  @override
+  FixKind get kind => DartFixKind.CONVERT_TO_DOUBLE_QUOTED_STRING;
+
+  @override
+  String get lintCode => LintNames.prefer_double_quotes;
+
+  Future<void> test_one_interpolation() async {
+    await resolveTestCode(r'''
+void f() {
+  var b = "b";
+  var c = "c";
+  print('a $b-${c} d');
+}
+''');
+    await assertHasFix(r'''
+void f() {
+  var b = "b";
+  var c = "c";
+  print("a $b-${c} d");
+}
+''');
+  }
+
+  /// More coverage in the `convert_to_double_quoted_string_test.dart` assist test.
+  Future<void> test_one_simple() async {
+    await resolveTestCode('''
+void f() {
+  print('abc');
+}
+''');
+    await assertHasFix('''
+void f() {
+  print("abc");
+}
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/convert_to_single_quoted_string_test.dart b/pkg/analysis_server/test/src/services/correction/fix/convert_to_single_quoted_string_test.dart
index 42e0f6e..42125b3 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/convert_to_single_quoted_string_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/convert_to_single_quoted_string_test.dart
@@ -5,6 +5,7 @@
 import 'package:analysis_server/src/services/correction/fix.dart';
 import 'package:analysis_server/src/services/linter/lint_names.dart';
 import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:test/expect.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import 'fix_processor.dart';
@@ -12,6 +13,7 @@
 void main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(ConvertToSingleQuotedStringBulkTest);
+    defineReflectiveTests(ConvertToSingleQuotedStringInFileTest);
     defineReflectiveTests(ConvertToSingleQuotedStringTest);
   });
 }
@@ -38,6 +40,27 @@
 }
 
 @reflectiveTest
+class ConvertToSingleQuotedStringInFileTest extends FixInFileProcessorTest {
+  Future<void> test_File() async {
+    createAnalysisOptionsFile(lints: [LintNames.prefer_single_quotes]);
+    await resolveTestCode(r'''
+void f() {
+  print("abc");
+  print("e" + "f" + "g");
+}
+''');
+    var fixes = await getFixesForFirstError();
+    expect(fixes, hasLength(1));
+    assertProduces(fixes.first, r'''
+void f() {
+  print('abc');
+  print('e' + 'f' + 'g');
+}
+''');
+  }
+}
+
+@reflectiveTest
 class ConvertToSingleQuotedStringTest extends FixProcessorLintTest {
   @override
   FixKind get kind => DartFixKind.CONVERT_TO_SINGLE_QUOTED_STRING;
diff --git a/pkg/analysis_server/test/src/services/correction/fix/data_driven/sdk_fix_test.dart b/pkg/analysis_server/test/src/services/correction/fix/data_driven/sdk_fix_test.dart
index a154782..72a5b03 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/data_driven/sdk_fix_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/data_driven/sdk_fix_test.dart
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analysis_server/src/services/correction/fix/data_driven/transform_set_manager.dart';
-import 'package:analyzer/src/test_utilities/mock_sdk.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import 'data_driven_test_support.dart';
@@ -18,7 +17,7 @@
 
 class AbstractSdkFixTest extends DataDrivenFixProcessorTest {
   void addSdkDataFile(String content) {
-    newFile('$sdkRoot/lib/_internal/${TransformSetManager.dataFileName}',
+    newFile('${sdkRoot.path}/lib/_internal/${TransformSetManager.dataFileName}',
         content: content);
   }
 
diff --git a/pkg/analysis_server/test/src/services/correction/fix/remove_argument_test.dart b/pkg/analysis_server/test/src/services/correction/fix/remove_argument_test.dart
index 736da8c..87759cd 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/remove_argument_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/remove_argument_test.dart
@@ -21,7 +21,7 @@
   @override
   String get lintCode => LintNames.avoid_redundant_argument_values;
 
-  Future<void> test_singleFile() async {
+  Future<void> test_independentInvocations() async {
     await resolveTestCode('''
 void f({bool valWithDefault = true, bool val}) {}
 void f2({bool valWithDefault = true, bool val}) {}
@@ -41,6 +41,23 @@
 }
 ''');
   }
+
+  Future<void> test_multipleInSingleInvocation() async {
+    await resolveTestCode('''
+void f() {
+  g(a: 0, b: 1, c: 2);
+}
+
+void g({int a = 0, int b = 1, int c = 2}) {}
+''');
+    await assertHasFix('''
+void f() {
+  g();
+}
+
+void g({int a = 0, int b = 1, int c = 2}) {}
+''');
+  }
 }
 
 @reflectiveTest
diff --git a/pkg/analysis_server/test/src/services/correction/fix/test_all.dart b/pkg/analysis_server/test/src/services/correction/fix/test_all.dart
index fb32189..ac07949 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/test_all.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/test_all.dart
@@ -55,6 +55,8 @@
 import 'convert_into_is_not_test.dart' as convert_into_is_not;
 import 'convert_quotes_test.dart' as convert_quotes;
 import 'convert_to_contains_test.dart' as convert_to_contains;
+import 'convert_to_double_quoted_string_test.dart'
+    as convert_to_double_quoted_string;
 import 'convert_to_for_element_test.dart' as convert_to_for_element;
 import 'convert_to_generic_function_syntax_test.dart'
     as convert_to_generic_function_syntax;
@@ -252,6 +254,7 @@
     convert_into_is_not.main();
     convert_quotes.main();
     convert_to_contains.main();
+    convert_to_double_quoted_string.main();
     convert_to_for_element.main();
     convert_to_generic_function_syntax.main();
     convert_to_if_element.main();
diff --git a/pkg/analysis_server/tool/bulk_fix/parse_utils.dart b/pkg/analysis_server/tool/bulk_fix/parse_utils.dart
new file mode 100644
index 0000000..84cf49b
--- /dev/null
+++ b/pkg/analysis_server/tool/bulk_fix/parse_utils.dart
@@ -0,0 +1,73 @@
+// Copyright (c) 2021, 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';
+
+import 'package:analyzer/dart/analysis/analysis_context_collection.dart';
+import 'package:analyzer/dart/analysis/results.dart';
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/file_system/physical_file_system.dart';
+import 'package:analyzer_utilities/package_root.dart';
+
+class BulkFixDetails {
+  Future<Map<String, CorrectionDetails>> collectOverrides() async {
+    var overrideDetails = <String, CorrectionDetails>{};
+
+    var pkgRootPath =
+        PhysicalResourceProvider.INSTANCE.pathContext.normalize(packageRoot);
+    var directory = Directory(
+        '$pkgRootPath/analysis_server/lib/src/services/correction/dart');
+    var collection = AnalysisContextCollection(
+      includedPaths: [directory.absolute.path],
+      resourceProvider: PhysicalResourceProvider.INSTANCE,
+    );
+    var context = collection.contexts[0];
+
+    for (var file in directory.listSync()) {
+      var resolvedFile = await context.currentSession
+          .getResolvedUnit(file.absolute.path) as ResolvedUnitResult;
+      for (var classDecl
+          in resolvedFile.unit.declarations.whereType<ClassDeclaration>()) {
+        var classElement = classDecl.declaredElement;
+        if (classElement != null &&
+            classElement.allSupertypes.any(
+                (element) => element.element.name == 'CorrectionProducer')) {
+          var correctionName = classDecl.name.name;
+
+          for (var method in classDecl.members.whereType<MethodDeclaration>()) {
+            if (method.name.name == 'canBeAppliedInBulk') {
+              var hasComment =
+                  method.returnType?.beginToken.precedingComments != null;
+
+              var body = method.body;
+              if (body is BlockFunctionBody) {
+                var last = body.block.statements.last;
+                if (last is ReturnStatement) {
+                  var canBeBulkApplied =
+                      (last.expression as BooleanLiteral).value;
+                  overrideDetails[correctionName] = CorrectionDetails(
+                      canBeBulkApplied: canBeBulkApplied,
+                      hasComment: hasComment);
+                }
+              } else if (body is ExpressionFunctionBody) {
+                var expression = body.expression;
+                var canBeBulkApplied = (expression as BooleanLiteral).value;
+                overrideDetails[correctionName] = CorrectionDetails(
+                    canBeBulkApplied: canBeBulkApplied, hasComment: hasComment);
+              }
+            }
+          }
+        }
+      }
+    }
+    return overrideDetails;
+  }
+}
+
+class CorrectionDetails {
+  bool canBeBulkApplied;
+  bool hasComment;
+
+  CorrectionDetails({required this.canBeBulkApplied, required this.hasComment});
+}
diff --git a/pkg/analysis_server/tool/bulk_fix/supported_hints.dart b/pkg/analysis_server/tool/bulk_fix/supported_hints.dart
new file mode 100644
index 0000000..ccc3938
--- /dev/null
+++ b/pkg/analysis_server/tool/bulk_fix/supported_hints.dart
@@ -0,0 +1,47 @@
+// Copyright (c) 2021, 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:analysis_server/src/services/correction/fix_internal.dart';
+import 'package:analyzer/error/error.dart';
+
+import 'parse_utils.dart';
+
+/// Print hint bulk-fix info.
+Future<void> main() async {
+  var overrideDetails = await BulkFixDetails().collectOverrides();
+
+  print('hints w/ correction producers:\n');
+
+  var hintEntries = FixProcessor.nonLintProducerMap.entries
+      .where((e) => e.key.type == ErrorType.HINT);
+  for (var hint in hintEntries) {
+    var canBeAppliedInBulk = false;
+    var missingExplanations = <String>[];
+    var hasOverride = false;
+    for (var generator in hint.value) {
+      var producer = generator();
+      if (!producer.canBeAppliedInBulk) {
+        var producerName = producer.runtimeType.toString();
+        if (overrideDetails.containsKey(producerName)) {
+          hasOverride = true;
+          var override = overrideDetails[producerName];
+          var hasComment = override!.hasComment;
+          if (!hasComment) {
+            missingExplanations.add(producerName);
+          }
+        }
+      } else {
+        canBeAppliedInBulk = true;
+      }
+    }
+
+    print('${hint.key} bulk fixable: $canBeAppliedInBulk');
+    if (!canBeAppliedInBulk && !hasOverride) {
+      print('  => override missing');
+    }
+    for (var producer in missingExplanations) {
+      print('  => override explanation missing for: $producer');
+    }
+  }
+}
diff --git a/pkg/analyzer/CHANGELOG.md b/pkg/analyzer/CHANGELOG.md
index 492681f..aa7d370 100644
--- a/pkg/analyzer/CHANGELOG.md
+++ b/pkg/analyzer/CHANGELOG.md
@@ -1,5 +1,7 @@
 ## 2.7.0-dev
 * Updated `ConstructorElement.displayName` to either `Class` or `Class.constructor`.
+* Deprecated `InterfaceType.getSmartLeastUpperBound`, use `TypeSystem.leastUpperBound` instead.
+* Deprecated `MockSdk`, use `createMockSdk` and `FolderBasedDartSdk` instead.
 
 ## 2.6.0
 * Deprecated `AnalysisResult.state`, check for specific valid or invalid subtypes.
diff --git a/pkg/analyzer/lib/dart/analysis/features.dart b/pkg/analyzer/lib/dart/analysis/features.dart
index a2ca408..9264322 100644
--- a/pkg/analyzer/lib/dart/analysis/features.dart
+++ b/pkg/analyzer/lib/dart/analysis/features.dart
@@ -41,6 +41,10 @@
   /// Feature information for the triple-shift operator.
   static final triple_shift = ExperimentalFeatures.triple_shift;
 
+  /// Feature information for named arguments anywhere.
+  static final named_arguments_anywhere =
+      ExperimentalFeatures.named_arguments_anywhere;
+
   /// Feature information for non-function type aliases.
   static final nonfunction_type_aliases =
       ExperimentalFeatures.nonfunction_type_aliases;
diff --git a/pkg/analyzer/lib/dart/element/type.dart b/pkg/analyzer/lib/dart/element/type.dart
index 5e9079a..2e1f80a 100644
--- a/pkg/analyzer/lib/dart/element/type.dart
+++ b/pkg/analyzer/lib/dart/element/type.dart
@@ -555,7 +555,7 @@
   /// arguments, attempts to find a compatible set of type arguments.
   ///
   /// Otherwise, returns the same result as [DartType.getLeastUpperBound].
-  // TODO(brianwilkerson) This needs to be deprecated and moved to TypeSystem.
+  @Deprecated('Use TypeSystem.leastUpperBound instead')
   static InterfaceType getSmartLeastUpperBound(
           InterfaceType first, InterfaceType second) =>
       InterfaceTypeImpl.getSmartLeastUpperBound(first, second);
diff --git a/pkg/analyzer/lib/dart/sdk/build_sdk_summary.dart b/pkg/analyzer/lib/dart/sdk/build_sdk_summary.dart
index d2062c5..c87a35f 100644
--- a/pkg/analyzer/lib/dart/sdk/build_sdk_summary.dart
+++ b/pkg/analyzer/lib/dart/sdk/build_sdk_summary.dart
@@ -106,7 +106,7 @@
       Reference.root(),
     );
 
-    var linkResult = link(elementFactory, inputLibraries, false);
+    var linkResult = link(elementFactory, inputLibraries);
 
     var bundleBuilder = PackageBundleBuilder();
     for (var library in inputLibraries) {
diff --git a/pkg/analyzer/lib/error/error.dart b/pkg/analyzer/lib/error/error.dart
index 1871a08..f6c195c 100644
--- a/pkg/analyzer/lib/error/error.dart
+++ b/pkg/analyzer/lib/error/error.dart
@@ -226,6 +226,7 @@
   CompileTimeErrorCode.INITIALIZER_FOR_STATIC_FIELD,
   CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_NON_EXISTENT_FIELD,
   CompileTimeErrorCode.INSTANCE_ACCESS_TO_STATIC_MEMBER,
+  CompileTimeErrorCode.INSTANCE_ACCESS_TO_STATIC_MEMBER_OF_UNNAMED_EXTENSION,
   CompileTimeErrorCode.INSTANCE_MEMBER_ACCESS_FROM_FACTORY,
   CompileTimeErrorCode.INSTANCE_MEMBER_ACCESS_FROM_STATIC,
   CompileTimeErrorCode.INSTANTIATE_ABSTRACT_CLASS,
diff --git a/pkg/analyzer/lib/src/dart/analysis/library_context.dart b/pkg/analyzer/lib/src/dart/analysis/library_context.dart
index 72092ad..af4763e 100644
--- a/pkg/analyzer/lib/src/dart/analysis/library_context.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/library_context.dart
@@ -175,7 +175,7 @@
         link2.LinkResult linkResult;
         try {
           timerLinking.start();
-          linkResult = link2.link(elementFactory, inputLibraries, true);
+          linkResult = link2.link(elementFactory, inputLibraries);
           librariesLinked += cycle.libraries.length;
           counterLinkedLibraries += inputLibraries.length;
           timerLinking.stop();
diff --git a/pkg/analyzer/lib/src/dart/constant/value.dart b/pkg/analyzer/lib/src/dart/constant/value.dart
index 121484e..9e95612 100644
--- a/pkg/analyzer/lib/src/dart/constant/value.dart
+++ b/pkg/analyzer/lib/src/dart/constant/value.dart
@@ -1314,12 +1314,7 @@
 
       var element = _element;
       var otherElement = rightOperand._element;
-      var elementsAreEqual = identical(element, otherElement) ||
-          (element != null &&
-              otherElement != null &&
-              otherElement.kind == element.kind &&
-              otherElement.location == element.location);
-      if (!elementsAreEqual) {
+      if (element?.declaration != otherElement?.declaration) {
         return BoolState.FALSE_STATE;
       }
       var typeArguments = _typeArguments;
@@ -1332,7 +1327,10 @@
         return BoolState.FALSE_STATE;
       }
       for (var i = 0; i < typeArguments.length; i++) {
-        if (typeArguments[i] != otherTypeArguments[i]) {
+        if (!typeSystem.runtimeTypesEqual(
+          typeArguments[i],
+          otherTypeArguments[i],
+        )) {
           return BoolState.FALSE_STATE;
         }
       }
diff --git a/pkg/analyzer/lib/src/dart/element/type.dart b/pkg/analyzer/lib/src/dart/element/type.dart
index 5e1f329..17fa3c2 100644
--- a/pkg/analyzer/lib/src/dart/element/type.dart
+++ b/pkg/analyzer/lib/src/dart/element/type.dart
@@ -1354,6 +1354,7 @@
   /// arguments, attempts to find a compatible set of type arguments.
   ///
   /// Otherwise, calls [DartType.getLeastUpperBound].
+  @Deprecated('Use TypeSystem.leastUpperBound instead')
   static InterfaceType getSmartLeastUpperBound(
       InterfaceType first, InterfaceType second) {
     // TODO(paulberry): this needs to be deprecated and replaced with a method
diff --git a/pkg/analyzer/lib/src/dart/error/hint_codes.g.dart b/pkg/analyzer/lib/src/dart/error/hint_codes.g.dart
index 62ea343..e0f5728 100644
--- a/pkg/analyzer/lib/src/dart/error/hint_codes.g.dart
+++ b/pkg/analyzer/lib/src/dart/error/hint_codes.g.dart
@@ -1486,7 +1486,7 @@
   // ```
   static const HintCode INVALID_VISIBLE_FOR_OVERRIDING_ANNOTATION = HintCode(
     'INVALID_VISIBLE_FOR_OVERRIDING_ANNOTATION',
-    "The declaration '{0}' is annotated with 'visibleForOverriding'. Because '{0}' isn't an interface member that could be overridden, the annotation is meaningless.",
+    "The annotation 'visibleForOverriding' can only be applied to a public instance member that can be overridden.",
     hasPublishedDocs: true,
   );
 
diff --git a/pkg/analyzer/lib/src/dart/micro/resolve_file.dart b/pkg/analyzer/lib/src/dart/micro/resolve_file.dart
index ab564f3..7ff94e7 100644
--- a/pkg/analyzer/lib/src/dart/micro/resolve_file.dart
+++ b/pkg/analyzer/lib/src/dart/micro/resolve_file.dart
@@ -877,7 +877,7 @@
         }
         inputsTimer.stop();
 
-        var linkResult = link2.link(elementFactory, inputLibraries, true);
+        var linkResult = link2.link(elementFactory, inputLibraries);
         librariesLinked += cycle.libraries.length;
 
         resolutionBytes = linkResult.resolutionBytes;
diff --git a/pkg/analyzer/lib/src/dart/resolver/assignment_expression_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/assignment_expression_resolver.dart
index 7882635..53c06aa 100644
--- a/pkg/analyzer/lib/src/dart/resolver/assignment_expression_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/assignment_expression_resolver.dart
@@ -128,7 +128,7 @@
   /// when it returns 'void'. Or, in rare cases, when other types of expressions
   /// are void, such as identifiers.
   ///
-  /// See [StaticWarningCode.USE_OF_VOID_RESULT].
+  /// See [CompileTimeErrorCode.USE_OF_VOID_RESULT].
   /// TODO(scheglov) this is duplicate
   bool _checkForUseOfVoidResult(Expression expression) {
     if (!identical(expression.staticType, VoidTypeImpl.instance)) {
diff --git a/pkg/analyzer/lib/src/dart/resolver/extension_member_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/extension_member_resolver.dart
index 3f5ac4f..6e59428 100644
--- a/pkg/analyzer/lib/src/dart/resolver/extension_member_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/extension_member_resolver.dart
@@ -35,6 +35,9 @@
   bool get _genericMetadataIsEnabled =>
       _resolver.definingLibrary.featureSet.isEnabled(Feature.generic_metadata);
 
+  bool get _isNonNullableByDefault =>
+      _resolver.definingLibrary.featureSet.isEnabled(Feature.non_nullable);
+
   TypeProvider get _typeProvider => _resolver.typeProvider;
 
   TypeSystemImpl get _typeSystem => _resolver.typeSystem;
@@ -73,9 +76,15 @@
           nameEntity.length,
           [
             name,
-            noneMoreSpecific
-                .map((e) => e.extension.name ?? '<unnamed>')
-                .quotedAndCommaSeparatedWithAnd,
+            noneMoreSpecific.map((e) {
+              var name = e.extension.name;
+              if (name != null) {
+                return "extension '$name'";
+              }
+              var type = e.extension.extendedType
+                  .getDisplayString(withNullability: _isNonNullableByDefault);
+              return "unnamed extension on '$type'";
+            }).commaSeparatedWithAnd,
           ],
         );
         return ResolutionResult.ambiguous;
diff --git a/pkg/analyzer/lib/src/dart/resolver/function_expression_invocation_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/function_expression_invocation_resolver.dart
index 48a6c65..42070dc 100644
--- a/pkg/analyzer/lib/src/dart/resolver/function_expression_invocation_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/function_expression_invocation_resolver.dart
@@ -84,7 +84,7 @@
   /// when it returns 'void'. Or, in rare cases, when other types of expressions
   /// are void, such as identifiers.
   ///
-  /// See [StaticWarningCode.USE_OF_VOID_RESULT].
+  /// See [CompileTimeErrorCode.USE_OF_VOID_RESULT].
   ///
   /// TODO(scheglov) this is duplicate
   bool _checkForUseOfVoidResult(Expression expression, DartType type) {
diff --git a/pkg/analyzer/lib/src/dart/resolver/function_reference_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/function_reference_resolver.dart
index 386da13..d55bcaa 100644
--- a/pkg/analyzer/lib/src/dart/resolver/function_reference_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/function_reference_resolver.dart
@@ -164,14 +164,26 @@
           [enclosingElement.displayName],
         );
       }
+    } else if (enclosingElement is ExtensionElement &&
+        enclosingElement.name == null) {
+      _resolver.errorReporter.reportErrorForNode(
+          CompileTimeErrorCode
+              .INSTANCE_ACCESS_TO_STATIC_MEMBER_OF_UNNAMED_EXTENSION,
+          nameNode,
+          [
+            nameNode.name,
+            element.kind.displayName,
+          ]);
     } else {
+      // It is safe to assume that `enclosingElement.name` is non-`null` because
+      // it can only be `null` for extensions, and we handle that case above.
       _resolver.errorReporter.reportErrorForNode(
         CompileTimeErrorCode.INSTANCE_ACCESS_TO_STATIC_MEMBER,
         nameNode,
         [
           nameNode.name,
           element.kind.displayName,
-          enclosingElement.name ?? '<unnamed>',
+          enclosingElement.name!,
           enclosingElement is ClassElement && enclosingElement.isMixin
               ? 'mixin'
               : enclosingElement.kind.displayName,
diff --git a/pkg/analyzer/lib/src/dart/resolver/method_invocation_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/method_invocation_resolver.dart
index e75d2be..7070eac 100644
--- a/pkg/analyzer/lib/src/dart/resolver/method_invocation_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/method_invocation_resolver.dart
@@ -234,14 +234,26 @@
           [enclosingElement.displayName],
         );
       }
+    } else if (enclosingElement is ExtensionElement &&
+        enclosingElement.name == null) {
+      _resolver.errorReporter.reportErrorForNode(
+          CompileTimeErrorCode
+              .INSTANCE_ACCESS_TO_STATIC_MEMBER_OF_UNNAMED_EXTENSION,
+          nameNode,
+          [
+            nameNode.name,
+            element.kind.displayName,
+          ]);
     } else {
+      // It is safe to assume that `enclosingElement.name` is non-`null` because
+      // it can only be `null` for extensions, and we handle that case above.
       _resolver.errorReporter.reportErrorForNode(
         CompileTimeErrorCode.INSTANCE_ACCESS_TO_STATIC_MEMBER,
         nameNode,
         [
           nameNode.name,
           element.kind.displayName,
-          enclosingElement.name ?? '<unnamed>',
+          enclosingElement.name!,
           enclosingElement is ClassElement && enclosingElement.isMixin
               ? 'mixin'
               : enclosingElement.kind.displayName,
diff --git a/pkg/analyzer/lib/src/dart/resolver/property_element_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/property_element_resolver.dart
index 787d963..84cc019 100644
--- a/pkg/analyzer/lib/src/dart/resolver/property_element_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/property_element_resolver.dart
@@ -275,16 +275,31 @@
         );
       } else {
         var enclosingElement = element.enclosingElement;
-        _errorReporter.reportErrorForNode(
-            CompileTimeErrorCode.INSTANCE_ACCESS_TO_STATIC_MEMBER,
-            propertyName, [
-          propertyName,
-          element.kind.displayName,
-          enclosingElement.name ?? '<unnamed>',
-          enclosingElement is ClassElement && enclosingElement.isMixin
-              ? 'mixin'
-              : enclosingElement.kind.displayName,
-        ]);
+        if (enclosingElement is ExtensionElement &&
+            enclosingElement.name == null) {
+          _resolver.errorReporter.reportErrorForNode(
+              CompileTimeErrorCode
+                  .INSTANCE_ACCESS_TO_STATIC_MEMBER_OF_UNNAMED_EXTENSION,
+              propertyName,
+              [
+                propertyName.name,
+                element.kind.displayName,
+              ]);
+        } else {
+          // It is safe to assume that `enclosingElement.name` is non-`null`
+          // because it can only be `null` for extensions, and we handle that
+          // case above.
+          _errorReporter.reportErrorForNode(
+              CompileTimeErrorCode.INSTANCE_ACCESS_TO_STATIC_MEMBER,
+              propertyName, [
+            propertyName.name,
+            element.kind.displayName,
+            enclosingElement.name!,
+            enclosingElement is ClassElement && enclosingElement.isMixin
+                ? 'mixin'
+                : enclosingElement.kind.displayName,
+          ]);
+        }
       }
     }
   }
diff --git a/pkg/analyzer/lib/src/error/best_practices_verifier.dart b/pkg/analyzer/lib/src/error/best_practices_verifier.dart
index a8de577..4d6d9a3 100644
--- a/pkg/analyzer/lib/src/error/best_practices_verifier.dart
+++ b/pkg/analyzer/lib/src/error/best_practices_verifier.dart
@@ -232,9 +232,7 @@
 
         void reportInvalidVisibleForOverriding(Element declaredElement) {
           _errorReporter.reportErrorForNode(
-              HintCode.INVALID_VISIBLE_FOR_OVERRIDING_ANNOTATION,
-              node,
-              [declaredElement.name ?? '<unnamed>']);
+              HintCode.INVALID_VISIBLE_FOR_OVERRIDING_ANNOTATION, node);
         }
 
         if (parent is TopLevelVariableDeclaration) {
diff --git a/pkg/analyzer/lib/src/error/codes.g.dart b/pkg/analyzer/lib/src/error/codes.g.dart
index 2e29e47..50bdab7 100644
--- a/pkg/analyzer/lib/src/error/codes.g.dart
+++ b/pkg/analyzer/lib/src/error/codes.g.dart
@@ -184,8 +184,7 @@
   /**
    * Parameters:
    * 0: the name of the member
-   * 1: the name of the first declaring extension
-   * 2: the name of the second declaring extension
+   * 1: the names of the declaring extensions
    */
   // #### Description
   //
@@ -244,7 +243,7 @@
   static const CompileTimeErrorCode AMBIGUOUS_EXTENSION_MEMBER_ACCESS =
       CompileTimeErrorCode(
     'AMBIGUOUS_EXTENSION_MEMBER_ACCESS',
-    "A member named '{0}' is defined in extensions {1}, and none are more specific.",
+    "A member named '{0}' is defined in {1}, and none are more specific.",
     correctionMessage:
         "Try using an extension override to specify the extension you want to be chosen.",
     hasPublishedDocs: true,
@@ -4157,8 +4156,7 @@
 
   /**
    * Parameters:
-   * 0: the name of the extension defining the conflicting member
-   * 1: the name of the conflicting static member
+   * 0: the name of the conflicting static member
    */
   // #### Description
   //
@@ -4193,7 +4191,7 @@
   static const CompileTimeErrorCode EXTENSION_CONFLICTING_STATIC_AND_INSTANCE =
       CompileTimeErrorCode(
     'EXTENSION_CONFLICTING_STATIC_AND_INSTANCE',
-    "Extension '{0}' can't define static member '{1}' and an instance member with the same name.",
+    "An extension can't define static member '{0}' and an instance member with the same name.",
     correctionMessage:
         "Try renaming the member to a name that doesn't conflict.",
     hasPublishedDocs: true,
@@ -6254,6 +6252,20 @@
   );
 
   /**
+   * Parameters:
+   * 0: the name of the static member
+   * 1: the kind of the static member (field, getter, setter, or method)
+   */
+  static const CompileTimeErrorCode
+      INSTANCE_ACCESS_TO_STATIC_MEMBER_OF_UNNAMED_EXTENSION =
+      CompileTimeErrorCode(
+    'INSTANCE_ACCESS_TO_STATIC_MEMBER',
+    "The static {1} '{0}' can't be accessed through an instance.",
+    hasPublishedDocs: true,
+    uniqueName: 'INSTANCE_ACCESS_TO_STATIC_MEMBER_OF_UNNAMED_EXTENSION',
+  );
+
+  /**
    * No parameters.
    */
   // #### Description
diff --git a/pkg/analyzer/lib/src/error/duplicate_definition_verifier.dart b/pkg/analyzer/lib/src/error/duplicate_definition_verifier.dart
index 684e1ac8..113dae0 100644
--- a/pkg/analyzer/lib/src/error/duplicate_definition_verifier.dart
+++ b/pkg/analyzer/lib/src/error/duplicate_definition_verifier.dart
@@ -112,7 +112,7 @@
               _errorReporter.reportErrorForNode(
                 CompileTimeErrorCode.EXTENSION_CONFLICTING_STATIC_AND_INSTANCE,
                 identifier,
-                [node.declaredElement!.name ?? '<unnamed>', name],
+                [name],
               );
             }
           }
@@ -126,7 +126,7 @@
             _errorReporter.reportErrorForNode(
               CompileTimeErrorCode.EXTENSION_CONFLICTING_STATIC_AND_INSTANCE,
               identifier,
-              [node.declaredElement!.name ?? '<unnamed>', name],
+              [name],
             );
           }
         }
diff --git a/pkg/analyzer/lib/src/error/use_result_verifier.dart b/pkg/analyzer/lib/src/error/use_result_verifier.dart
index 1899064..c6939dec 100644
--- a/pkg/analyzer/lib/src/error/use_result_verifier.dart
+++ b/pkg/analyzer/lib/src/error/use_result_verifier.dart
@@ -154,6 +154,8 @@
     }
 
     return parent is ArgumentList ||
+        // Node should always be RHS so no need to check for a property assignment.
+        parent is AssignmentExpression ||
         parent is VariableDeclaration ||
         parent is MethodInvocation ||
         parent is PropertyAccess ||
diff --git a/pkg/analyzer/lib/src/fasta/ast_builder.dart b/pkg/analyzer/lib/src/fasta/ast_builder.dart
index 4951088..e88c858 100644
--- a/pkg/analyzer/lib/src/fasta/ast_builder.dart
+++ b/pkg/analyzer/lib/src/fasta/ast_builder.dart
@@ -144,9 +144,12 @@
   /// `true` if constructor tearoffs are enabled
   final bool enableConstructorTearoffs;
 
-  /// `true` if extension types are enabled;
+  /// `true` if extension types are enabled
   final bool enableExtensionTypes;
 
+  /// `true` if named arguments anywhere are enabled
+  final bool enableNamedArgumentsAnywhere;
+
   final FeatureSet _featureSet;
 
   AstBuilder(ErrorReporter? errorReporter, this.fileUri, this.isFullAst,
@@ -165,6 +168,8 @@
         enableConstructorTearoffs =
             _featureSet.isEnabled(Feature.constructor_tearoffs),
         enableExtensionTypes = _featureSet.isEnabled(Feature.extension_types),
+        enableNamedArgumentsAnywhere =
+            _featureSet.isEnabled(Feature.named_arguments_anywhere),
         uri = uri ?? fileUri;
 
   NodeList<ClassMember> get currentDeclarationMembers {
@@ -579,14 +584,16 @@
     ArgumentList arguments =
         ast.argumentList(leftParenthesis, expressions, rightParenthesis);
 
-    bool hasSeenNamedArgument = false;
-    for (Expression expression in expressions) {
-      if (expression is NamedExpression) {
-        hasSeenNamedArgument = true;
-      } else if (hasSeenNamedArgument) {
-        // Positional argument after named argument.
-        handleRecoverableError(messagePositionalAfterNamedArgument,
-            expression.beginToken, expression.endToken);
+    if (!enableNamedArgumentsAnywhere) {
+      bool hasSeenNamedArgument = false;
+      for (Expression expression in expressions) {
+        if (expression is NamedExpression) {
+          hasSeenNamedArgument = true;
+        } else if (hasSeenNamedArgument) {
+          // Positional argument after named argument.
+          handleRecoverableError(messagePositionalAfterNamedArgument,
+              expression.beginToken, expression.endToken);
+        }
       }
     }
 
diff --git a/pkg/analyzer/lib/src/generated/error_detection_helpers.dart b/pkg/analyzer/lib/src/generated/error_detection_helpers.dart
index b53515f..7903c73 100644
--- a/pkg/analyzer/lib/src/generated/error_detection_helpers.dart
+++ b/pkg/analyzer/lib/src/generated/error_detection_helpers.dart
@@ -51,7 +51,7 @@
   /// This method corresponds to
   /// [BestPracticesVerifier.checkForArgumentTypeNotAssignableForArgument].
   ///
-  /// See [StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE].
+  /// See [CompileTimeErrorCode.ARGUMENT_TYPE_NOT_ASSIGNABLE].
   void checkForArgumentTypeNotAssignableForArgument(Expression argument,
       {bool promoteParameterToNullable = false,
       Map<DartType, NonPromotionReason> Function()? whyNotPromoted}) {
@@ -68,7 +68,7 @@
   /// from the name in the [ConstructorFieldInitializer].
   ///
   /// See [CompileTimeErrorCode.CONST_FIELD_INITIALIZER_NOT_ASSIGNABLE], and
-  /// [StaticWarningCode.FIELD_INITIALIZER_NOT_ASSIGNABLE].
+  /// [CompileTimeErrorCode.FIELD_INITIALIZER_NOT_ASSIGNABLE].
   void checkForFieldInitializerNotAssignable(
       ConstructorFieldInitializer initializer, FieldElement fieldElement,
       {required bool isConstConstructor,
@@ -169,7 +169,7 @@
   /// when it returns 'void'. Or, in rare cases, when other types of expressions
   /// are void, such as identifiers.
   ///
-  /// See [StaticWarningCode.USE_OF_VOID_RESULT].
+  /// See [CompileTimeErrorCode.USE_OF_VOID_RESULT].
   bool checkForUseOfVoidResult(Expression expression) {
     if (!identical(expression.staticType, VoidTypeImpl.instance)) {
       return false;
@@ -265,13 +265,10 @@
   /// Verify that the given [expression] can be assigned to its corresponding
   /// parameters.
   ///
-  /// See [StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE],
+  /// See [CompileTimeErrorCode.ARGUMENT_TYPE_NOT_ASSIGNABLE],
   /// [CompileTimeErrorCode.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE],
-  /// [StaticWarningCode.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE],
-  /// [CompileTimeErrorCode.MAP_KEY_TYPE_NOT_ASSIGNABLE],
-  /// [CompileTimeErrorCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE],
-  /// [StaticWarningCode.MAP_KEY_TYPE_NOT_ASSIGNABLE], and
-  /// [StaticWarningCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE].
+  /// [CompileTimeErrorCode.MAP_KEY_TYPE_NOT_ASSIGNABLE], and
+  /// [CompileTimeErrorCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE].
   void _checkForArgumentTypeNotAssignableWithExpectedTypes(
       Expression expression,
       DartType? expectedStaticType,
diff --git a/pkg/analyzer/lib/src/generated/error_verifier.dart b/pkg/analyzer/lib/src/generated/error_verifier.dart
index 2b6b30d..d2658e5 100644
--- a/pkg/analyzer/lib/src/generated/error_verifier.dart
+++ b/pkg/analyzer/lib/src/generated/error_verifier.dart
@@ -1507,9 +1507,9 @@
 
   /// Verify that the given [expression] is not final.
   ///
-  /// See [StaticWarningCode.ASSIGNMENT_TO_CONST],
-  /// [StaticWarningCode.ASSIGNMENT_TO_FINAL], and
-  /// [StaticWarningCode.ASSIGNMENT_TO_METHOD].
+  /// See [CompileTimeErrorCode.ASSIGNMENT_TO_CONST],
+  /// [CompileTimeErrorCode.ASSIGNMENT_TO_FINAL], and
+  /// [CompileTimeErrorCode.ASSIGNMENT_TO_METHOD].
   void _checkForAssignmentToFinal(Expression expression) {
     // TODO(scheglov) Check SimpleIdentifier(s) as all other nodes.
     if (expression is! SimpleIdentifier) return;
@@ -1650,7 +1650,7 @@
   /// Verify that the given [switchCase] is terminated with 'break', 'continue',
   /// 'return' or 'throw'.
   ///
-  /// see [StaticWarningCode.CASE_BLOCK_NOT_TERMINATED].
+  /// see [CompileTimeErrorCode.CASE_BLOCK_NOT_TERMINATED].
   void _checkForCaseBlockNotTerminated(SwitchCase switchCase) {
     NodeList<Statement> statements = switchCase.statements;
     if (statements.isEmpty) {
@@ -1692,7 +1692,7 @@
   /// Verify that the switch cases in the given switch [statement] are
   /// terminated with 'break', 'continue', 'rethrow', 'return' or 'throw'.
   ///
-  /// See [StaticWarningCode.CASE_BLOCK_NOT_TERMINATED].
+  /// See [CompileTimeErrorCode.CASE_BLOCK_NOT_TERMINATED].
   void _checkForCaseBlocksNotTerminated(SwitchStatement statement) {
     if (_isNonNullableByDefault) return;
 
@@ -2432,7 +2432,7 @@
   /// variables if the list is final or const.
   ///
   /// See [CompileTimeErrorCode.CONST_NOT_INITIALIZED], and
-  /// [StaticWarningCode.FINAL_NOT_INITIALIZED].
+  /// [CompileTimeErrorCode.FINAL_NOT_INITIALIZED].
   void _checkForFinalNotInitialized(VariableDeclarationList list) {
     if (_isInNativeClass || list.isSynthetic) {
       return;
@@ -2481,7 +2481,7 @@
   /// constructor are handled in [_checkForAllFinalInitializedErrorCodes].
   ///
   /// See [CompileTimeErrorCode.CONST_NOT_INITIALIZED], and
-  /// [StaticWarningCode.FINAL_NOT_INITIALIZED].
+  /// [CompileTimeErrorCode.FINAL_NOT_INITIALIZED].
   void _checkForFinalNotInitializedInClass(List<ClassMember> members) {
     for (ClassMember classMember in members) {
       if (classMember is ConstructorDeclaration) {
@@ -2665,7 +2665,7 @@
   /// given [argument]. This is used for prefix and postfix expressions where
   /// the argument value is implicit.
   ///
-  /// See [StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE].
+  /// See [CompileTimeErrorCode.ARGUMENT_TYPE_NOT_ASSIGNABLE].
   void _checkForIntNotAssignable(Expression argument) {
     var staticParameterElement = argument.staticParameterElement;
     var staticParameterType = staticParameterElement?.type;
@@ -2839,8 +2839,7 @@
   /// Verify that the elements of the given list [literal] are subtypes of the
   /// list's static type.
   ///
-  /// See [CompileTimeErrorCode.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE], and
-  /// [StaticWarningCode.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE].
+  /// See [CompileTimeErrorCode.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE].
   void _checkForListElementTypeNotAssignable(ListLiteral literal) {
     // Determine the list's element type. We base this on the static type and
     // not the literal's type arguments because in strong mode, the type
@@ -3255,7 +3254,7 @@
   /// This method assumes that the instance creation was tested to be 'new'
   /// before being called.
   ///
-  /// See [StaticWarningCode.NEW_WITH_UNDEFINED_CONSTRUCTOR].
+  /// See [CompileTimeErrorCode.NEW_WITH_UNDEFINED_CONSTRUCTOR].
   void _checkForNewWithUndefinedConstructor(
       InstanceCreationExpression expression,
       ConstructorName constructorName,
@@ -3400,7 +3399,7 @@
   /// Verify that the given method [declaration] of operator `[]=`, has `void`
   /// return type.
   ///
-  /// See [StaticWarningCode.NON_VOID_RETURN_FOR_OPERATOR].
+  /// See [CompileTimeErrorCode.NON_VOID_RETURN_FOR_OPERATOR].
   void _checkForNonVoidReturnTypeForOperator(MethodDeclaration declaration) {
     // check that []= operator
     SimpleIdentifier name = declaration.name;
@@ -3421,7 +3420,7 @@
   /// Verify the [namedType], used as the return type of a setter, is valid
   /// (either `null` or the type 'void').
   ///
-  /// See [StaticWarningCode.NON_VOID_RETURN_FOR_SETTER].
+  /// See [CompileTimeErrorCode.NON_VOID_RETURN_FOR_SETTER].
   void _checkForNonVoidReturnTypeForSetter(TypeAnnotation? namedType) {
     if (namedType != null) {
       DartType type = namedType.typeOrThrow;
@@ -3880,8 +3879,7 @@
   /// Verify that the elements in the given set [literal] are subtypes of the
   /// set's static type.
   ///
-  /// See [CompileTimeErrorCode.SET_ELEMENT_TYPE_NOT_ASSIGNABLE], and
-  /// [StaticWarningCode.SET_ELEMENT_TYPE_NOT_ASSIGNABLE].
+  /// See [CompileTimeErrorCode.SET_ELEMENT_TYPE_NOT_ASSIGNABLE].
   void _checkForSetElementTypeNotAssignable3(SetOrMapLiteral literal) {
     // Determine the set's element type. We base this on the static type and
     // not the literal's type arguments because in strong mode, the type
@@ -3916,7 +3914,7 @@
   /// Check the given [typeReference] and that the [name] is not a reference to
   /// an instance member.
   ///
-  /// See [StaticWarningCode.STATIC_ACCESS_TO_INSTANCE_MEMBER].
+  /// See [CompileTimeErrorCode.STATIC_ACCESS_TO_INSTANCE_MEMBER].
   void _checkForStaticAccessToInstanceMember(
       ClassElement? typeReference, SimpleIdentifier name) {
     // OK, in comment
@@ -3944,7 +3942,7 @@
   /// Check that the type of the expression in the given 'switch' [statement] is
   /// assignable to the type of the 'case' members.
   ///
-  /// See [StaticWarningCode.SWITCH_EXPRESSION_NOT_ASSIGNABLE].
+  /// See [CompileTimeErrorCode.SWITCH_EXPRESSION_NOT_ASSIGNABLE].
   void _checkForSwitchExpressionNotAssignable(SwitchStatement statement) {
     // For NNBD we verify runtime types of values, and subtyping.
     if (_isNonNullableByDefault) {
@@ -4010,7 +4008,7 @@
 
   /// Verify that the [type] is not a deferred type.
   ///
-  /// See [StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS].
+  /// See [CompileTimeErrorCode.TYPE_ANNOTATION_DEFERRED_CLASS].
   void _checkForTypeAnnotationDeferredClass(TypeAnnotation? type) {
     if (type is NamedType && type.isDeferred) {
       errorReporter.reportErrorForNode(
@@ -4077,7 +4075,7 @@
   ///
   /// See [CompileTimeErrorCode.UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT],
   /// [CompileTimeErrorCode.NON_GENERATIVE_CONSTRUCTOR], and
-  /// [StaticWarningCode.NO_DEFAULT_SUPER_CONSTRUCTOR_EXPLICIT].
+  /// [CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_EXPLICIT].
   void _checkForUndefinedConstructorInInitializerImplicit(
       ConstructorDeclaration constructor) {
     if (_enclosingClass == null) {
diff --git a/pkg/analyzer/lib/src/generated/resolver.dart b/pkg/analyzer/lib/src/generated/resolver.dart
index 919a698..a136006 100644
--- a/pkg/analyzer/lib/src/generated/resolver.dart
+++ b/pkg/analyzer/lib/src/generated/resolver.dart
@@ -451,10 +451,7 @@
   /// Verify that the arguments in the given [argumentList] can be assigned to
   /// their corresponding parameters.
   ///
-  /// This method corresponds to
-  /// [BestPracticesVerifier.checkForArgumentTypesNotAssignableInList].
-  ///
-  /// See [StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE].
+  /// See [CompileTimeErrorCode.ARGUMENT_TYPE_NOT_ASSIGNABLE].
   void checkForArgumentTypesNotAssignableInList(ArgumentList argumentList,
       List<WhyNotPromotedGetter> whyNotPromotedList) {
     var arguments = argumentList.arguments;
diff --git a/pkg/analyzer/lib/src/summary2/link.dart b/pkg/analyzer/lib/src/summary2/link.dart
index db4d362..5665fb5 100644
--- a/pkg/analyzer/lib/src/summary2/link.dart
+++ b/pkg/analyzer/lib/src/summary2/link.dart
@@ -25,12 +25,10 @@
 var timerLinkingLinkingBundle = Stopwatch();
 
 /// Note that AST units and tokens of [inputLibraries] will be damaged.
-///
-/// TODO(scheglov) deprecate `withInformative`.
 LinkResult link(
   LinkedElementFactory elementFactory,
   List<LinkInputLibrary> inputLibraries, [
-  bool? withInformative,
+  @Deprecated('Not used anymore') bool? withInformative,
 ]) {
   var linker = Linker(elementFactory);
   linker.link(inputLibraries);
diff --git a/pkg/analyzer/lib/src/summary2/linked_element_factory.dart b/pkg/analyzer/lib/src/summary2/linked_element_factory.dart
index 456548e..74e80c2 100644
--- a/pkg/analyzer/lib/src/summary2/linked_element_factory.dart
+++ b/pkg/analyzer/lib/src/summary2/linked_element_factory.dart
@@ -15,8 +15,8 @@
   final AnalysisContextImpl analysisContext;
   final AnalysisSessionImpl analysisSession;
   final Reference rootReference;
-  final Map<String, LibraryReader> libraryReaders = {};
-  final _exportsOfLibrary = <String, List<Reference>>{};
+  final Map<String, LibraryReader> _libraryReaders = {};
+  final Map<String, List<Reference>> _exportsOfLibrary = {};
 
   bool isApplyingInformativeData = false;
 
@@ -34,7 +34,7 @@
   }
 
   bool get hasDartCore {
-    return libraryReaders.containsKey('dart:core');
+    return _libraryReaders.containsKey('dart:core');
   }
 
   void addBundle(BundleReader bundle) {
@@ -42,7 +42,7 @@
   }
 
   void addLibraries(Map<String, LibraryReader> libraries) {
-    libraryReaders.addAll(libraries);
+    _libraryReaders.addAll(libraries);
   }
 
   Namespace buildExportNamespace(Uri uri) {
@@ -73,11 +73,11 @@
     // The URI cannot be resolved, we don't know the library.
     if (librarySource == null) return null;
 
-    var reader = libraryReaders[uriStr];
+    var reader = _libraryReaders[uriStr];
     if (reader == null) {
       throw ArgumentError(
         'Missing library: $uriStr\n'
-        'Available libraries: ${libraryReaders.keys.toList()}',
+        'Available libraries: ${_libraryReaders.keys.toList()}',
       );
     }
 
@@ -154,14 +154,14 @@
     if (exports != null) return exports;
 
     // TODO(scheglov) Use [setExportsOfLibrary] instead
-    var library = libraryReaders[uriStr];
+    var library = _libraryReaders[uriStr];
     if (library == null) return const [];
 
     return library.exports;
   }
 
   bool hasLibrary(String uriStr) {
-    return libraryReaders[uriStr] != null;
+    return _libraryReaders[uriStr] != null;
   }
 
   /// We are about to discard this factory, mark all libraries invalid.
@@ -195,7 +195,7 @@
   void removeLibraries(Set<String> uriStrSet) {
     for (var uriStr in uriStrSet) {
       _exportsOfLibrary.remove(uriStr);
-      libraryReaders.remove(uriStr);
+      _libraryReaders.remove(uriStr);
       var libraryReference = rootReference.removeChild(uriStr);
       _invalidateLibrary(libraryReference);
     }
@@ -212,10 +212,10 @@
           '${uriStrSet.toList()}',
         );
       }
-      if (libraryReaders.isNotEmpty) {
+      if (_libraryReaders.isNotEmpty) {
         throw StateError(
           'Expected to link dart:core and dart:async first: '
-          '${libraryReaders.keys.toList()}',
+          '${_libraryReaders.keys.toList()}',
         );
       }
       analysisContext.clearTypeProvider();
diff --git a/pkg/analyzer/lib/src/test_utilities/mock_sdk.dart b/pkg/analyzer/lib/src/test_utilities/mock_sdk.dart
index 006dde9..374580cfb 100644
--- a/pkg/analyzer/lib/src/test_utilities/mock_sdk.dart
+++ b/pkg/analyzer/lib/src/test_utilities/mock_sdk.dart
@@ -9,15 +9,14 @@
 import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer/src/dart/sdk/sdk.dart';
 import 'package:analyzer/src/generated/sdk.dart';
-import 'package:analyzer/src/generated/source.dart';
-import 'package:pub_semver/src/version.dart';
+import 'package:meta/meta.dart';
 
+@Deprecated('Use createMockSdk() instead')
 const String sdkRoot = '/sdk';
 
-final MockSdkLibrary _LIB_ASYNC = MockSdkLibrary([
+final MockSdkLibrary _LIB_ASYNC = MockSdkLibrary('async', [
   MockSdkLibraryUnit(
-    'dart:async',
-    '$sdkRoot/lib/async/async.dart',
+    'async/async.dart',
     '''
 library dart.async;
 
@@ -76,8 +75,7 @@
 ''',
   ),
   MockSdkLibraryUnit(
-    'dart:async/stream.dart',
-    '$sdkRoot/lib/async/stream.dart',
+    'async/stream.dart',
     r'''
 part of dart.async;
 
@@ -114,10 +112,9 @@
   )
 ]);
 
-final MockSdkLibrary _LIB_ASYNC2 = MockSdkLibrary([
+final MockSdkLibrary _LIB_ASYNC2 = MockSdkLibrary('async2', [
   MockSdkLibraryUnit(
-    'dart:async2',
-    '$sdkRoot/lib/async2/async2.dart',
+    'async2/async2.dart',
     '''
 library dart.async2;
 
@@ -126,10 +123,9 @@
   )
 ]);
 
-final MockSdkLibrary _LIB_COLLECTION = MockSdkLibrary([
+final MockSdkLibrary _LIB_COLLECTION = MockSdkLibrary('collection', [
   MockSdkLibraryUnit(
-    'dart:collection',
-    '$sdkRoot/lib/collection/collection.dart',
+    'collection/collection.dart',
     '''
 library dart.collection;
 
@@ -222,10 +218,10 @@
 ]);
 
 final MockSdkLibrary _LIB_CONVERT = MockSdkLibrary(
+  'convert',
   [
     MockSdkLibraryUnit(
-      'dart:convert',
-      '$sdkRoot/lib/convert/convert.dart',
+      'convert/convert.dart',
       '''
 library dart.convert;
 
@@ -253,10 +249,10 @@
 );
 
 final MockSdkLibrary _LIB_CORE = MockSdkLibrary(
+  'core',
   [
     MockSdkLibraryUnit(
-      'dart:core',
-      '$sdkRoot/lib/core/core.dart',
+      'core/core.dart',
       '''
 library dart.core;
 
@@ -655,10 +651,9 @@
   ],
 );
 
-final MockSdkLibrary _LIB_FFI = MockSdkLibrary([
+final MockSdkLibrary _LIB_FFI = MockSdkLibrary('ffi', [
   MockSdkLibraryUnit(
-    'dart:ffi',
-    '$sdkRoot/lib/ffi/ffi.dart',
+    'ffi/ffi.dart',
     '''
 library dart.ffi;
 
@@ -799,10 +794,10 @@
 ]);
 
 final MockSdkLibrary _LIB_HTML_DART2JS = MockSdkLibrary(
+  'html',
   [
     MockSdkLibraryUnit(
-      'dart:html',
-      '$sdkRoot/lib/html/dart2js/html_dart2js.dart',
+      'html/dart2js/html_dart2js.dart',
       '''
 library dart.dom.html;
 
@@ -1008,10 +1003,10 @@
 );
 
 final MockSdkLibrary _LIB_INTERCEPTORS = MockSdkLibrary(
+  '_interceptors',
   [
     MockSdkLibraryUnit(
-      'dart:_interceptors',
-      '$sdkRoot/lib/_internal/js_runtime/lib/interceptors.dart',
+      '_internal/js_runtime/lib/interceptors.dart',
       '''
 library dart._interceptors;
 ''',
@@ -1020,10 +1015,10 @@
 );
 
 final MockSdkLibrary _LIB_INTERNAL = MockSdkLibrary(
+  '_internal',
   [
     MockSdkLibraryUnit(
-      'dart:_internal',
-      '$sdkRoot/lib/_internal/internal.dart',
+      '_internal/internal.dart',
       '''
 library dart._internal;
 
@@ -1040,13 +1035,14 @@
 ''',
     )
   ],
+  categories: '',
 );
 
 final MockSdkLibrary _LIB_IO = MockSdkLibrary(
+  'io',
   [
     MockSdkLibraryUnit(
-      'dart:io',
-      '$sdkRoot/lib/io/io.dart',
+      'io/io.dart',
       '''
 library dart.io;
 
@@ -1129,10 +1125,9 @@
   ],
 );
 
-final MockSdkLibrary _LIB_ISOLATE = MockSdkLibrary([
+final MockSdkLibrary _LIB_ISOLATE = MockSdkLibrary('isolate', [
   MockSdkLibraryUnit(
-    'dart:isolate',
-    '$sdkRoot/lib/isolate/isolate.dart',
+    'isolate.dart',
     '''
 library dart.isolate;
 
@@ -1160,10 +1155,10 @@
 ]);
 
 final MockSdkLibrary _LIB_MATH = MockSdkLibrary(
+  'math',
   [
     MockSdkLibraryUnit(
-      'dart:math',
-      '$sdkRoot/lib/math/math.dart',
+      'math/math.dart',
       '''
 library dart.math;
 
@@ -1206,213 +1201,111 @@
   _LIB_INTERNAL,
 ];
 
-final Map<String, String> _librariesDartEntries = {
-  'async': 'const LibraryInfo("async/async.dart")',
-  'collection': 'const LibraryInfo("collection/collection.dart")',
-  'convert': 'const LibraryInfo("convert/convert.dart")',
-  'core': 'const LibraryInfo("core/core.dart")',
-  'ffi': 'const LibraryInfo("ffi/ffi.dart")',
-  'html': 'const LibraryInfo("html/dart2js/html_dart2js.dart")',
-  'io': 'const LibraryInfo("io/io.dart")',
-  'isolate': 'const LibraryInfo("isolate/isolate.dart")',
-  'math': 'const LibraryInfo("math/math.dart")',
-  '_internal': 'const LibraryInfo("_internal/internal.dart", categories: "")',
-};
+/// Create a reduced approximation of Dart SDK in the [path].
+///
+/// It has enough libraries to run analyzer and analysis server tests,
+/// but some libraries, classes, and methods are missing.
+void createMockSdk({
+  required MemoryResourceProvider resourceProvider,
+  required Folder root,
+  @internal List<MockSdkLibrary> additionalLibraries = const [],
+}) {
+  var lib = root.getChildAssumingFolder('lib');
+  var libInternal = lib.getChildAssumingFolder('_internal');
 
-class MockSdk implements DartSdk {
-  final MemoryResourceProvider resourceProvider;
+  var currentVersion = ExperimentStatus.currentVersion;
+  var currentVersionStr = '${currentVersion.major}.${currentVersion.minor}.0';
+  root.getChildAssumingFile('version').writeAsStringSync(currentVersionStr);
 
-  final Map<String, String> uriMap = {};
+  var librariesBuffer = StringBuffer();
+  librariesBuffer.writeln(
+    'const Map<String, LibraryInfo> libraries = const {',
+  );
 
-  @override
-  final List<MockSdkLibrary> sdkLibraries = [];
-
-  late final File _versionFile;
-
-  /// Optional [additionalLibraries] should have unique URIs, and paths in
-  /// their units are relative (will be put into `sdkRoot/lib`).
-  ///
-  /// [nullSafePackages], if supplied, is a list of packages names that should
-  /// be included in the null safety allow list.
-  ///
-  /// [sdkVersion], if supplied will override the version stored in the mock
-  /// SDK's `version` file.
-  MockSdk({
-    required this.resourceProvider,
-    List<MockSdkLibrary> additionalLibraries = const [],
-    List<String> nullSafePackages = const [],
-    String? sdkVersion,
-  }) {
-    sdkVersion ??= '${ExperimentStatus.currentVersion.major}.'
-        '${ExperimentStatus.currentVersion.minor}.0';
-    _versionFile = resourceProvider
-        .getFolder(resourceProvider.convertPath(sdkRoot))
-        .getChildAssumingFile('version');
-    _versionFile.writeAsStringSync(sdkVersion);
-
-    for (MockSdkLibrary library in _LIBRARIES) {
-      var convertedLibrary = library._toProvider(resourceProvider);
-      sdkLibraries.add(convertedLibrary);
+  for (var library in [..._LIBRARIES, ...additionalLibraries]) {
+    for (var unit in library.units) {
+      var file = lib.getChildAssumingFile(unit.path);
+      file.writeAsStringSync(unit.content);
     }
-    for (MockSdkLibrary library in additionalLibraries) {
-      sdkLibraries.add(
-        MockSdkLibrary(
-          library.units.map(
-            (unit) {
-              var pathContext = resourceProvider.pathContext;
-              var absoluteUri = pathContext.join(sdkRoot, 'lib', unit.path);
-              return MockSdkLibraryUnit(
-                unit.uriStr,
-                resourceProvider.convertPath(absoluteUri),
-                unit.content,
-              );
-            },
-          ).toList(),
-        ),
-      );
-    }
-
-    for (MockSdkLibrary library in sdkLibraries) {
-      for (var unit in library.units) {
-        resourceProvider.newFile(unit.path, unit.content);
-        uriMap[unit.uriStr] = unit.path;
-      }
-    }
-
-    {
-      var buffer = StringBuffer();
-      buffer.writeln('const Map<String, LibraryInfo> libraries = const {');
-      for (var e in _librariesDartEntries.entries) {
-        buffer.writeln('"${e.key}": ${e.value},');
-      }
-      for (var library in additionalLibraries) {
-        for (var unit in library.units) {
-          var name = unit.uriStr.substring(5);
-          var libraryInfo = 'const LibraryInfo("${unit.path}")';
-          buffer.writeln('"$name": $libraryInfo,');
-        }
-      }
-      buffer.writeln('};');
-      resourceProvider.newFile(
-        resourceProvider.convertPath(
-          '$sdkRoot/lib/_internal/sdk_library_metadata/lib/libraries.dart',
-        ),
-        buffer.toString(),
-      );
-    }
-
-    resourceProvider.newFile(
-      resourceProvider.convertPath(
-        '$sdkRoot/lib/_internal/allowed_experiments.json',
-      ),
-      json.encode({
-        'version': 1,
-        'experimentSets': {
-          'nullSafety': ['non-nullable']
-        },
-        'sdk': {
-          'default': {'experimentSet': 'nullSafety'}
-        },
-        if (nullSafePackages.isNotEmpty)
-          'packages': {
-            for (var package in nullSafePackages)
-              package: {'experimentSet': 'nullSafety'}
-          }
-      }),
+    librariesBuffer.writeln(
+      '  "${library.name}": const LibraryInfo("${library.path}", '
+      'categories: "${library.categories}"),',
     );
   }
 
+  librariesBuffer.writeln('};');
+  libInternal
+      .getChildAssumingFile('sdk_library_metadata/lib/libraries.dart')
+      .writeAsStringSync('$librariesBuffer');
+
+  libInternal
+      .getChildAssumingFile('allowed_experiments.json')
+      .writeAsStringSync(
+        json.encode({
+          'version': 1,
+          'experimentSets': {
+            'sdkExperiments': <String>[],
+            'nullSafety': ['non-nullable']
+          },
+          'sdk': {
+            'default': {'experimentSet': 'sdkExperiments'},
+          },
+          'packages': <String, Object>{},
+        }),
+      );
+}
+
+@Deprecated('Use createMockSdk() and FolderBasedDartSdk instead.')
+class MockSdk extends FolderBasedDartSdk {
+  /// Optional [additionalLibraries] should have unique URIs, and paths in
+  /// their units are relative (will be put into `sdkRoot/lib`).
+  factory MockSdk({
+    required MemoryResourceProvider resourceProvider,
+    List<MockSdkLibrary> additionalLibraries = const [],
+  }) {
+    var sdkDirectory = resourceProvider.getFolder(
+      resourceProvider.convertPath(sdkRoot),
+    );
+    createMockSdk(
+      resourceProvider: resourceProvider,
+      root: sdkDirectory,
+      additionalLibraries: additionalLibraries,
+    );
+    return MockSdk._(resourceProvider, sdkDirectory);
+  }
+
+  /// Initialize a newly created SDK to represent the Dart SDK installed in the
+  /// [sdkDirectory].
+  MockSdk._(ResourceProvider resourceProvider, Folder sdkDirectory)
+      : super(resourceProvider, sdkDirectory);
+
   @override
-  String? get allowedExperimentsJson {
-    try {
-      var convertedRoot = resourceProvider.convertPath(sdkRoot);
-      return resourceProvider
-          .getFolder(convertedRoot)
-          .getChildAssumingFolder('lib')
-          .getChildAssumingFolder('_internal')
-          .getChildAssumingFile('allowed_experiments.json')
-          .readAsStringSync();
-    } catch (_) {
-      return null;
-    }
+  MemoryResourceProvider get resourceProvider {
+    return super.resourceProvider as MemoryResourceProvider;
   }
 
   @override
-  Version get languageVersion {
-    var sdkVersionStr = _versionFile.readAsStringSync();
-    return languageVersionFromSdkVersion(sdkVersionStr);
-  }
-
-  @override
-  String get sdkVersion => throw UnimplementedError();
-
-  @override
-  List<String> get uris =>
-      sdkLibraries.map((SdkLibrary library) => library.shortName).toList();
-
-  @override
-  Source? fromFileUri(Uri uri) {
-    String filePath = resourceProvider.pathContext.fromUri(uri);
-    if (!filePath.startsWith(resourceProvider.convertPath('$sdkRoot/lib/'))) {
-      return null;
-    }
-    for (SdkLibrary library in sdkLibraries) {
-      String libraryPath = library.path;
-      if (filePath == libraryPath) {
-        try {
-          var file = resourceProvider.getFile(filePath);
-          Uri dartUri = Uri.parse(library.shortName);
-          return file.createSource(dartUri);
-        } catch (exception) {
-          return null;
-        }
-      }
-      String libraryRootPath =
-          resourceProvider.pathContext.dirname(libraryPath) +
-              resourceProvider.pathContext.separator;
-      if (filePath.startsWith(libraryRootPath)) {
-        String pathInLibrary = filePath.substring(libraryRootPath.length);
-        String uriStr = '${library.shortName}/$pathInLibrary';
-        try {
-          var file = resourceProvider.getFile(filePath);
-          Uri dartUri = Uri.parse(uriStr);
-          return file.createSource(dartUri);
-        } catch (exception) {
-          return null;
-        }
-      }
-    }
-    return null;
-  }
-
-  @override
-  SdkLibrary? getSdkLibrary(String dartUri) {
-    for (SdkLibrary library in _LIBRARIES) {
-      if (library.shortName == dartUri) {
+  List<SdkLibraryImpl> get sdkLibraries {
+    return super.sdkLibraries.map((library) {
+      var pathContext = resourceProvider.pathContext;
+      var path = library.path;
+      if (pathContext.isAbsolute(path)) {
         return library;
       }
-    }
-    return null;
-  }
-
-  @override
-  Source? mapDartUri(String dartUri) {
-    var path = uriMap[dartUri];
-    if (path != null) {
-      var file = resourceProvider.getFile(path);
-      Uri uri = Uri(scheme: 'dart', path: dartUri.substring(5));
-      return file.createSource(uri);
-    }
-    // If we reach here then we tried to use a dartUri that's not in the
-    // table above.
-    return null;
+      return SdkLibraryImpl(library.shortName)
+        ..path = pathContext.join(directory.path, 'lib', path)
+        ..category = library.category
+        ..documented = library.isDocumented;
+    }).toList();
   }
 }
 
 class MockSdkLibrary implements SdkLibrary {
+  final String name;
+  final String categories;
   final List<MockSdkLibraryUnit> units;
 
-  MockSdkLibrary(this.units);
+  MockSdkLibrary(this.name, this.units, {this.categories = 'Shared'});
 
   @override
   String get category => throw UnimplementedError();
@@ -1439,27 +1332,12 @@
   String get path => units[0].path;
 
   @override
-  String get shortName => units[0].uriStr;
-
-  MockSdkLibrary _toProvider(MemoryResourceProvider provider) {
-    return MockSdkLibrary(
-      units.map((unit) => unit._toProvider(provider)).toList(),
-    );
-  }
+  String get shortName => 'dart:$name';
 }
 
 class MockSdkLibraryUnit {
-  final String uriStr;
   final String path;
   final String content;
 
-  MockSdkLibraryUnit(this.uriStr, this.path, this.content);
-
-  MockSdkLibraryUnit _toProvider(MemoryResourceProvider provider) {
-    return MockSdkLibraryUnit(
-      uriStr,
-      provider.convertPath(path),
-      content,
-    );
-  }
+  MockSdkLibraryUnit(this.path, this.content);
 }
diff --git a/pkg/analyzer/messages.yaml b/pkg/analyzer/messages.yaml
index 2f331e2..b496a4f 100644
--- a/pkg/analyzer/messages.yaml
+++ b/pkg/analyzer/messages.yaml
@@ -305,14 +305,13 @@
       export 'b.dart' hide C;
       ```
   AMBIGUOUS_EXTENSION_MEMBER_ACCESS:
-    problemMessage: "A member named '{0}' is defined in extensions {1}, and none are more specific."
+    problemMessage: "A member named '{0}' is defined in {1}, and none are more specific."
     correctionMessage: Try using an extension override to specify the extension you want to be chosen.
     hasPublishedDocs: true
     comment: |-
       Parameters:
       0: the name of the member
-      1: the name of the first declaring extension
-      2: the name of the second declaring extension
+      1: the names of the declaring extensions
     documentation: |-
       #### Description
 
@@ -3717,13 +3716,12 @@
       var x = E.m();
       ```
   EXTENSION_CONFLICTING_STATIC_AND_INSTANCE:
-    problemMessage: "Extension '{0}' can't define static member '{1}' and an instance member with the same name."
+    problemMessage: "An extension can't define static member '{0}' and an instance member with the same name."
     correctionMessage: "Try renaming the member to a name that doesn't conflict."
     hasPublishedDocs: true
     comment: |-
       Parameters:
-      0: the name of the extension defining the conflicting member
-      1: the name of the conflicting static member
+      0: the name of the conflicting static member
     documentation: |-
       #### Description
 
@@ -5543,6 +5541,14 @@
         static int zero = 0;
       }
       ```
+  INSTANCE_ACCESS_TO_STATIC_MEMBER_OF_UNNAMED_EXTENSION:
+    sharedName: INSTANCE_ACCESS_TO_STATIC_MEMBER
+    problemMessage: "The static {1} '{0}' can't be accessed through an instance."
+    hasPublishedDocs: true
+    comment: |-
+      Parameters:
+      0: the name of the static member
+      1: the kind of the static member (field, getter, setter, or method)
   INSTANCE_MEMBER_ACCESS_FROM_FACTORY:
     problemMessage: "Instance members can't be accessed from a factory constructor."
     correctionMessage: Try removing the reference to the instance member.
@@ -15207,7 +15213,7 @@
       void f() => someFunction();
       ```
   INVALID_VISIBLE_FOR_OVERRIDING_ANNOTATION:
-    problemMessage: "The declaration '{0}' is annotated with 'visibleForOverriding'. Because '{0}' isn't an interface member that could be overridden, the annotation is meaningless."
+    problemMessage: "The annotation 'visibleForOverriding' can only be applied to a public instance member that can be overridden."
     hasPublishedDocs: true
     comment: No parameters.
     documentation: |-
diff --git a/pkg/analyzer/test/generated/sdk_test.dart b/pkg/analyzer/test/generated/sdk_test.dart
index a5b3fef..c274178 100644
--- a/pkg/analyzer/test/generated/sdk_test.dart
+++ b/pkg/analyzer/test/generated/sdk_test.dart
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/src/generated/sdk.dart';
-import 'package:analyzer/src/test_utilities/mock_sdk.dart';
 import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
@@ -22,7 +21,7 @@
     expect(manager.anySdk, isNull);
 
     SdkDescription description = SdkDescription('/c/d');
-    DartSdk sdk = MockSdk(resourceProvider: resourceProvider);
+    DartSdk sdk = _DartSdkMock();
     manager.getSdk(description, () => sdk);
 
     expect(manager.anySdk, same(sdk));
@@ -32,12 +31,12 @@
     DartSdkManager manager = DartSdkManager('/a/b/c');
 
     SdkDescription description1 = SdkDescription('/c/d');
-    DartSdk sdk1 = MockSdk(resourceProvider: resourceProvider);
+    DartSdk sdk1 = _DartSdkMock();
     DartSdk result1 = manager.getSdk(description1, () => sdk1);
     expect(result1, same(sdk1));
 
     SdkDescription description2 = SdkDescription('/e/f');
-    DartSdk sdk2 = MockSdk(resourceProvider: resourceProvider);
+    DartSdk sdk2 = _DartSdkMock();
     DartSdk result2 = manager.getSdk(description2, () => sdk2);
     expect(result2, same(sdk2));
 
@@ -49,7 +48,7 @@
     DartSdkManager manager = DartSdkManager('/a/b/c');
 
     SdkDescription description = SdkDescription('/c/d');
-    DartSdk sdk = MockSdk(resourceProvider: resourceProvider);
+    DartSdk sdk = _DartSdkMock();
     DartSdk result = manager.getSdk(description, () => sdk);
     expect(result, same(sdk));
 
@@ -82,3 +81,8 @@
     expect(left == right, isTrue);
   }
 }
+
+class _DartSdkMock implements DartSdk {
+  @override
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+}
diff --git a/pkg/analyzer/test/src/dart/analysis/analysis_context_collection_test.dart b/pkg/analyzer/test/src/dart/analysis/analysis_context_collection_test.dart
index d532b29..e8c8c62 100644
--- a/pkg/analyzer/test/src/dart/analysis/analysis_context_collection_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/analysis_context_collection_test.dart
@@ -2,6 +2,7 @@
 // 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/file_system.dart';
 import 'package:analyzer/src/dart/analysis/analysis_context_collection.dart';
 import 'package:analyzer/src/test_utilities/mock_sdk.dart';
 import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
@@ -19,8 +20,13 @@
 
 @reflectiveTest
 class AnalysisContextCollectionTest with ResourceProviderMixin {
+  Folder get sdkRoot => newFolder('/sdk');
+
   void setUp() {
-    MockSdk(resourceProvider: resourceProvider);
+    createMockSdk(
+      resourceProvider: resourceProvider,
+      root: sdkRoot,
+    );
     registerLintRules();
   }
 
@@ -168,7 +174,7 @@
     return AnalysisContextCollectionImpl(
       resourceProvider: resourceProvider,
       includedPaths: includedPaths,
-      sdkPath: convertPath(sdkRoot),
+      sdkPath: sdkRoot.path,
     );
   }
 }
diff --git a/pkg/analyzer/test/src/dart/analysis/base.dart b/pkg/analyzer/test/src/dart/analysis/base.dart
index 536922f..7f3d1cb 100644
--- a/pkg/analyzer/test/src/dart/analysis/base.dart
+++ b/pkg/analyzer/test/src/dart/analysis/base.dart
@@ -10,6 +10,7 @@
 import 'package:analyzer/src/dart/analysis/driver.dart';
 import 'package:analyzer/src/dart/analysis/performance_logger.dart';
 import 'package:analyzer/src/dart/analysis/status.dart';
+import 'package:analyzer/src/dart/sdk/sdk.dart';
 import 'package:analyzer/src/generated/engine.dart' show AnalysisOptionsImpl;
 import 'package:analyzer/src/generated/sdk.dart';
 import 'package:analyzer/src/generated/source.dart';
@@ -127,7 +128,13 @@
   }
 
   void setUp() {
-    sdk = MockSdk(resourceProvider: resourceProvider);
+    var sdkRoot = newFolder('/sdk');
+    createMockSdk(
+      resourceProvider: resourceProvider,
+      root: sdkRoot,
+    );
+    sdk = FolderBasedDartSdk(resourceProvider, sdkRoot);
+
     testProject = convertPath('/test');
     testFile = convertPath('/test/lib/test.dart');
     logger = PerformanceLog(logBuffer);
diff --git a/pkg/analyzer/test/src/dart/analysis/context_builder_test.dart b/pkg/analyzer/test/src/dart/analysis/context_builder_test.dart
index 44a7634..17144c0 100644
--- a/pkg/analyzer/test/src/dart/analysis/context_builder_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/context_builder_test.dart
@@ -35,6 +35,8 @@
   late final ContextBuilderImpl contextBuilder;
   late final ContextRoot contextRoot;
 
+  Folder get sdkRoot => newFolder('/sdk');
+
   void assertEquals(DeclaredVariables actual, DeclaredVariables expected) {
     Iterable<String> actualNames = actual.variableNames;
     Iterable<String> expectedNames = expected.variableNames;
@@ -45,6 +47,11 @@
   }
 
   void setUp() {
+    createMockSdk(
+      resourceProvider: resourceProvider,
+      root: sdkRoot,
+    );
+
     var folder = newFolder('/home/test');
     contextBuilder = ContextBuilderImpl(resourceProvider: resourceProvider);
     var workspace = BasicWorkspace.find(resourceProvider, {}, folder.path);
@@ -52,8 +59,6 @@
   }
 
   void test_analysisOptions_invalid() {
-    MockSdk(resourceProvider: resourceProvider);
-
     var projectPath = convertPath('/home/test');
     newAnalysisOptionsYamlFile(projectPath, content: ';');
 
@@ -63,8 +68,6 @@
   }
 
   void test_analysisOptions_languageOptions() {
-    MockSdk(resourceProvider: resourceProvider);
-
     var projectPath = convertPath('/home/test');
     newAnalysisOptionsYamlFile(
       projectPath,
@@ -82,8 +85,6 @@
   }
 
   void test_analysisOptions_sdkVersionConstraint_hasPubspec_hasSdk() {
-    MockSdk(resourceProvider: resourceProvider);
-
     var projectPath = convertPath('/home/test');
     newPubspecYamlFile(projectPath, '''
 environment:
@@ -96,8 +97,6 @@
   }
 
   void test_analysisOptions_sdkVersionConstraint_noPubspec() {
-    MockSdk(resourceProvider: resourceProvider);
-
     var projectPath = convertPath('/home/test');
     newFile('$projectPath/lib/a.dart');
 
@@ -107,13 +106,12 @@
   }
 
   test_createContext_declaredVariables() {
-    MockSdk(resourceProvider: resourceProvider);
     DeclaredVariables declaredVariables =
         DeclaredVariables.fromMap({'foo': 'true'});
     var context = contextBuilder.createContext(
       contextRoot: contextRoot,
       declaredVariables: declaredVariables,
-      sdkPath: resourceProvider.convertPath(sdkRoot),
+      sdkPath: sdkRoot.path,
     );
     expect(context.analysisOptions, isNotNull);
     expect(context.contextRoot, contextRoot);
@@ -123,54 +121,51 @@
   test_createContext_declaredVariables_sdkPath() {
     DeclaredVariables declaredVariables =
         DeclaredVariables.fromMap({'bar': 'true'});
-    MockSdk sdk = MockSdk(resourceProvider: resourceProvider);
     var context = contextBuilder.createContext(
       contextRoot: contextRoot,
       declaredVariables: declaredVariables,
-      sdkPath: resourceProvider.convertPath(sdkRoot),
+      sdkPath: sdkRoot.path,
     );
     expect(context.analysisOptions, isNotNull);
     expect(context.contextRoot, contextRoot);
     assertEquals(context.driver.declaredVariables, declaredVariables);
-    expect(context.driver.sourceFactory.dartSdk!.mapDartUri('dart:core'),
-        sdk.mapDartUri('dart:core'));
+    expect(
+      context.driver.sourceFactory.dartSdk!.mapDartUri('dart:core')!.fullName,
+      sdkRoot.getChildAssumingFile('lib/core/core.dart').path,
+    );
   }
 
   test_createContext_defaults() {
-    MockSdk(resourceProvider: resourceProvider);
     AnalysisContext context = contextBuilder.createContext(
       contextRoot: contextRoot,
-      sdkPath: resourceProvider.convertPath(sdkRoot),
+      sdkPath: sdkRoot.path,
     );
     expect(context.analysisOptions, isNotNull);
     expect(context.contextRoot, contextRoot);
   }
 
   test_createContext_sdkPath() {
-    MockSdk sdk = MockSdk(resourceProvider: resourceProvider);
     var context = contextBuilder.createContext(
       contextRoot: contextRoot,
-      sdkPath: resourceProvider.convertPath(sdkRoot),
+      sdkPath: sdkRoot.path,
     );
     expect(context.analysisOptions, isNotNull);
     expect(context.contextRoot, contextRoot);
-    expect(context.driver.sourceFactory.dartSdk!.mapDartUri('dart:core'),
-        sdk.mapDartUri('dart:core'));
+    expect(
+      context.driver.sourceFactory.dartSdk!.mapDartUri('dart:core')!.fullName,
+      sdkRoot.getChildAssumingFile('lib/core/core.dart').path,
+    );
   }
 
   test_createContext_sdkRoot() {
-    MockSdk(resourceProvider: resourceProvider);
     var context = contextBuilder.createContext(
-        contextRoot: contextRoot,
-        sdkPath: resourceProvider.convertPath(sdkRoot));
+        contextRoot: contextRoot, sdkPath: sdkRoot.path);
     expect(context.analysisOptions, isNotNull);
     expect(context.contextRoot, contextRoot);
-    expect(context.sdkRoot?.path, resourceProvider.convertPath(sdkRoot));
+    expect(context.sdkRoot, sdkRoot);
   }
 
   void test_sourceFactory_bazelWorkspace() {
-    MockSdk(resourceProvider: resourceProvider);
-
     var projectPath = convertPath('/workspace/my/module');
     newFile('/workspace/WORKSPACE');
     newFolder('/workspace/bazel-bin');
@@ -190,8 +185,6 @@
   }
 
   void test_sourceFactory_pubWorkspace() {
-    MockSdk(resourceProvider: resourceProvider);
-
     var projectPath = convertPath('/home/my');
     newFile('/home/my/pubspec.yaml');
 
@@ -218,7 +211,7 @@
       resourceProvider: resourceProvider,
     ).createContext(
       contextRoot: roots.single,
-      sdkPath: convertPath(sdkRoot),
+      sdkPath: sdkRoot.path,
     );
   }
 
diff --git a/pkg/analyzer/test/src/dart/analysis/driver_test.dart b/pkg/analyzer/test/src/dart/analysis/driver_test.dart
index f47fff4..59cdc3b 100644
--- a/pkg/analyzer/test/src/dart/analysis/driver_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/driver_test.dart
@@ -7,6 +7,7 @@
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/error/error.dart';
+import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/src/context/packages.dart';
 import 'package:analyzer/src/dart/analysis/byte_store.dart';
 import 'package:analyzer/src/dart/analysis/driver.dart';
@@ -15,10 +16,9 @@
 import 'package:analyzer/src/dart/ast/extensions.dart';
 import 'package:analyzer/src/dart/constant/evaluation.dart';
 import 'package:analyzer/src/dart/element/element.dart';
+import 'package:analyzer/src/dart/sdk/sdk.dart';
 import 'package:analyzer/src/error/codes.dart';
-import 'package:analyzer/src/file_system/file_system.dart';
 import 'package:analyzer/src/generated/engine.dart' show AnalysisOptionsImpl;
-import 'package:analyzer/src/generated/sdk.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/summary/idl.dart';
 import 'package:analyzer/src/test_utilities/mock_sdk.dart';
@@ -51,7 +51,6 @@
 
 @reflectiveTest
 class AnalysisDriverSchedulerTest with ResourceProviderMixin {
-  late DartSdk sdk;
   final ByteStore byteStore = MemoryByteStore();
 
   final StringBuffer logBuffer = StringBuffer();
@@ -61,8 +60,10 @@
 
   final List<AnalysisResultWithErrors> allResults = [];
 
+  Folder get sdkRoot => newFolder('/sdk');
+
   AnalysisDriver newDriver() {
-    sdk = MockSdk(resourceProvider: resourceProvider);
+    var sdk = FolderBasedDartSdk(resourceProvider, sdkRoot);
     AnalysisDriver driver = AnalysisDriver.tmp1(
       scheduler: scheduler,
       logger: logger,
@@ -83,7 +84,10 @@
   }
 
   void setUp() {
-    sdk = MockSdk(resourceProvider: resourceProvider);
+    createMockSdk(
+      resourceProvider: resourceProvider,
+      root: sdkRoot,
+    );
     logger = PerformanceLog(logBuffer);
     scheduler = AnalysisDriverScheduler(logger);
     scheduler.start();
diff --git a/pkg/analyzer/test/src/dart/analysis/feature_set_provider_test.dart b/pkg/analyzer/test/src/dart/analysis/feature_set_provider_test.dart
index 86df8d9..dfcbe51 100644
--- a/pkg/analyzer/test/src/dart/analysis/feature_set_provider_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/feature_set_provider_test.dart
@@ -9,6 +9,7 @@
 import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer/src/dart/analysis/experiments_impl.dart';
 import 'package:analyzer/src/dart/analysis/feature_set_provider.dart';
+import 'package:analyzer/src/dart/sdk/sdk.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/source/package_map_resolver.dart';
 import 'package:analyzer/src/test_utilities/mock_sdk.dart';
@@ -25,14 +26,19 @@
 
 @reflectiveTest
 class FeatureSetProviderTest with ResourceProviderMixin {
-  late final MockSdk mockSdk;
   late SourceFactory sourceFactory;
   late FeatureSetProvider provider;
 
+  Folder get sdkRoot => newFolder('/sdk');
+
   void setUp() {
     newFile('/test/lib/test.dart', content: '');
 
-    mockSdk = MockSdk(resourceProvider: resourceProvider);
+    createMockSdk(
+      resourceProvider: resourceProvider,
+      root: sdkRoot,
+    );
+
     _createSourceFactory();
   }
 
@@ -430,7 +436,9 @@
       resolvers.add(packageUriResolver);
     }
     resolvers.addAll([
-      DartUriResolver(mockSdk),
+      DartUriResolver(
+        FolderBasedDartSdk(resourceProvider, sdkRoot),
+      ),
       ResourceUriResolver(resourceProvider),
     ]);
     sourceFactory = SourceFactoryImpl(resolvers);
diff --git a/pkg/analyzer/test/src/dart/analysis/file_state_test.dart b/pkg/analyzer/test/src/dart/analysis/file_state_test.dart
index a4da5db..b298989 100644
--- a/pkg/analyzer/test/src/dart/analysis/file_state_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/file_state_test.dart
@@ -16,6 +16,7 @@
 import 'package:analyzer/src/dart/analysis/file_state.dart';
 import 'package:analyzer/src/dart/analysis/library_graph.dart';
 import 'package:analyzer/src/dart/analysis/performance_logger.dart';
+import 'package:analyzer/src/dart/sdk/sdk.dart';
 import 'package:analyzer/src/generated/engine.dart'
     show AnalysisOptions, AnalysisOptionsImpl;
 import 'package:analyzer/src/generated/source.dart';
@@ -37,8 +38,6 @@
 
 @reflectiveTest
 class FileSystemStateTest with ResourceProviderMixin {
-  late final MockSdk sdk;
-
   final ByteStore byteStore = MemoryByteStore();
   final FileContentOverlay contentOverlay = FileContentOverlay();
 
@@ -52,7 +51,13 @@
 
   void setUp() {
     logger = PerformanceLog(logBuffer);
-    sdk = MockSdk(resourceProvider: resourceProvider);
+
+    var sdkRoot = newFolder('/sdk');
+    createMockSdk(
+      resourceProvider: resourceProvider,
+      root: sdkRoot,
+    );
+    var sdk = FolderBasedDartSdk(resourceProvider, sdkRoot);
 
     var packageMap = <String, List<Folder>>{
       'aaa': [getFolder('/aaa/lib')],
diff --git a/pkg/analyzer/test/src/dart/analysis/session_test.dart b/pkg/analyzer/test/src/dart/analysis/session_test.dart
index a188ec0..564c216 100644
--- a/pkg/analyzer/test/src/dart/analysis/session_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/session_test.dart
@@ -141,7 +141,11 @@
   late final String testPath;
 
   void setUp() {
-    MockSdk(resourceProvider: resourceProvider);
+    var sdkRoot = newFolder('/sdk');
+    createMockSdk(
+      resourceProvider: resourceProvider,
+      root: sdkRoot,
+    );
 
     testContextPath = newFolder('/home/test').path;
     aaaContextPath = newFolder('/home/aaa').path;
@@ -154,7 +158,7 @@
     contextCollection = AnalysisContextCollectionImpl(
       includedPaths: [testContextPath, aaaContextPath, bbbContextPath],
       resourceProvider: resourceProvider,
-      sdkPath: convertPath(sdkRoot),
+      sdkPath: sdkRoot.path,
     );
     context = contextCollection.contextFor(testContextPath);
     session = context.currentSession as AnalysisSessionImpl;
diff --git a/pkg/analyzer/test/src/dart/analysis/uri_converter_test.dart b/pkg/analyzer/test/src/dart/analysis/uri_converter_test.dart
index f8d8c23..2b229fc 100644
--- a/pkg/analyzer/test/src/dart/analysis/uri_converter_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/uri_converter_test.dart
@@ -8,6 +8,7 @@
 import 'package:analyzer/src/dart/analysis/driver.dart';
 import 'package:analyzer/src/dart/analysis/driver_based_analysis_context.dart';
 import 'package:analyzer/src/dart/analysis/uri_converter.dart';
+import 'package:analyzer/src/dart/sdk/sdk.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/source/package_map_resolver.dart';
 import 'package:analyzer/src/test_utilities/mock_sdk.dart';
@@ -30,8 +31,16 @@
     Folder barFolder = newFolder('/packages/bar/lib');
     Folder fooFolder = newFolder('/packages/foo/lib');
 
+    var sdkRoot = newFolder('/sdk');
+    createMockSdk(
+      resourceProvider: resourceProvider,
+      root: sdkRoot,
+    );
+
     SourceFactory sourceFactory = SourceFactory([
-      DartUriResolver(MockSdk(resourceProvider: resourceProvider)),
+      DartUriResolver(
+        FolderBasedDartSdk(resourceProvider, sdkRoot),
+      ),
       PackageMapUriResolver(resourceProvider, {
         'foo': [fooFolder],
         'bar': [barFolder],
diff --git a/pkg/analyzer/test/src/dart/constant/evaluation_test.dart b/pkg/analyzer/test/src/dart/constant/evaluation_test.dart
index d756acf..24b6f96 100644
--- a/pkg/analyzer/test/src/dart/constant/evaluation_test.dart
+++ b/pkg/analyzer/test/src/dart/constant/evaluation_test.dart
@@ -169,6 +169,18 @@
     );
   }
 
+  test_identical_functionReference_explicitTypeArgs_sameElement_runtimeTypeEquality() async {
+    await resolveTestCode('''
+import 'dart:async';
+void foo<T>(T a) {}
+const g = identical(foo<Object>, foo<FutureOr<Object>>);
+''');
+    expect(
+      _evaluateConstant('g'),
+      _boolValue(true),
+    );
+  }
+
   test_identical_functionReference_implicitTypeArgs_differentTypes() async {
     await resolveTestCode('''
 void foo<T>(T a) {}
diff --git a/pkg/analyzer/test/src/dart/micro/file_resolution.dart b/pkg/analyzer/test/src/dart/micro/file_resolution.dart
index 3c85527..5836465 100644
--- a/pkg/analyzer/test/src/dart/micro/file_resolution.dart
+++ b/pkg/analyzer/test/src/dart/micro/file_resolution.dart
@@ -5,9 +5,11 @@
 import 'dart:convert';
 
 import 'package:analyzer/dart/analysis/results.dart';
+import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/src/dart/analysis/performance_logger.dart';
 import 'package:analyzer/src/dart/micro/cider_byte_store.dart';
 import 'package:analyzer/src/dart/micro/resolve_file.dart';
+import 'package:analyzer/src/dart/sdk/sdk.dart';
 import 'package:analyzer/src/test_utilities/find_element.dart';
 import 'package:analyzer/src/test_utilities/find_node.dart';
 import 'package:analyzer/src/test_utilities/mock_sdk.dart';
@@ -27,10 +29,11 @@
 
   final StringBuffer logBuffer = StringBuffer();
   late PerformanceLog logger;
-  late MockSdk sdk;
 
   late FileResolver fileResolver;
 
+  Folder get sdkRoot => newFolder('/sdk');
+
   @override
   void addTestFile(String content) {
     newFile(_testFile, content: content);
@@ -50,7 +53,10 @@
       logger: logger,
       resourceProvider: resourceProvider,
       byteStore: byteStore,
-      sourceFactory: workspace.createSourceFactory(sdk, null),
+      sourceFactory: workspace.createSourceFactory(
+        FolderBasedDartSdk(resourceProvider, sdkRoot),
+        null,
+      ),
       getFileDigest: (String path) => _getDigest(path),
       workspace: workspace,
       prefetchFiles: null,
@@ -82,7 +88,10 @@
     registerLintRules();
 
     logger = PerformanceLog(logBuffer);
-    sdk = MockSdk(resourceProvider: resourceProvider);
+    createMockSdk(
+      resourceProvider: resourceProvider,
+      root: sdkRoot,
+    );
 
     newFile('/workspace/WORKSPACE', content: '');
     newFile('/workspace/dart/test/BUILD', content: '');
diff --git a/pkg/analyzer/test/src/dart/resolution/context_collection_resolution.dart b/pkg/analyzer/test/src/dart/resolution/context_collection_resolution.dart
index db0e26c..814951e 100644
--- a/pkg/analyzer/test/src/dart/resolution/context_collection_resolution.dart
+++ b/pkg/analyzer/test/src/dart/resolution/context_collection_resolution.dart
@@ -138,6 +138,8 @@
 
   bool get retainDataForTesting => false;
 
+  Folder get sdkRoot => newFolder('/sdk');
+
   void assertBasicWorkspaceFor(String path) {
     var workspace = contextFor(path).contextRoot.workspace;
     expect(workspace, TypeMatcher<BasicWorkspace>());
@@ -200,8 +202,9 @@
       _lintRulesAreRegistered = true;
     }
 
-    MockSdk(
+    createMockSdk(
       resourceProvider: resourceProvider,
+      root: sdkRoot,
       additionalLibraries: additionalMockSdkLibraries,
     );
   }
@@ -234,7 +237,7 @@
       includedPaths: collectionIncludedPaths.map(convertPath).toList(),
       resourceProvider: resourceProvider,
       retainDataForTesting: retainDataForTesting,
-      sdkPath: convertPath('/sdk'),
+      sdkPath: sdkRoot.path,
     );
 
     verifyCreatedCollection();
diff --git a/pkg/analyzer/test/src/dart/resolution/extension_method_test.dart b/pkg/analyzer/test/src/dart/resolution/extension_method_test.dart
index 73f39f6..8cc8ab5 100644
--- a/pkg/analyzer/test/src/dart/resolution/extension_method_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/extension_method_test.dart
@@ -71,8 +71,8 @@
     extends PubPackageResolutionTest with WithoutNullSafetyMixin {
   @override
   List<MockSdkLibrary> get additionalMockSdkLibraries => [
-        MockSdkLibrary([
-          MockSdkLibraryUnit('dart:test1', 'test1/test1.dart', r'''
+        MockSdkLibrary('test1', [
+          MockSdkLibraryUnit('test1/test1.dart', r'''
 extension E on Object {
   int get a => 1;
 }
@@ -80,8 +80,8 @@
 class A {}
 '''),
         ]),
-        MockSdkLibrary([
-          MockSdkLibraryUnit('dart:test2', 'test2/test2.dart', r'''
+        MockSdkLibrary('test2', [
+          MockSdkLibraryUnit('test2/test2.dart', r'''
 extension E on Object {
   int get a => 1;
 }
diff --git a/pkg/analyzer/test/src/dart/resolution/function_reference_test.dart b/pkg/analyzer/test/src/dart/resolution/function_reference_test.dart
index 0238785..1a2adbb 100644
--- a/pkg/analyzer/test/src/dart/resolution/function_reference_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/function_reference_test.dart
@@ -444,8 +444,11 @@
   static void m<T>(T t) {}
 }
 ''', [
-      error(CompileTimeErrorCode.INSTANCE_ACCESS_TO_STATIC_MEMBER, 40, 1,
-          correctionContains: "extension '<unnamed>'"),
+      error(
+          CompileTimeErrorCode
+              .INSTANCE_ACCESS_TO_STATIC_MEMBER_OF_UNNAMED_EXTENSION,
+          40,
+          1),
     ]);
 
     assertFunctionReference(findNode.functionReference('foo.m<int>;'),
diff --git a/pkg/analyzer/test/src/dart/resolution/language_version_test.dart b/pkg/analyzer/test/src/dart/resolution/language_version_test.dart
index d0681f0..a9868b6 100644
--- a/pkg/analyzer/test/src/dart/resolution/language_version_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/language_version_test.dart
@@ -4,7 +4,6 @@
 
 import 'package:analyzer/src/dart/error/syntactic_errors.dart';
 import 'package:analyzer/src/error/codes.dart';
-import 'package:analyzer/src/test_utilities/mock_sdk.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import 'context_collection_resolution.dart';
@@ -258,7 +257,7 @@
 
   void _newSdkExperimentsFile(String content) {
     newFile(
-      '$sdkRoot/lib/_internal/allowed_experiments.json',
+      '${sdkRoot.path}/lib/_internal/allowed_experiments.json',
       content: content,
     );
   }
diff --git a/pkg/analyzer/test/src/diagnostics/ambiguous_extension_member_access_test.dart b/pkg/analyzer/test/src/diagnostics/ambiguous_extension_member_access_test.dart
index 6355201..4c7e2f7 100644
--- a/pkg/analyzer/test/src/diagnostics/ambiguous_extension_member_access_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/ambiguous_extension_member_access_test.dart
@@ -106,7 +106,7 @@
 }
 ''', [
       error(CompileTimeErrorCode.AMBIGUOUS_EXTENSION_MEMBER_ACCESS, 129, 3,
-          messageContains: "'E1' and 'E2'"),
+          messageContains: "in extension 'E1' and extension 'E2',"),
     ]);
   }
 
@@ -131,7 +131,7 @@
 }
 ''', [
       error(CompileTimeErrorCode.AMBIGUOUS_EXTENSION_MEMBER_ACCESS, 129, 3,
-          messageContains: "'E1' and 'E2'"),
+          messageContains: "in extension 'E1' and extension 'E2',"),
     ]);
   }
 
@@ -177,7 +177,7 @@
 }
 ''', [
       error(CompileTimeErrorCode.AMBIGUOUS_EXTENSION_MEMBER_ACCESS, 129, 3,
-          messageContains: "'E1' and 'E2'"),
+          messageContains: "in extension 'E1' and extension 'E2',"),
     ]);
   }
 
@@ -192,7 +192,8 @@
 }
 ''', [
       error(CompileTimeErrorCode.AMBIGUOUS_EXTENSION_MEMBER_ACCESS, 167, 3,
-          messageContains: "'E1', 'E2', and 'E3'"),
+          messageContains:
+              "in extension 'E1', extension 'E2', and extension 'E3',"),
     ]);
   }
 
@@ -346,4 +347,31 @@
       assertTypeDynamic(access);
     }
   }
+
+  test_unnamed_extensions() async {
+    await assertErrorsInCode('''
+class A {}
+class B {}
+class C extends A implements B {}
+
+extension on List<A> {
+  int call() => 0;
+}
+
+extension on List<B> {
+  int call() => 0;
+}
+
+int f(List<C> x) => x();
+
+// Additional calls to avoid UNUSED_ELEMENT
+int g(List<A> x) => x();
+int h(List<B> x) => x();
+''', [
+      error(CompileTimeErrorCode.AMBIGUOUS_EXTENSION_MEMBER_ACCESS, 167, 1,
+          messageContains:
+              "in unnamed extension on 'List<A>' and unnamed extension on "
+              "'List<B>',"),
+    ]);
+  }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/extension_conflicting_static_and_instance_test.dart b/pkg/analyzer/test/src/diagnostics/extension_conflicting_static_and_instance_test.dart
index b85b744..1c98aba 100644
--- a/pkg/analyzer/test/src/diagnostics/extension_conflicting_static_and_instance_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/extension_conflicting_static_and_instance_test.dart
@@ -94,7 +94,7 @@
 }
 ''', [
       error(HintCode.UNUSED_FIELD, 35, 3),
-      error(_errorCode, 35, 3, messageContains: "Extension '<unnamed>'"),
+      error(_errorCode, 35, 3),
       error(HintCode.UNUSED_ELEMENT, 54, 3),
     ]);
   }
@@ -106,7 +106,7 @@
   void foo() {}
 }
 ''', [
-      error(_errorCode, 37, 3, messageContains: "Extension 'E'"),
+      error(_errorCode, 37, 3),
     ]);
   }
 
@@ -128,7 +128,7 @@
   int get foo => 0;
 }
 ''', [
-      error(_errorCode, 41, 3, messageContains: "Extension 'E'"),
+      error(_errorCode, 41, 3),
     ]);
   }
 
@@ -140,7 +140,7 @@
 }
 ''', [
       error(HintCode.UNUSED_ELEMENT, 39, 3),
-      error(_errorCode, 39, 3, messageContains: "Extension '<unnamed>'"),
+      error(_errorCode, 39, 3),
       error(HintCode.UNUSED_ELEMENT, 59, 3),
     ]);
   }
diff --git a/pkg/analyzer/test/src/diagnostics/instance_access_to_static_member_test.dart b/pkg/analyzer/test/src/diagnostics/instance_access_to_static_member_test.dart
index 1142a36..620441c 100644
--- a/pkg/analyzer/test/src/diagnostics/instance_access_to_static_member_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/instance_access_to_static_member_test.dart
@@ -56,6 +56,31 @@
     );
   }
 
+  test_extension_getter_unnamed() async {
+    await assertErrorsInCode('''
+class C {}
+
+extension on C {
+  static int get a => 0;
+}
+
+C g(C c) => C();
+f(C c) {
+  g(c).a;
+}
+''', [
+      error(
+          CompileTimeErrorCode
+              .INSTANCE_ACCESS_TO_STATIC_MEMBER_OF_UNNAMED_EXTENSION,
+          90,
+          1),
+    ]);
+    assertElement(
+      findNode.simple('a;'),
+      findElement.getter('a'),
+    );
+  }
+
   test_extension_method() async {
     await assertErrorsInCode('''
 class C {}
@@ -89,8 +114,11 @@
   c.a();
 }
 ''', [
-      error(CompileTimeErrorCode.INSTANCE_ACCESS_TO_STATIC_MEMBER, 66, 1,
-          correctionContains: "extension '<unnamed>'"),
+      error(
+          CompileTimeErrorCode
+              .INSTANCE_ACCESS_TO_STATIC_MEMBER_OF_UNNAMED_EXTENSION,
+          66,
+          1),
     ]);
     assertElement(
       findNode.methodInvocation('a();'),
@@ -187,8 +215,11 @@
   a.m<int>;
 }
 ''', [
-      error(CompileTimeErrorCode.INSTANCE_ACCESS_TO_STATIC_MEMBER, 55, 1,
-          correctionContains: "extension '<unnamed>'"),
+      error(
+          CompileTimeErrorCode
+              .INSTANCE_ACCESS_TO_STATIC_MEMBER_OF_UNNAMED_EXTENSION,
+          55,
+          1),
     ]);
   }
 
diff --git a/pkg/analyzer/test/src/diagnostics/invalid_visible_for_overriding_annotation_test.dart b/pkg/analyzer/test/src/diagnostics/invalid_visible_for_overriding_annotation_test.dart
index 9fa9832..ee5acb0 100644
--- a/pkg/analyzer/test/src/diagnostics/invalid_visible_for_overriding_annotation_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/invalid_visible_for_overriding_annotation_test.dart
@@ -27,10 +27,7 @@
 import 'package:meta/meta.dart';
 @visibleForOverriding
 class C {}
-''', [
-      error(HintCode.INVALID_VISIBLE_FOR_OVERRIDING_ANNOTATION, 33, 21,
-          messageContains: "The declaration 'C'")
-    ]);
+''', [error(HintCode.INVALID_VISIBLE_FOR_OVERRIDING_ANNOTATION, 33, 21)]);
   }
 
   test_invalid_constructor() async {
@@ -50,10 +47,7 @@
 import 'package:meta/meta.dart';
 @visibleForOverriding
 extension on double {}
-''', [
-      error(HintCode.INVALID_VISIBLE_FOR_OVERRIDING_ANNOTATION, 33, 21,
-          messageContains: "The declaration '<unnamed>'")
-    ]);
+''', [error(HintCode.INVALID_VISIBLE_FOR_OVERRIDING_ANNOTATION, 33, 21)]);
   }
 
   test_invalid_extensionMember() async {
@@ -104,7 +98,6 @@
 @visibleForOverriding var a = 1, b;
 ''', [
       error(HintCode.INVALID_VISIBLE_FOR_OVERRIDING_ANNOTATION, 33, 21),
-      error(HintCode.INVALID_VISIBLE_FOR_OVERRIDING_ANNOTATION, 33, 21),
     ]);
   }
 
diff --git a/pkg/analyzer/test/src/diagnostics/unused_result_test.dart b/pkg/analyzer/test/src/diagnostics/unused_result_test.dart
index 250479b..9d42982 100644
--- a/pkg/analyzer/test/src/diagnostics/unused_result_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/unused_result_test.dart
@@ -611,6 +611,22 @@
 ''');
   }
 
+  /// https://github.com/dart-lang/sdk/issues/47473
+  test_topLevelFunction_result_assigned_if() async {
+    await assertNoErrorsInCode(r'''
+import 'package:meta/meta.dart';
+
+@useResult
+String foo() => '';
+
+String f(bool b) {
+  var f = '';
+  if (b) f = foo();
+  return f;
+}
+''');
+  }
+
   test_topLevelFunction_result_optionNamedParam_unassigned_parameterDefined() async {
     await assertNoErrorsInCode(r'''
 import 'package:meta/meta.dart';
diff --git a/pkg/analyzer/test/src/services/available_declarations_test.dart b/pkg/analyzer/test/src/services/available_declarations_test.dart
index 5c4c599..17908dd 100644
--- a/pkg/analyzer/test/src/services/available_declarations_test.dart
+++ b/pkg/analyzer/test/src/services/available_declarations_test.dart
@@ -36,6 +36,8 @@
   String get analysisOptionsPath =>
       convertPath('/home/test/analysis_options.yaml');
 
+  Folder get sdkRoot => newFolder('/sdk');
+
   void addDotPackagesDependency(String path, String name, String rootPath) {
     var packagesFile = getFile(path);
 
@@ -68,7 +70,7 @@
     analysisContextCollection = AnalysisContextCollectionImpl(
       includedPaths: [convertPath('/home')],
       resourceProvider: resourceProvider,
-      sdkPath: convertPath('/sdk'),
+      sdkPath: sdkRoot.path,
     );
 
     var testPath = convertPath('/home/test');
@@ -99,7 +101,10 @@
   }
 
   setUp() {
-    MockSdk(resourceProvider: resourceProvider);
+    createMockSdk(
+      resourceProvider: resourceProvider,
+      root: sdkRoot,
+    );
 
     newFolder('/home/test');
     newDotPackagesFile('/home/test', content: '''
diff --git a/pkg/analyzer/test/src/source/source_resource_test.dart b/pkg/analyzer/test/src/source/source_resource_test.dart
index 0dc63d4..fb3b7b8a 100644
--- a/pkg/analyzer/test/src/source/source_resource_test.dart
+++ b/pkg/analyzer/test/src/source/source_resource_test.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/file_system/file_system.dart';
+import 'package:analyzer/src/dart/sdk/sdk.dart';
 import 'package:analyzer/src/generated/java_engine_io.dart';
 import 'package:analyzer/src/generated/sdk.dart';
 import 'package:analyzer/src/generated/source.dart';
@@ -162,6 +163,11 @@
   }
 
   DartSdk _createSdk() {
-    return MockSdk(resourceProvider: resourceProvider);
+    var sdkRoot = newFolder('/sdk');
+    createMockSdk(
+      resourceProvider: resourceProvider,
+      root: sdkRoot,
+    );
+    return FolderBasedDartSdk(resourceProvider, sdkRoot);
   }
 }
diff --git a/pkg/analyzer/test/src/summary/resynthesize_ast2_test.dart b/pkg/analyzer/test/src/summary/resynthesize_ast2_test.dart
index bc041e1..b1f2a75 100644
--- a/pkg/analyzer/test/src/summary/resynthesize_ast2_test.dart
+++ b/pkg/analyzer/test/src/summary/resynthesize_ast2_test.dart
@@ -84,7 +84,7 @@
       Reference.root(),
     );
 
-    var sdkLinkResult = link(elementFactory, inputLibraries, true);
+    var sdkLinkResult = link(elementFactory, inputLibraries);
 
     return _sdkBundle = _SdkBundle(
       resolutionBytes: sdkLinkResult.resolutionBytes,
@@ -128,7 +128,7 @@
       ),
     );
 
-    var linkResult = link(elementFactory, inputLibraries, true);
+    var linkResult = link(elementFactory, inputLibraries);
 
     if (!keepLinkingLibraries) {
       elementFactory.removeBundle(
diff --git a/pkg/analyzer/test/src/summary/resynthesize_common.dart b/pkg/analyzer/test/src/summary/resynthesize_common.dart
index 1a70ed9..60a785c 100644
--- a/pkg/analyzer/test/src/summary/resynthesize_common.dart
+++ b/pkg/analyzer/test/src/summary/resynthesize_common.dart
@@ -10,6 +10,7 @@
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer/src/dart/element/element.dart';
+import 'package:analyzer/src/dart/sdk/sdk.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/source/package_map_resolver.dart';
 import 'package:analyzer/src/test_utilities/mock_sdk.dart';
@@ -29,14 +30,19 @@
 
   DeclaredVariables declaredVariables = DeclaredVariables();
   late final SourceFactory sourceFactory;
-  late final MockSdk sdk;
+  late final FolderBasedDartSdk sdk;
 
   late String testFile;
   late Source testSource;
   Set<Source> otherLibrarySources = <Source>{};
 
   AbstractResynthesizeTest() {
-    sdk = MockSdk(resourceProvider: resourceProvider);
+    var sdkRoot = newFolder('/sdk');
+    createMockSdk(
+      resourceProvider: resourceProvider,
+      root: sdkRoot,
+    );
+    sdk = FolderBasedDartSdk(resourceProvider, sdkRoot);
 
     sourceFactory = SourceFactory(
       [
diff --git a/pkg/analyzer/test/util/id_testing_helper.dart b/pkg/analyzer/test/util/id_testing_helper.dart
index aeb8011..2024150 100644
--- a/pkg/analyzer/test/util/id_testing_helper.dart
+++ b/pkg/analyzer/test/util/id_testing_helper.dart
@@ -21,6 +21,7 @@
 import 'package:analyzer/src/dart/analysis/driver.dart';
 import 'package:analyzer/src/dart/analysis/performance_logger.dart';
 import 'package:analyzer/src/dart/analysis/testing_data.dart';
+import 'package:analyzer/src/dart/sdk/sdk.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/source/package_map_resolver.dart';
@@ -128,7 +129,14 @@
     resourceProvider.newFile(
         resourceProvider.convertPath(testUri.path), entry.value);
   }
-  var sdk = MockSdk(resourceProvider: resourceProvider);
+  var sdkRoot = resourceProvider.newFolder(
+    resourceProvider.convertPath('/sdk'),
+  );
+  createMockSdk(
+    resourceProvider: resourceProvider,
+    root: sdkRoot,
+  );
+  var sdk = FolderBasedDartSdk(resourceProvider, sdkRoot);
   var logBuffer = StringBuffer();
   var logger = PerformanceLog(logBuffer);
   var scheduler = AnalysisDriverScheduler(logger);
diff --git a/pkg/analyzer/tool/diagnostics/diagnostics.md b/pkg/analyzer/tool/diagnostics/diagnostics.md
index 7aefd9d..14c6b3e 100644
--- a/pkg/analyzer/tool/diagnostics/diagnostics.md
+++ b/pkg/analyzer/tool/diagnostics/diagnostics.md
@@ -398,7 +398,7 @@
 
 ### ambiguous_extension_member_access
 
-_A member named '{0}' is defined in extensions {1}, and none are more specific._
+_A member named '{0}' is defined in {1}, and none are more specific._
 
 #### Description
 
@@ -4223,8 +4223,8 @@
 
 ### extension_conflicting_static_and_instance
 
-_Extension '{0}' can't define static member '{1}' and an instance member with
-the same name._
+_An extension can't define static member '{0}' and an instance member with the
+same name._
 
 #### Description
 
@@ -7422,8 +7422,8 @@
 
 ### invalid_visible_for_overriding_annotation
 
-_The declaration '{0}' is annotated with 'visibleForOverriding'. Because '{0}'
-isn't an interface member that could be overridden, the annotation is meaningless._
+_The annotation 'visibleForOverriding' can only be applied to a public instance
+member that can be overridden._
 
 #### Description
 
diff --git a/pkg/analyzer_plugin/lib/src/protocol/protocol_internal.dart b/pkg/analyzer_plugin/lib/src/protocol/protocol_internal.dart
index 777ccda..459974c 100644
--- a/pkg/analyzer_plugin/lib/src/protocol/protocol_internal.dart
+++ b/pkg/analyzer_plugin/lib/src/protocol/protocol_internal.dart
@@ -4,6 +4,7 @@
 
 import 'dart:collection';
 import 'dart:convert' hide JsonDecoder;
+import 'dart:math' as math;
 
 import 'package:analyzer_plugin/protocol/protocol.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart';
@@ -28,6 +29,17 @@
 /// If the invariants can't be preserved, then a [ConflictingEditException] is
 /// thrown.
 void addEditForSource(SourceFileEdit sourceFileEdit, SourceEdit sourceEdit) {
+  /// If the [leftEdit] and the [rightEdit] can be merged, then merge them.
+  SourceEdit? _merge(SourceEdit leftEdit, SourceEdit rightEdit) {
+    assert(leftEdit.offset <= rightEdit.offset);
+    if (leftEdit.isDeletion && rightEdit.isDeletion) {
+      var offset = leftEdit.offset;
+      var end = math.max(leftEdit.end, rightEdit.end);
+      return SourceEdit(offset, end - offset, '');
+    }
+    return null;
+  }
+
   var edits = sourceFileEdit.edits;
   var length = edits.length;
   var index = 0;
@@ -39,7 +51,12 @@
     // The [previousEdit] has an offset that is strictly greater than the offset
     // of the [sourceEdit] so we only need to look at the end of the
     // [sourceEdit] to know whether they overlap.
-    if (sourceEdit.offset + sourceEdit.length > previousEdit.offset) {
+    if (sourceEdit.end > previousEdit.offset) {
+      var mergedEdit = _merge(sourceEdit, previousEdit);
+      if (mergedEdit != null) {
+        edits[index - 1] = mergedEdit;
+        return;
+      }
       throw ConflictingEditException(
           newEdit: sourceEdit, existingEdit: previousEdit);
     }
@@ -54,7 +71,12 @@
     if ((sourceEdit.offset == nextEdit.offset &&
             sourceEdit.length > 0 &&
             nextEdit.length > 0) ||
-        nextEdit.offset + nextEdit.length > sourceEdit.offset) {
+        nextEdit.end > sourceEdit.offset) {
+      var mergedEdit = _merge(nextEdit, sourceEdit);
+      if (mergedEdit != null) {
+        edits[index] = mergedEdit;
+        return;
+      }
       throw ConflictingEditException(
           newEdit: sourceEdit, existingEdit: nextEdit);
     }
@@ -468,3 +490,11 @@
   /// the given [id], where the request was received at the given [requestTime].
   Response toResponse(String id, int requestTime);
 }
+
+extension SourceEditExtensions on SourceEdit {
+  /// Return `true` if this source edit represents a deletion.
+  bool get isDeletion => replacement.isEmpty;
+
+  /// Return `true` if this source edit represents an insertion.
+  bool get isInsertion => length == 0;
+}
diff --git a/pkg/analyzer_plugin/test/src/utilities/change_builder/change_builder_core_test.dart b/pkg/analyzer_plugin/test/src/utilities/change_builder/change_builder_core_test.dart
index a571f04..6ed22f9 100644
--- a/pkg/analyzer_plugin/test/src/utilities/change_builder/change_builder_core_test.dart
+++ b/pkg/analyzer_plugin/test/src/utilities/change_builder/change_builder_core_test.dart
@@ -17,6 +17,7 @@
   defineReflectiveSuite(() {
     defineReflectiveTests(ChangeBuilderImplTest);
     defineReflectiveTests(EditBuilderImplTest);
+    defineReflectiveTests(FileEditBuilderImpl_ConflictingTest);
     defineReflectiveTests(FileEditBuilderImplTest);
     defineReflectiveTests(LinkedEditBuilderImplTest);
   });
@@ -297,6 +298,229 @@
   }
 }
 
+/// Tests that are specifically targeted at the handling of conflicting edits.
+@reflectiveTest
+class FileEditBuilderImpl_ConflictingTest extends AbstractChangeBuilderTest {
+  String path = '/test.dart';
+
+  Matcher get hasConflict => throwsA(isA<ConflictingEditException>());
+
+  Future<void> test_deletion_deletion_adjacent_left() async {
+    var firstOffset = 30;
+    var firstLength = 5;
+    var secondOffset = 23;
+    var secondLength = 7;
+    await builder.addGenericFileEdit(path, (builder) {
+      builder.addDeletion(SourceRange(firstOffset, firstLength));
+      builder.addDeletion(SourceRange(secondOffset, secondLength));
+    });
+    var edits = builder.sourceChange.edits[0].edits;
+    expect(edits, hasLength(2));
+    expect(edits[0].offset, firstOffset);
+    expect(edits[0].length, firstLength);
+    expect(edits[0].replacement, isEmpty);
+    expect(edits[1].offset, secondOffset);
+    expect(edits[1].length, secondLength);
+    expect(edits[1].replacement, isEmpty);
+  }
+
+  Future<void> test_deletion_deletion_adjacent_right() async {
+    var firstOffset = 23;
+    var firstLength = 7;
+    var secondOffset = 30;
+    var secondLength = 5;
+    await builder.addGenericFileEdit(path, (builder) {
+      builder.addDeletion(SourceRange(firstOffset, firstLength));
+      builder.addDeletion(SourceRange(secondOffset, secondLength));
+    });
+    var edits = builder.sourceChange.edits[0].edits;
+    expect(edits, hasLength(2));
+    expect(edits[0].offset, secondOffset);
+    expect(edits[0].length, secondLength);
+    expect(edits[0].replacement, isEmpty);
+    expect(edits[1].offset, firstOffset);
+    expect(edits[1].length, firstLength);
+    expect(edits[1].replacement, isEmpty);
+  }
+
+  Future<void> test_deletion_deletion_overlap_left() async {
+    var firstOffset = 27;
+    var firstLength = 8;
+    var secondOffset = 23;
+    var secondLength = 7;
+    await builder.addGenericFileEdit(path, (builder) {
+      builder.addDeletion(SourceRange(firstOffset, firstLength));
+      builder.addDeletion(SourceRange(secondOffset, secondLength));
+    });
+    var edits = builder.sourceChange.edits[0].edits;
+    expect(edits, hasLength(1));
+    expect(edits[0].offset, secondOffset);
+    expect(edits[0].length, firstOffset + firstLength - secondOffset);
+    expect(edits[0].replacement, isEmpty);
+  }
+
+  Future<void> test_deletion_deletion_overlap_right() async {
+    var firstOffset = 23;
+    var firstLength = 7;
+    var secondOffset = 27;
+    var secondLength = 8;
+    await builder.addGenericFileEdit(path, (builder) {
+      builder.addDeletion(SourceRange(firstOffset, firstLength));
+      builder.addDeletion(SourceRange(secondOffset, secondLength));
+    });
+    var edits = builder.sourceChange.edits[0].edits;
+    expect(edits, hasLength(1));
+    expect(edits[0].offset, firstOffset);
+    expect(edits[0].length, secondOffset + secondLength - firstOffset);
+    expect(edits[0].replacement, isEmpty);
+  }
+
+  Future<void> test_deletion_insertion_adjacent_left() async {
+    var deletionOffset = 23;
+    var deletionLength = 7;
+    var insertionOffset = 23;
+    var insertionText = 'x';
+    await builder.addGenericFileEdit(path, (builder) {
+      builder.addDeletion(SourceRange(deletionOffset, deletionLength));
+      expect(() {
+        builder.addSimpleInsertion(insertionOffset, insertionText);
+      }, hasConflict);
+    });
+    var edits = builder.sourceChange.edits[0].edits;
+    expect(edits, hasLength(1));
+    expect(edits[0].offset, deletionOffset);
+    expect(edits[0].length, deletionLength);
+    expect(edits[0].replacement, '');
+  }
+
+  Future<void> test_deletion_insertion_adjacent_right() async {
+    var deletionOffset = 23;
+    var deletionLength = 7;
+    var insertionOffset = 30;
+    var insertionText = 'x';
+    await builder.addGenericFileEdit(path, (builder) {
+      builder.addDeletion(SourceRange(deletionOffset, deletionLength));
+      builder.addSimpleInsertion(insertionOffset, insertionText);
+    });
+    var edits = builder.sourceChange.edits[0].edits;
+    expect(edits, hasLength(2));
+    expect(edits[0].offset, insertionOffset);
+    expect(edits[0].length, 0);
+    expect(edits[0].replacement, insertionText);
+    expect(edits[1].offset, deletionOffset);
+    expect(edits[1].length, deletionLength);
+    expect(edits[1].replacement, isEmpty);
+  }
+
+  Future<void> test_deletion_insertion_overlap() async {
+    var deletionOffset = 23;
+    var deletionLength = 7;
+    var insertionOffset = 26;
+    var insertionText = 'x';
+    await builder.addGenericFileEdit(path, (builder) {
+      builder.addDeletion(SourceRange(deletionOffset, deletionLength));
+      expect(() {
+        builder.addSimpleInsertion(insertionOffset, insertionText);
+      }, hasConflict);
+    });
+    var edits = builder.sourceChange.edits[0].edits;
+    expect(edits, hasLength(1));
+    expect(edits[0].offset, deletionOffset);
+    expect(edits[0].length, deletionLength);
+    expect(edits[0].replacement, '');
+  }
+
+  Future<void> test_insertion_deletion_adjacent_left() async {
+    var deletionOffset = 23;
+    var deletionLength = 7;
+    var insertionOffset = 23;
+    var insertionText = 'x';
+    await builder.addGenericFileEdit(path, (builder) {
+      builder.addSimpleInsertion(insertionOffset, insertionText);
+      builder.addDeletion(SourceRange(deletionOffset, deletionLength));
+    });
+    var edits = builder.sourceChange.edits[0].edits;
+    expect(edits, hasLength(2));
+    expect(edits[0].offset, deletionOffset);
+    expect(edits[0].length, deletionLength);
+    expect(edits[0].replacement, isEmpty);
+    expect(edits[1].offset, insertionOffset);
+    expect(edits[1].length, 0);
+    expect(edits[1].replacement, insertionText);
+  }
+
+  Future<void> test_insertion_deletion_adjacent_right() async {
+    var deletionOffset = 23;
+    var deletionLength = 7;
+    var insertionOffset = 30;
+    var insertionText = 'x';
+    await builder.addGenericFileEdit(path, (builder) {
+      builder.addSimpleInsertion(insertionOffset, insertionText);
+      builder.addDeletion(SourceRange(deletionOffset, deletionLength));
+    });
+    var edits = builder.sourceChange.edits[0].edits;
+    expect(edits, hasLength(2));
+    expect(edits[0].offset, insertionOffset);
+    expect(edits[0].length, 0);
+    expect(edits[0].replacement, insertionText);
+    expect(edits[1].offset, deletionOffset);
+    expect(edits[1].length, deletionLength);
+    expect(edits[1].replacement, isEmpty);
+  }
+
+  Future<void> test_insertion_deletion_overlap() async {
+    var deletionOffset = 23;
+    var deletionLength = 7;
+    var insertionOffset = 26;
+    var insertionText = 'x';
+    await builder.addGenericFileEdit(path, (builder) {
+      builder.addSimpleInsertion(insertionOffset, insertionText);
+      expect(() {
+        builder.addDeletion(SourceRange(deletionOffset, deletionLength));
+      }, hasConflict);
+    });
+    var edits = builder.sourceChange.edits[0].edits;
+    expect(edits, hasLength(1));
+    expect(edits[0].offset, insertionOffset);
+    expect(edits[0].length, 0);
+    expect(edits[0].replacement, insertionText);
+  }
+
+  Future<void> test_replacement_replacement_overlap_left() async {
+    var offset = 23;
+    var length = 7;
+    var text = 'x';
+    await builder.addGenericFileEdit(path, (builder) {
+      builder.addSimpleReplacement(SourceRange(offset, length), text);
+      expect(() {
+        builder.addSimpleReplacement(SourceRange(offset - 2, length), text);
+      }, hasConflict);
+    });
+    var edits = builder.sourceChange.edits[0].edits;
+    expect(edits, hasLength(1));
+    expect(edits[0].offset, offset);
+    expect(edits[0].length, length);
+    expect(edits[0].replacement, text);
+  }
+
+  Future<void> test_replacement_replacement_overlap_right() async {
+    var offset = 23;
+    var length = 7;
+    var text = 'x';
+    await builder.addGenericFileEdit(path, (builder) {
+      builder.addSimpleReplacement(SourceRange(offset, length), text);
+      expect(() {
+        builder.addSimpleReplacement(SourceRange(offset + 2, length), text);
+      }, hasConflict);
+    });
+    var edits = builder.sourceChange.edits[0].edits;
+    expect(edits, hasLength(1));
+    expect(edits[0].offset, offset);
+    expect(edits[0].length, length);
+    expect(edits[0].replacement, text);
+  }
+}
+
 @reflectiveTest
 class FileEditBuilderImplTest extends AbstractChangeBuilderTest {
   String path = '/test.dart';
@@ -314,68 +538,6 @@
     expect(edits[0].replacement, isEmpty);
   }
 
-  Future<void> test_addDeletion_adjacent_lowerOffsetFirst() async {
-    // TODO(brianwilkerson) This should also merge the deletions, but is written
-    //  to ensure that existing uses of FileEditBuilder continue to work even
-    //  without that change.
-    var firstOffset = 23;
-    var firstLength = 7;
-    var secondOffset = 30;
-    var secondLength = 5;
-    await builder.addGenericFileEdit(path, (builder) {
-      builder.addDeletion(SourceRange(firstOffset, firstLength));
-      builder.addDeletion(SourceRange(secondOffset, secondLength));
-    });
-    var edits = builder.sourceChange.edits[0].edits;
-    expect(edits, hasLength(2));
-    expect(edits[0].offset, secondOffset);
-    expect(edits[0].length, secondLength);
-    expect(edits[0].replacement, isEmpty);
-    expect(edits[1].offset, firstOffset);
-    expect(edits[1].length, firstLength);
-    expect(edits[1].replacement, isEmpty);
-  }
-
-  Future<void> test_addDeletion_adjacent_lowerOffsetSecond() async {
-    // TODO(brianwilkerson) This should also merge the deletions, but is written
-    //  to ensure that existing uses of FileEditBuilder continue to work even
-    //  without that change.
-    var firstOffset = 23;
-    var firstLength = 7;
-    var secondOffset = 30;
-    var secondLength = 5;
-    await builder.addGenericFileEdit(path, (builder) {
-      builder.addDeletion(SourceRange(secondOffset, secondLength));
-      builder.addDeletion(SourceRange(firstOffset, firstLength));
-    });
-    var edits = builder.sourceChange.edits[0].edits;
-    expect(edits, hasLength(2));
-    expect(edits[0].offset, secondOffset);
-    expect(edits[0].length, secondLength);
-    expect(edits[0].replacement, isEmpty);
-    expect(edits[1].offset, firstOffset);
-    expect(edits[1].length, firstLength);
-    expect(edits[1].replacement, isEmpty);
-  }
-
-  @failingTest
-  Future<void> test_addDeletion_overlapping() async {
-    // This support is not yet implemented.
-    var firstOffset = 23;
-    var firstLength = 7;
-    var secondOffset = 27;
-    var secondLength = 8;
-    await builder.addGenericFileEdit(path, (builder) {
-      builder.addDeletion(SourceRange(firstOffset, firstLength));
-      builder.addDeletion(SourceRange(secondOffset, secondLength));
-    });
-    var edits = builder.sourceChange.edits[0].edits;
-    expect(edits, hasLength(1));
-    expect(edits[0].offset, firstOffset);
-    expect(edits[0].length, secondOffset + secondLength - firstOffset);
-    expect(edits[0].replacement, isEmpty);
-  }
-
   Future<void> test_addInsertion() async {
     await builder.addGenericFileEdit(path, (builder) {
       builder.addInsertion(10, (builder) {
@@ -472,40 +634,6 @@
     expect(edits[1].replacement, text);
   }
 
-  Future<void> test_addSimpleReplacement_overlapsHead() async {
-    var offset = 23;
-    var length = 7;
-    var text = 'xyz';
-    await builder.addGenericFileEdit(path, (builder) {
-      builder.addSimpleReplacement(SourceRange(offset, length), text);
-      expect(() {
-        builder.addSimpleReplacement(SourceRange(offset - 2, length), text);
-      }, throwsA(isA<ConflictingEditException>()));
-    });
-    var edits = builder.sourceChange.edits[0].edits;
-    expect(edits, hasLength(1));
-    expect(edits[0].offset, offset);
-    expect(edits[0].length, length);
-    expect(edits[0].replacement, text);
-  }
-
-  Future<void> test_addSimpleReplacement_overlapsTail() async {
-    var offset = 23;
-    var length = 7;
-    var text = 'xyz';
-    await builder.addGenericFileEdit(path, (builder) {
-      builder.addSimpleReplacement(SourceRange(offset, length), text);
-      expect(() {
-        builder.addSimpleReplacement(SourceRange(offset + 2, length), text);
-      }, throwsA(isA<ConflictingEditException>()));
-    });
-    var edits = builder.sourceChange.edits[0].edits;
-    expect(edits, hasLength(1));
-    expect(edits[0].offset, offset);
-    expect(edits[0].length, length);
-    expect(edits[0].replacement, text);
-  }
-
   Future<void> test_createEditBuilder() async {
     await builder.addGenericFileEdit(path, (builder) {
       var offset = 4;
diff --git a/pkg/analyzer_plugin/test/support/abstract_context.dart b/pkg/analyzer_plugin/test/support/abstract_context.dart
index 33577e7..426644f 100644
--- a/pkg/analyzer_plugin/test/support/abstract_context.dart
+++ b/pkg/analyzer_plugin/test/support/abstract_context.dart
@@ -44,6 +44,8 @@
 
   List<String> get collectionIncludedPaths => [workspaceRootPath];
 
+  Folder get sdkRoot => newFolder('/sdk');
+
   AnalysisSession get session => contextFor(testPackageRootPath).currentSession;
 
   /// The file system-specific `analysis_options.yaml` path.
@@ -101,7 +103,10 @@
   }
 
   void setUp() {
-    MockSdk(resourceProvider: resourceProvider);
+    createMockSdk(
+      resourceProvider: resourceProvider,
+      root: sdkRoot,
+    );
 
     newFolder(testPackageRootPath);
     writeTestPackageConfig();
@@ -156,7 +161,7 @@
       enableIndex: true,
       includedPaths: collectionIncludedPaths.map(convertPath).toList(),
       resourceProvider: resourceProvider,
-      sdkPath: convertPath('/sdk'),
+      sdkPath: sdkRoot.path,
     );
   }
 }
diff --git a/pkg/compiler/lib/src/common/names.dart b/pkg/compiler/lib/src/common/names.dart
index 74804d7..024be8a 100644
--- a/pkg/compiler/lib/src/common/names.dart
+++ b/pkg/compiler/lib/src/common/names.dart
@@ -224,9 +224,6 @@
   /// The URI for 'dart:web_gl'.
   static final Uri dart_web_gl = Uri(scheme: 'dart', path: 'web_gl');
 
-  /// The URI for 'dart:web_sql'.
-  static final Uri dart_web_sql = Uri(scheme: 'dart', path: 'web_sql');
-
   /// The URI for 'dart:_js_helper'.
   static final Uri dart__js_helper = Uri(scheme: 'dart', path: '_js_helper');
 
diff --git a/pkg/compiler/lib/src/js_backend/runtime_types_resolution.dart b/pkg/compiler/lib/src/js_backend/runtime_types_resolution.dart
index 11e86e2..5f3b75b 100644
--- a/pkg/compiler/lib/src/js_backend/runtime_types_resolution.dart
+++ b/pkg/compiler/lib/src/js_backend/runtime_types_resolution.dart
@@ -513,13 +513,27 @@
     });
 
     for (GenericInstantiation instantiation in _genericInstantiations) {
+      ParameterStructure instantiationParameterStructure =
+          ParameterStructure.fromType(instantiation.functionType);
+      ClassEntity implementationClass = _commonElements
+          .getInstantiationClass(instantiation.typeArguments.length);
+
       void processEntity(Entity entity) {
         MethodNode node = _getMethodNode(entity);
-        if (node.parameterStructure ==
-            ParameterStructure.fromType(instantiation.functionType)) {
+        // TODO(sra,johnniwinther): Use more information from the instantiation
+        // site. At many sites the instantiated element known, and for other
+        // sites the static type could filter more entities.
+        if (node.parameterStructure == instantiationParameterStructure) {
           _instantiationMap.putIfAbsent(entity, () => {}).add(instantiation);
           for (DartType type in instantiation.typeArguments) {
             registerDependenciesForInstantiation(node, type);
+            // The instantiation is implemented by a generic class (a subclass
+            // of 'Closure'). The implementation of generic instantiation
+            // equality places a need on the type parameters of the generic
+            // class. Making the class a dependency on the instantiation's
+            // parameters allows the dependency to propagate back to the helper
+            // function that is called to create the instantiation.
+            registerDependencies(_getClassNode(implementationClass), type);
           }
         }
       }
@@ -1337,6 +1351,7 @@
       }
       if (neededOnAll) break;
     }
+
     Set<ClassEntity> allClassesNeedingRuntimeType;
     if (neededOnAll) {
       neededOnFunctions = true;
@@ -1399,13 +1414,19 @@
     Set<int> instantiationsNeedingTypeArguments = {};
     typeVariableTests.forEachInstantiatedEntity(
         (Entity target, Set<GenericInstantiation> instantiations) {
-      if (methodsNeedingTypeArguments.contains(target) ||
-          localFunctionsNeedingTypeArguments.contains(target)) {
-        // TODO(johnniwinther): Use the static type of the instantiated
-        // expression.
-        instantiationsNeedingTypeArguments
-            .add(instantiations.first.typeArguments.length);
-        if (retainDataForTesting) {
+      // An instantiation needs type arguments if the class implementing the
+      // instantiation needs type arguments.
+      int arity = instantiations.first.typeArguments.length;
+      if (!instantiationsNeedingTypeArguments.contains(arity)) {
+        if (classesNeedingTypeArguments
+            .contains(commonElements.getInstantiationClass(arity))) {
+          instantiationsNeedingTypeArguments.add(arity);
+        }
+      }
+
+      if (retainDataForTesting) {
+        if (methodsNeedingTypeArguments.contains(target) ||
+            localFunctionsNeedingTypeArguments.contains(target)) {
           _instantiatedEntitiesNeedingTypeArgumentsForTesting ??= {};
           _instantiatedEntitiesNeedingTypeArgumentsForTesting
               .putIfAbsent(target, () => {})
diff --git a/pkg/compiler/lib/src/js_model/element_map_impl.dart b/pkg/compiler/lib/src/js_model/element_map_impl.dart
index e079b78..3bb766f 100644
--- a/pkg/compiler/lib/src/js_model/element_map_impl.dart
+++ b/pkg/compiler/lib/src/js_model/element_map_impl.dart
@@ -1359,7 +1359,6 @@
       type ??= findIn(Uris.dart_svg);
       type ??= findIn(Uris.dart_web_audio);
       type ??= findIn(Uris.dart_web_gl);
-      type ??= findIn(Uris.dart_web_sql);
       type ??= findIn(Uris.dart_indexed_db);
       type ??= findIn(Uris.dart_typed_data);
       type ??= findIn(Uris.dart__rti);
diff --git a/pkg/compiler/lib/src/kernel/dart2js_target.dart b/pkg/compiler/lib/src/kernel/dart2js_target.dart
index 3b8b71b..ae463a8 100644
--- a/pkg/compiler/lib/src/kernel/dart2js_target.dart
+++ b/pkg/compiler/lib/src/kernel/dart2js_target.dart
@@ -36,7 +36,6 @@
   '_native_typed_data',
   'web_audio',
   'web_gl',
-  'web_sql'
 ];
 
 List<Pattern> _allowedNativeTestPatterns = [
@@ -246,7 +245,6 @@
     'dart:svg',
     'dart:web_audio',
     'dart:web_gl',
-    'dart:web_sql',
   ],
   'dart2js_server': [
     'dart:_dart2js_runtime_metrics',
diff --git a/pkg/compiler/lib/src/kernel/element_map_impl.dart b/pkg/compiler/lib/src/kernel/element_map_impl.dart
index 0bd2619..827bf20 100644
--- a/pkg/compiler/lib/src/kernel/element_map_impl.dart
+++ b/pkg/compiler/lib/src/kernel/element_map_impl.dart
@@ -949,7 +949,6 @@
       type ??= findIn(Uris.dart_svg);
       type ??= findIn(Uris.dart_web_audio);
       type ??= findIn(Uris.dart_web_gl);
-      type ??= findIn(Uris.dart_web_sql);
       type ??= findIn(Uris.dart_indexed_db);
       type ??= findIn(Uris.dart_typed_data);
       type ??= findIn(Uris.dart__rti);
diff --git a/pkg/compiler/lib/src/options.dart b/pkg/compiler/lib/src/options.dart
index 38609ea..d0a06d4 100644
--- a/pkg/compiler/lib/src/options.dart
+++ b/pkg/compiler/lib/src/options.dart
@@ -72,10 +72,14 @@
   FeatureOption useContentSecurityPolicy = FeatureOption('csp');
 
   /// [FeatureOption]s which default to enabled.
-  late final List<FeatureOption> shipping = [legacyJavaScript, newHolders];
+  late final List<FeatureOption> shipping = [
+    legacyJavaScript,
+    newHolders,
+    useContentSecurityPolicy
+  ];
 
   /// [FeatureOption]s which default to disabled.
-  late final List<FeatureOption> canary = [useContentSecurityPolicy];
+  late final List<FeatureOption> canary = [];
 
   /// Forces canary feature on. This must run after [Option].parse.
   void forceCanary() {
diff --git a/pkg/compiler/lib/src/ssa/builder_kernel.dart b/pkg/compiler/lib/src/ssa/builder_kernel.dart
index cf8fb72..56683e5 100644
--- a/pkg/compiler/lib/src/ssa/builder_kernel.dart
+++ b/pkg/compiler/lib/src/ssa/builder_kernel.dart
@@ -5134,25 +5134,10 @@
     List<HInstruction> arguments = [];
     node.expression.accept(this);
     arguments.add(pop());
-    StaticType expressionType = _getStaticType(node.expression);
-    FunctionType functionType = expressionType.type.withoutNullability;
-    bool typeArgumentsNeeded = _rtiNeed.instantiationNeedsTypeArguments(
-        functionType, node.typeArguments.length);
-    List<DartType> typeArguments = node.typeArguments
-        .map((type) => typeArgumentsNeeded
-            ? _elementMap.getDartType(type)
-            : _commonElements.dynamicType)
-        .toList();
-    registry.registerGenericInstantiation(
-        GenericInstantiation(functionType, typeArguments));
-    // TODO(johnniwinther): Can we avoid creating the instantiation object?
-    for (DartType type in typeArguments) {
-      HInstruction instruction =
-          _typeBuilder.analyzeTypeArgument(type, sourceElement);
-      arguments.add(instruction);
-    }
+
+    // A generic function instantiation is created by calling a helper function
+    // which takes the arguments.
     int typeArgumentCount = node.typeArguments.length;
-    bool targetCanThrow = false; // TODO(sra): Is this true?
     FunctionEntity target =
         _commonElements.getInstantiateFunction(typeArgumentCount);
     if (target == null) {
@@ -5163,10 +5148,36 @@
       stack.add(graph.addConstantNull(closedWorld));
       return;
     }
+
+    StaticType expressionType = _getStaticType(node.expression);
+    FunctionType functionType = expressionType.type.withoutNullability;
+    bool typeArgumentsNeeded = _rtiNeed.methodNeedsTypeArguments(target);
+
+    List<DartType> typeArguments = node.typeArguments
+        .map((type) => typeArgumentsNeeded
+            ? _elementMap.getDartType(type)
+            : _commonElements.dynamicType)
+        .toList();
+    registry.registerGenericInstantiation(
+        GenericInstantiation(functionType, typeArguments));
+
+    // TODO(sra): Add instantiations to SourceInformationBuilder.
+    SourceInformation sourceInformation = null;
+
+    // TODO(47484): Allow callee to have different calling convention for type
+    // arguments.
+    if (typeArgumentsNeeded) {
+      _addTypeArguments(arguments, typeArguments, sourceInformation);
+    }
+
+    bool targetCanThrow = false; // TODO(sra): Is this true?
+
+    // TODO(sra): Use [_pushStaticInvocation] to allow inlining. We don't now
+    // because inference can't tell that the call has no side-effects.
     HInstruction instruction = HInvokeStatic(
         target, arguments, _abstractValueDomain.functionType, <DartType>[],
         targetCanThrow: targetCanThrow);
-    // TODO(sra): ..sourceInformation = sourceInformation
+    instruction.sourceInformation = sourceInformation;
     instruction.sideEffects
       ..clearAllDependencies()
       ..clearAllSideEffects();
diff --git a/pkg/compiler/test/closure/data/instantiation.dart b/pkg/compiler/test/closure/data/instantiation.dart
index dfebcb4..cb95806 100644
--- a/pkg/compiler/test/closure/data/instantiation.dart
+++ b/pkg/compiler/test/closure/data/instantiation.dart
@@ -7,7 +7,7 @@
 T id<T>(T t) => t;
 
 method<S>(S s) {
-  /*spec.fields=[S],free=[S]*/
+  /*fields=[S],free=[S]*/
   S Function(S) getId() => id;
   return getId();
 }
diff --git a/pkg/compiler/test/closure/data/instantiation1.dart b/pkg/compiler/test/closure/data/instantiation1.dart
index 32c3043..d132094 100644
--- a/pkg/compiler/test/closure/data/instantiation1.dart
+++ b/pkg/compiler/test/closure/data/instantiation1.dart
@@ -13,8 +13,7 @@
   /*member: B.method:hasThis*/
   method() {
     return
-        /*spec.fields=[this],free=[this],hasThis*/
-        /*prod.hasThis*/
+        /*fields=[this],free=[this],hasThis*/
         () {
       F<S> c = f;
       return c;
diff --git a/pkg/compiler/test/closure/data/instantiation3.dart b/pkg/compiler/test/closure/data/instantiation3.dart
index a379626..da4ade4 100644
--- a/pkg/compiler/test/closure/data/instantiation3.dart
+++ b/pkg/compiler/test/closure/data/instantiation3.dart
@@ -10,7 +10,7 @@
 
 method<S>() {
   return
-      /*spec.fields=[S],free=[S]*/
+      /*fields=[S],free=[S]*/
       () {
     F<S> c = f;
     return c;
diff --git a/pkg/compiler/test/impact/data/jsinterop.dart b/pkg/compiler/test/impact/data/jsinterop.dart
index 3f41558..b39e444 100644
--- a/pkg/compiler/test/impact/data/jsinterop.dart
+++ b/pkg/compiler/test/impact/data/jsinterop.dart
@@ -43,8 +43,7 @@
     native:OverconstrainedError,
     native:PositionError,
     native:SensorErrorEvent,
-    native:SpeechRecognitionError,
-    native:SqlError]
+    native:SpeechRecognitionError]
   */
   @JS()
   external double method();
diff --git a/pkg/compiler/test/impact/data/jsinterop_setter1.dart b/pkg/compiler/test/impact/data/jsinterop_setter1.dart
index b2b6e34..eb917cb 100644
--- a/pkg/compiler/test/impact/data/jsinterop_setter1.dart
+++ b/pkg/compiler/test/impact/data/jsinterop_setter1.dart
@@ -61,7 +61,6 @@
   native:PositionError,
   native:SensorErrorEvent,
   native:SpeechRecognitionError,
-  native:SqlError,
   param:Function*]
 */
 @JS()
diff --git a/pkg/compiler/test/impact/data/jsinterop_setter2.dart b/pkg/compiler/test/impact/data/jsinterop_setter2.dart
index 4c63bbb..7f5b60b 100644
--- a/pkg/compiler/test/impact/data/jsinterop_setter2.dart
+++ b/pkg/compiler/test/impact/data/jsinterop_setter2.dart
@@ -68,7 +68,6 @@
   native:PositionError,
   native:SensorErrorEvent,
   native:SpeechRecognitionError,
-  native:SqlError,
   param:void Function(String*,File*)*]
 */
 @JS()
diff --git a/pkg/compiler/test/impact/data/native.dart b/pkg/compiler/test/impact/data/native.dart
index b4d4c7f..8b4031b 100644
--- a/pkg/compiler/test/impact/data/native.dart
+++ b/pkg/compiler/test/impact/data/native.dart
@@ -29,7 +29,7 @@
  type=[inst:JSNull,inst:JSString,native:bool,native:int]
 */
 testJSCall() => foreign.JS(
-    'int|bool|NativeUint8List|Rectangle|IdbFactory|SqlDatabase|TypedData|ContextAttributes',
+    'int|bool|NativeUint8List|Rectangle|IdbFactory|TypedData|ContextAttributes',
     '#',
     null);
 
diff --git a/pkg/compiler/test/rti/data/instantiation1.dart b/pkg/compiler/test/rti/data/instantiation1.dart
index c838bbe..0ea6b96 100644
--- a/pkg/compiler/test/rti/data/instantiation1.dart
+++ b/pkg/compiler/test/rti/data/instantiation1.dart
@@ -11,6 +11,7 @@
 typedef int F<R>(R a);
 
 /*spec.class: B:explicit=[int* Function(B.S*)*],implicit=[B.S],indirect,needsArgs*/
+/*prod.class: B:needsArgs*/
 class B<S> {
   F<S> c;
 
diff --git a/pkg/compiler/test/rti/data/instantiation3.dart b/pkg/compiler/test/rti/data/instantiation3.dart
index 682672d..4c13f62 100644
--- a/pkg/compiler/test/rti/data/instantiation3.dart
+++ b/pkg/compiler/test/rti/data/instantiation3.dart
@@ -11,6 +11,7 @@
 typedef int F<R>(R a);
 
 /*spec.class: B:direct,explicit=[int* Function(B.S*)*],implicit=[B.S],needsArgs*/
+/*prod.class: B:needsArgs*/
 class B<S> {
   F<S> c;
 
diff --git a/pkg/compiler/test/rti/data/instantiation5.dart b/pkg/compiler/test/rti/data/instantiation5.dart
index 525be33..3c37996 100644
--- a/pkg/compiler/test/rti/data/instantiation5.dart
+++ b/pkg/compiler/test/rti/data/instantiation5.dart
@@ -11,6 +11,7 @@
 typedef int F<R>(R a);
 
 /*spec.member: method:implicit=[method.S],indirect,needsArgs*/
+/*prod.member: method:needsArgs*/
 method<S>() {
   F<S> c;
 
diff --git a/pkg/compiler/test/rti/data/instantiation7.dart b/pkg/compiler/test/rti/data/instantiation7.dart
index a47924b..216c83d 100644
--- a/pkg/compiler/test/rti/data/instantiation7.dart
+++ b/pkg/compiler/test/rti/data/instantiation7.dart
@@ -21,6 +21,7 @@
 typedef int F3<R, P, Q>(R a, P b, Q c);
 
 /*spec.member: method:implicit=[method.X,method.Y,method.Z],indirect,needsArgs*/
+/*prod.member: method:needsArgs*/
 method<X, Y, Z>() {
   F1<X> c1;
   F2<X, Y> c2;
diff --git a/pkg/compiler/test/rti/data/instantiation8.dart b/pkg/compiler/test/rti/data/instantiation8.dart
index f3750a1..0e57865 100644
--- a/pkg/compiler/test/rti/data/instantiation8.dart
+++ b/pkg/compiler/test/rti/data/instantiation8.dart
@@ -14,6 +14,7 @@
   if (a != b) throw '$a != $b';
 }
 
+/*member: test:needsArgs*/
 test<T>(f) {
   Class<T> Function() g = create;
   equals(f, g);
diff --git a/pkg/dev_compiler/lib/src/kernel/expression_compiler.dart b/pkg/dev_compiler/lib/src/kernel/expression_compiler.dart
index 0a1e1c2..fa46af3 100644
--- a/pkg/dev_compiler/lib/src/kernel/expression_compiler.dart
+++ b/pkg/dev_compiler/lib/src/kernel/expression_compiler.dart
@@ -416,7 +416,7 @@
 
   Future<Library> _getLibrary(Uri libraryUri) async {
     return await _compiler.context.runInContext((_) async {
-      var builder = _compiler.userCode.loader.lookupLibraryBuilder(libraryUri);
+      var builder = _compiler.userCode.loader.builders[libraryUri];
       if (builder != null) {
         var library =
             _compiler.userCode.loader.read(libraryUri, -1, accessor: builder);
diff --git a/pkg/dev_compiler/lib/src/kernel/native_types.dart b/pkg/dev_compiler/lib/src/kernel/native_types.dart
index 5a81641..ef37392 100644
--- a/pkg/dev_compiler/lib/src/kernel/native_types.dart
+++ b/pkg/dev_compiler/lib/src/kernel/native_types.dart
@@ -71,7 +71,6 @@
     _addPendingExtensionTypes(sdk.getLibrary('dart:svg'));
     _addPendingExtensionTypes(sdk.getLibrary('dart:web_audio'));
     _addPendingExtensionTypes(sdk.getLibrary('dart:web_gl'));
-    _addPendingExtensionTypes(sdk.getLibrary('dart:web_sql'));
 
     // For testing purposes only, we add extension types outside the Dart SDK.
     // These are only allowed for native tests (see allowedNativeTest).
diff --git a/pkg/dev_compiler/lib/src/kernel/target.dart b/pkg/dev_compiler/lib/src/kernel/target.dart
index 47cd497..7985eb6 100644
--- a/pkg/dev_compiler/lib/src/kernel/target.dart
+++ b/pkg/dev_compiler/lib/src/kernel/target.dart
@@ -45,7 +45,6 @@
   'dart.library.ui': 'false',
   'dart.library.web_audio': 'true',
   'dart.library.web_gl': 'true',
-  'dart.library.web_sql': 'true',
 };
 
 /// A kernel [Target] to configure the Dart Front End for dartdevc.
@@ -114,7 +113,6 @@
         'dart:svg',
         'dart:web_audio',
         'dart:web_gl',
-        'dart:web_sql'
       ];
 
   // The libraries required to be indexed via CoreTypes.
@@ -130,7 +128,6 @@
         'dart:svg',
         'dart:web_audio',
         'dart:web_gl',
-        'dart:web_sql',
         'dart:_foreign_helper',
         'dart:_interceptors',
         'dart:_js_helper',
diff --git a/pkg/dev_compiler/test/module_symbols/class_symbols_test.dart b/pkg/dev_compiler/test/module_symbols/class_symbols_test.dart
index 7d89f6d0..e1af8a8 100644
--- a/pkg/dev_compiler/test/module_symbols/class_symbols_test.dart
+++ b/pkg/dev_compiler/test/module_symbols/class_symbols_test.dart
@@ -451,7 +451,7 @@
           ${options.dartLangComment}
 
           class A {
-            String get publicInstanceGetter() => 'Fosse';
+            String get publicInstanceGetter => 'Fosse';
           }
           ''';
         setUpAll(() async {
@@ -484,7 +484,7 @@
           ${options.dartLangComment}
 
           class A {
-            String get _privateInstanceGetter() => 'Fosse';
+            String get _privateInstanceGetter => 'Fosse';
           }
           ''';
         setUpAll(() async {
@@ -517,7 +517,8 @@
           ${options.dartLangComment}
 
           class A {
-            var _value
+            var _value;
+            A(this._value);
             set publicInstanceSetter(String v) => _value = v;
           }
           ''';
@@ -551,7 +552,8 @@
           ${options.dartLangComment}
 
           class A {
-            var _value
+            var _value;
+            A(this._value);
             set _privateInstanceSetter(String v) => _value = v;
           }
           ''';
@@ -585,7 +587,7 @@
           ${options.dartLangComment}
 
           class A {
-            static String get publicStaticGetter() => 'Fosse';
+            static String get publicStaticGetter => 'Fosse';
           }
           ''';
         setUpAll(() async {
@@ -618,7 +620,7 @@
           ${options.dartLangComment}
 
           class A {
-            static String get _privateStaticGetter() => 'Fosse';
+            static String get _privateStaticGetter => 'Fosse';
           }
           ''';
         setUpAll(() async {
@@ -651,7 +653,7 @@
           ${options.dartLangComment}
 
           class A {
-            var _value;
+            static String _value = 'Cello';
             static set publicStaticSetter(String v) => _value = v;
           }
           ''';
@@ -685,7 +687,7 @@
           ${options.dartLangComment}
 
           class A {
-            var _value;
+            static String _value = 'Cello';
             static set _privateStaticSetter(String v) => _value = v;
           }
           ''';
diff --git a/pkg/dev_compiler/test/module_symbols/module_symbols_test_shared.dart b/pkg/dev_compiler/test/module_symbols/module_symbols_test_shared.dart
index 13bdd4a..4fb6eb6 100644
--- a/pkg/dev_compiler/test/module_symbols/module_symbols_test_shared.dart
+++ b/pkg/dev_compiler/test/module_symbols/module_symbols_test_shared.dart
@@ -23,6 +23,10 @@
     var compiler = DevelopmentIncrementalCompiler(setup.options, input);
     var component = await compiler.computeDelta();
     component.computeCanonicalNames();
+    var errors = setup.errors.where((e) => e.contains('Error'));
+    if (errors.isNotEmpty) {
+      throw Exception('Compilation failed: \n${errors.join('\n')}');
+    }
 
     // Initialize DDC.
     var moduleName = 'foo.dart';
@@ -93,6 +97,7 @@
 
   void cleanUp() {
     tempDir.delete(recursive: true);
+    options.errors.clear();
   }
 }
 
diff --git a/pkg/dev_compiler/test/module_symbols/variable_symbols_test.dart b/pkg/dev_compiler/test/module_symbols/variable_symbols_test.dart
index f74b54c..64b3e57 100644
--- a/pkg/dev_compiler/test/module_symbols/variable_symbols_test.dart
+++ b/pkg/dev_compiler/test/module_symbols/variable_symbols_test.dart
@@ -96,7 +96,9 @@
         final source = '''
           ${options.dartLangComment}
 
-          class A {}
+          class A {
+            const A();
+          }
           const localVariable = A();
           ''';
         setUpAll(() async {
diff --git a/pkg/front_end/lib/src/fasta/TESTING.md b/pkg/front_end/lib/src/fasta/TESTING.md
index e89d5c9..6837c2f 100644
--- a/pkg/front_end/lib/src/fasta/TESTING.md
+++ b/pkg/front_end/lib/src/fasta/TESTING.md
@@ -26,10 +26,10 @@
 
 ```
 # Unit tests for dart2js
-./tools/test.py --dart2js-batch --time -pcolor --report -aia32 -mrelease --checked dart2js
+./tools/test.py --time -pcolor --report -aia32 -mrelease --checked dart2js
 
 # Language and co19, dart2js.
-./tools/test.py --dart2js-batch --time -pcolor --report -aia32 -mrelease -cdart2js -rd8 language co19
+./tools/test.py --time -pcolor --report -aia32 -mrelease -cdart2js -rd8 language co19
 ```
 
 ## Testing the Dart VM
diff --git a/pkg/front_end/lib/src/fasta/dill/dill_library_builder.dart b/pkg/front_end/lib/src/fasta/dill/dill_library_builder.dart
index edf5ede..8d60ebc 100644
--- a/pkg/front_end/lib/src/fasta/dill/dill_library_builder.dart
+++ b/pkg/front_end/lib/src/fasta/dill/dill_library_builder.dart
@@ -396,7 +396,7 @@
         } else {
           unhandled("${node.runtimeType}", "finalizeExports", -1, fileUri);
         }
-        LibraryBuilder? library = loader.lookupLibraryBuilder(libraryUri);
+        LibraryBuilder? library = loader.builders[libraryUri];
         if (library == null) {
           internalProblem(
               templateUnspecified
diff --git a/pkg/front_end/lib/src/fasta/dill/dill_loader.dart b/pkg/front_end/lib/src/fasta/dill/dill_loader.dart
index 9524f5b..3a4bdc0 100644
--- a/pkg/front_end/lib/src/fasta/dill/dill_loader.dart
+++ b/pkg/front_end/lib/src/fasta/dill/dill_loader.dart
@@ -47,10 +47,8 @@
 class DillLoader extends Loader {
   SourceLoader? currentSourceLoader;
 
-  final Map<Uri, DillLibraryBuilder> _knownLibraryBuilders =
-      <Uri, DillLibraryBuilder>{};
-
-  final Map<Uri, DillLibraryBuilder> _builders = <Uri, DillLibraryBuilder>{};
+  @override
+  final Map<Uri, DillLibraryBuilder> builders = <Uri, DillLibraryBuilder>{};
 
   final Queue<DillLibraryBuilder> _unparsedLibraries =
       new Queue<DillLibraryBuilder>();
@@ -89,18 +87,12 @@
   @override
   LibraryBuilder get coreLibrary => _coreLibrary!;
 
+  void set coreLibrary(LibraryBuilder value) {
+    _coreLibrary = value;
+  }
+
   Ticker get ticker => target.ticker;
 
-  void registerKnownLibrary(Library library) {
-    _knownLibraryBuilders[library.importUri] =
-        new DillLibraryBuilder(library, this);
-  }
-
-  // TODO(johnniwinther): This is never called!?!
-  void releaseAncillaryResources() {
-    _knownLibraryBuilders.clear();
-  }
-
   /// Look up a library builder by the [uri], or if such doesn't exist, create
   /// one. The canonical URI of the library is [uri], and its actual location is
   /// [fileUri].
@@ -113,16 +105,12 @@
   /// directive. If [accessor] isn't allowed to access [uri], it's a
   /// compile-time error.
   DillLibraryBuilder read(Uri uri, int charOffset, {LibraryBuilder? accessor}) {
-    DillLibraryBuilder? libraryBuilder = _builders[uri];
-    if (libraryBuilder == null) {
-      libraryBuilder = _knownLibraryBuilders.remove(uri);
-      // ignore: unnecessary_null_comparison
-      assert(libraryBuilder != null, "No library found for $uri.");
-      _builders[uri] = libraryBuilder!;
-      assert(libraryBuilder.loader == this);
+    DillLibraryBuilder builder = builders.putIfAbsent(uri, () {
+      DillLibraryBuilder library = target.createLibraryBuilder(uri);
+      assert(library.loader == this);
       if (uri.scheme == "dart") {
         if (uri.path == "core") {
-          _coreLibrary = libraryBuilder;
+          _coreLibrary = library;
         }
       }
       {
@@ -130,18 +118,19 @@
         // firstSourceUri and first library should be done as early as
         // possible.
         firstSourceUri ??= uri;
-        first ??= libraryBuilder;
+        first ??= library;
       }
-      if (_coreLibrary == libraryBuilder) {
+      if (_coreLibrary == library) {
         target.loadExtraRequiredLibraries(this);
       }
       if (target.backendTarget.mayDefineRestrictedType(uri)) {
-        libraryBuilder.mayImplementRestrictedTypes = true;
+        library.mayImplementRestrictedTypes = true;
       }
-      _unparsedLibraries.addLast(libraryBuilder);
-    }
+      _unparsedLibraries.addLast(library);
+      return library;
+    });
     if (accessor != null) {
-      libraryBuilder.recordAccess(charOffset, noLength, accessor.fileUri);
+      builder.recordAccess(charOffset, noLength, accessor.fileUri);
       if (!accessor.isPatch &&
           !accessor.isPart &&
           !target.backendTarget
@@ -150,7 +139,7 @@
             noLength, accessor.fileUri);
       }
     }
-    return libraryBuilder;
+    return builder;
   }
 
   void _ensureCoreLibrary() {
@@ -176,7 +165,7 @@
   void _logSummary(Template<SummaryTemplate> template) {
     ticker.log((Duration elapsed, Duration sinceStart) {
       int libraryCount = 0;
-      for (DillLibraryBuilder library in libraryBuilders) {
+      for (DillLibraryBuilder library in builders.values) {
         assert(library.loader == this);
         libraryCount++;
       }
@@ -275,7 +264,7 @@
       Uri uri = library.importUri;
       if (filter == null || filter(library.importUri)) {
         libraries.add(library);
-        registerKnownLibrary(library);
+        target.registerLibrary(library);
         requestedLibraries.add(uri);
         requestedLibrariesFileUri.add(library.fileUri);
       }
@@ -301,7 +290,7 @@
     //
     // Create dill library builder (adds it to a map where it's fetched
     // again momentarily).
-    registerKnownLibrary(library);
+    target.registerLibrary(library);
     // Set up the dill library builder (fetch it from the map again, add it to
     // another map and setup some auxiliary things).
     return read(library.importUri, -1);
@@ -316,8 +305,9 @@
   }
 
   void finalizeExports({bool suppressFinalizationErrors: false}) {
-    for (DillLibraryBuilder builder in libraryBuilders) {
-      builder.markAsReadyToFinalizeExports(
+    for (LibraryBuilder builder in builders.values) {
+      DillLibraryBuilder library = builder as DillLibraryBuilder;
+      library.markAsReadyToFinalizeExports(
           suppressFinalizationErrors: suppressFinalizationErrors);
     }
   }
@@ -325,10 +315,9 @@
   @override
   ClassBuilder computeClassBuilderFromTargetClass(Class cls) {
     Library kernelLibrary = cls.enclosingLibrary;
-    LibraryBuilder? library = lookupLibraryBuilder(kernelLibrary.importUri);
+    LibraryBuilder? library = builders[kernelLibrary.importUri];
     if (library == null) {
-      library =
-          currentSourceLoader?.lookupLibraryBuilder(kernelLibrary.importUri);
+      library = currentSourceLoader?.builders[kernelLibrary.importUri];
     }
     return library!.lookupLocalMember(cls.name, required: true) as ClassBuilder;
   }
@@ -337,28 +326,4 @@
   TypeBuilder computeTypeBuilder(DartType type) {
     return type.accept(new TypeBuilderComputer(this));
   }
-
-  bool containsLibraryBuilder(Uri importUri) =>
-      _builders.containsKey(importUri);
-
-  @override
-  DillLibraryBuilder? lookupLibraryBuilder(Uri importUri) =>
-      _builders[importUri];
-
-  Iterable<DillLibraryBuilder> get libraryBuilders => _builders.values;
-
-  Iterable<Uri> get libraryImportUris => _builders.keys;
-
-  void registerLibraryBuilder(DillLibraryBuilder libraryBuilder) {
-    Uri importUri = libraryBuilder.importUri;
-    libraryBuilder.loader = this;
-    if (importUri.scheme == "dart" && importUri.path == "core") {
-      _coreLibrary = libraryBuilder;
-    }
-    _builders[importUri] = libraryBuilder;
-  }
-
-  DillLibraryBuilder? deregisterLibraryBuilder(Uri importUri) {
-    return _builders.remove(importUri);
-  }
 }
diff --git a/pkg/front_end/lib/src/fasta/dill/dill_target.dart b/pkg/front_end/lib/src/fasta/dill/dill_target.dart
index b5b737e..28ccfbc 100644
--- a/pkg/front_end/lib/src/fasta/dill/dill_target.dart
+++ b/pkg/front_end/lib/src/fasta/dill/dill_target.dart
@@ -4,7 +4,7 @@
 
 import 'package:_fe_analyzer_shared/src/messages/severity.dart' show Severity;
 
-import 'package:kernel/ast.dart' show Source;
+import 'package:kernel/ast.dart' show Library, Source;
 
 import 'package:kernel/target/targets.dart' show Target;
 
@@ -20,11 +20,16 @@
 
 import '../target_implementation.dart' show TargetImplementation;
 
+import 'dill_library_builder.dart' show DillLibraryBuilder;
+
 import 'dill_loader.dart' show DillLoader;
 
 class DillTarget extends TargetImplementation {
   final Ticker ticker;
 
+  final Map<Uri, DillLibraryBuilder> _knownLibraryBuilders =
+      <Uri, DillLibraryBuilder>{};
+
   bool isLoaded = false;
 
   late final DillLoader loader;
@@ -87,4 +92,24 @@
     }
     isLoaded = true;
   }
+
+  /// Returns the [DillLibraryBuilder] corresponding to [uri].
+  ///
+  /// The [DillLibraryBuilder] is pulled from [_knownLibraryBuilders].
+  DillLibraryBuilder createLibraryBuilder(Uri uri) {
+    DillLibraryBuilder libraryBuilder =
+        _knownLibraryBuilders.remove(uri) as DillLibraryBuilder;
+    // ignore: unnecessary_null_comparison
+    assert(libraryBuilder != null, "No library found for $uri.");
+    return libraryBuilder;
+  }
+
+  void registerLibrary(Library library) {
+    _knownLibraryBuilders[library.importUri] =
+        new DillLibraryBuilder(library, loader);
+  }
+
+  void releaseAncillaryResources() {
+    _knownLibraryBuilders.clear();
+  }
 }
diff --git a/pkg/front_end/lib/src/fasta/incremental_compiler.dart b/pkg/front_end/lib/src/fasta/incremental_compiler.dart
index 61bdb2e..a188b12 100644
--- a/pkg/front_end/lib/src/fasta/incremental_compiler.dart
+++ b/pkg/front_end/lib/src/fasta/incremental_compiler.dart
@@ -102,7 +102,6 @@
 
 import 'dill/dill_library_builder.dart' show DillLibraryBuilder;
 
-import 'dill/dill_loader.dart' show DillLoader;
 import 'dill/dill_target.dart' show DillTarget;
 
 import 'export.dart' show Export;
@@ -284,7 +283,7 @@
       // non-null.
       if (userCode != null) {
         ticker.logMs("Decided to reuse ${reusedLibraries.length}"
-            " of ${userCode!.loader.libraryBuilders.length} libraries");
+            " of ${userCode!.loader.builders.length} libraries");
       }
 
       // For modular compilation we can be asked to load components and track
@@ -369,7 +368,7 @@
       // calculation has the potential to work.
       // ignore: unnecessary_null_comparison
       if (componentWithDill == null) {
-        userCode!.loader.clearLibraryBuilders();
+        userCode!.loader.builders.clear();
         userCode = userCodeOld;
         dillLoadedData!.loader.currentSourceLoader = userCode!.loader;
       } else {
@@ -416,16 +415,14 @@
     Set<Library> newDillLibraryBuilders = new Set<Library>();
     userBuilders ??= <Uri, LibraryBuilder>{};
     Map<LibraryBuilder, List<LibraryBuilder>>? convertedLibraries;
-    for (LibraryBuilder builder in userCode!.loader.libraryBuilders) {
-      if (builder is SourceLibraryBuilder) {
+    for (MapEntry<Uri, LibraryBuilder> entry
+        in userCode!.loader.builders.entries) {
+      if (entry.value is SourceLibraryBuilder) {
+        SourceLibraryBuilder builder = entry.value as SourceLibraryBuilder;
         DillLibraryBuilder dillBuilder =
             dillLoadedData!.loader.appendLibrary(builder.library);
-        userCode!.loader.registerLibraryBuilder(
-            // TODO(johnniwinther): Why do we need to create
-            //  [DillLibraryBuilder]s for the patch library file uris?
-            dillBuilder,
-            builder.isPatch ? builder.fileUri : null);
-        userBuilders![builder.importUri] = dillBuilder;
+        userCode!.loader.builders[entry.key] = dillBuilder;
+        userBuilders![entry.key] = dillBuilder;
         newDillLibraryBuilders.add(builder.library);
         if (userCode!.loader.first == builder) {
           userCode!.loader.first = dillBuilder;
@@ -442,7 +439,8 @@
       // We suppress finalization errors because they have already been
       // reported.
       dillLoadedData!.buildOutlines(suppressFinalizationErrors: true);
-      assert(_checkEquivalentScopes(userCode!.loader, dillLoadedData!.loader));
+      assert(_checkEquivalentScopes(
+          userCode!.loader.builders, dillLoadedData!.loader.builders));
 
       if (experimentalInvalidation != null) {
         /// If doing experimental invalidation that means that some of the old
@@ -487,19 +485,18 @@
     return newDillLibraryBuilders;
   }
 
-  bool _checkEquivalentScopes(
-      SourceLoader sourceLoader, DillLoader dillLoader) {
-    for (LibraryBuilder sourceLibraryBuilder in sourceLoader.libraryBuilders) {
+  bool _checkEquivalentScopes(Map<Uri, LibraryBuilder> sourceLibraries,
+      Map<Uri, LibraryBuilder> dillLibraries) {
+    sourceLibraries.forEach((Uri uri, LibraryBuilder sourceLibraryBuilder) {
       if (sourceLibraryBuilder is SourceLibraryBuilder) {
-        Uri uri = sourceLibraryBuilder.importUri;
         DillLibraryBuilder dillLibraryBuilder =
-            dillLoader.lookupLibraryBuilder(uri)!;
+            dillLibraries[uri] as DillLibraryBuilder;
         assert(
             _hasEquivalentScopes(sourceLibraryBuilder, dillLibraryBuilder) ==
                 null,
             _hasEquivalentScopes(sourceLibraryBuilder, dillLibraryBuilder));
       }
-    }
+    });
     return true;
   }
 
@@ -637,7 +634,7 @@
       // evaluator - that comes from dill - are marked.
       Set<Library> librariesUsedByConstantEvaluator = userCode!.librariesUsed;
 
-      for (LibraryBuilder builder in dillLoadedData!.loader.libraryBuilders) {
+      for (LibraryBuilder builder in dillLoadedData!.loader.builders.values) {
         if (builder is DillLibraryBuilder) {
           if (builder.isBuiltAndMarked ||
               librariesUsedByConstantEvaluator.contains(builder.library)) {
@@ -843,7 +840,11 @@
     List<bool> seenModes = [false, false, false, false];
     for (LibraryBuilder library in reusedLibraries) {
       seenModes[library.library.nonNullableByDefaultCompiledMode.index] = true;
-      userCode!.loader.registerLibraryBuilder(library);
+      userCode!.loader.builders[library.importUri] = library;
+      if (library.importUri.scheme == "dart" &&
+          library.importUri.path == "core") {
+        userCode!.loader.coreLibrary = library;
+      }
     }
     // Check compilation mode up against what we've seen here and set
     // `hasInvalidNnbdModeLibrary` accordingly.
@@ -905,12 +906,10 @@
               ? firstEntryPoint
               : null);
     }
-    if (userCode!.loader.first == null) {
-      LibraryBuilder? libraryBuilder =
-          userCode!.loader.lookupLibraryBuilder(firstEntryPointImportUri);
-      if (libraryBuilder != null) {
-        userCode!.loader.first = libraryBuilder;
-      }
+    if (userCode!.loader.first == null &&
+        userCode!.loader.builders[firstEntryPointImportUri] != null) {
+      userCode!.loader.first =
+          userCode!.loader.builders[firstEntryPointImportUri];
     }
   }
 
@@ -920,7 +919,7 @@
   void resetTrackingOfUsedLibraries(ClassHierarchy? hierarchy) {
     if (trackNeededDillLibraries) {
       // Reset dill loaders and kernel class hierarchy.
-      for (LibraryBuilder builder in dillLoadedData!.loader.libraryBuilders) {
+      for (LibraryBuilder builder in dillLoadedData!.loader.builders.values) {
         if (builder is DillLibraryBuilder) {
           if (builder.isBuiltAndMarked) {
             // Clear cached calculations in classes which upon calculation can
@@ -977,9 +976,13 @@
       // Make sure the dill loader is on the same page.
       DillTarget oldDillLoadedData = dillLoadedData!;
       dillLoadedData = new DillTarget(ticker, uriTranslator, c.options.target);
-      for (DillLibraryBuilder library
-          in oldDillLoadedData.loader.libraryBuilders) {
-        dillLoadedData!.loader.registerLibraryBuilder(library);
+      for (LibraryBuilder library in oldDillLoadedData.loader.builders.values) {
+        (library as DillLibraryBuilder).loader = dillLoadedData!.loader;
+        dillLoadedData!.loader.builders[library.importUri] = library;
+        if (library.importUri.scheme == "dart" &&
+            library.importUri.path == "core") {
+          dillLoadedData!.loader.coreLibrary = library;
+        }
       }
       dillLoadedData!.loader.first = oldDillLoadedData.loader.first;
       dillLoadedData!.loader.libraries
@@ -1003,7 +1006,7 @@
       incrementalSerializer?.invalidate(builder.fileUri);
 
       LibraryBuilder? dillBuilder =
-          dillLoadedData!.loader.deregisterLibraryBuilder(builder.importUri);
+          dillLoadedData!.loader.builders.remove(builder.importUri);
       if (dillBuilder != null) {
         removedDillBuilders = true;
         userBuilders?.remove(builder.importUri);
@@ -1284,14 +1287,13 @@
       dillLoadedData!.buildOutlines(suppressFinalizationErrors: true);
       userBuilders = <Uri, LibraryBuilder>{};
       platformBuilders = <LibraryBuilder>[];
-      for (DillLibraryBuilder builder
-          in dillLoadedData!.loader.libraryBuilders) {
+      dillLoadedData!.loader.builders.forEach((uri, builder) {
         if (builder.importUri.scheme == "dart") {
           platformBuilders!.add(builder);
         } else {
-          userBuilders![builder.importUri] = builder;
+          userBuilders![uri] = builder;
         }
-      }
+      });
       if (userBuilders!.isEmpty) userBuilders = null;
     }
     data.initializationBytes = null;
@@ -1380,7 +1382,7 @@
         Library library = c.enclosingLibrary;
         // Only add if loaded from a dill file (and wasn't a 'dill' that was
         // converted from source builders to dill builders).
-        if (dillLoadedData!.loader.containsLibraryBuilder(library.importUri) &&
+        if (dillLoadedData!.loader.builders.containsKey(library.importUri) &&
             (previousSourceBuilders == null ||
                 !previousSourceBuilders!.contains(library))) {
           neededDillLibraries!.add(library);
@@ -1391,10 +1393,10 @@
       // if all bets are off: Add everything (except for the libraries we just
       // converted from source builders to dill builders).
       neededDillLibraries = new Set<Library>();
-      for (DillLibraryBuilder builder
-          in dillLoadedData!.loader.libraryBuilders) {
-        if (previousSourceBuilders == null ||
-            !previousSourceBuilders!.contains(builder.library)) {
+      for (LibraryBuilder builder in dillLoadedData!.loader.builders.values) {
+        if (builder is DillLibraryBuilder &&
+            (previousSourceBuilders == null ||
+                !previousSourceBuilders!.contains(builder.library))) {
           neededDillLibraries!.add(builder.library);
         }
       }
@@ -1424,9 +1426,9 @@
       for (Component module in modulesToLoad!) {
         bool usedComponent = false;
         for (Library lib in module.libraries) {
-          if (!dillLoadedData!.loader.containsLibraryBuilder(lib.importUri)) {
+          if (!dillLoadedData!.loader.builders.containsKey(lib.importUri)) {
             dillLoadedData!.loader.libraries.add(lib);
-            dillLoadedData!.loader.registerKnownLibrary(lib);
+            dillLoadedData!.registerLibrary(lib);
             reusedLibraries.add(dillLoadedData!.loader.read(lib.importUri, -1));
             usedComponent = true;
           }
@@ -1442,14 +1444,13 @@
         dillLoadedData!.buildOutlines(suppressFinalizationErrors: true);
         userBuilders = <Uri, LibraryBuilder>{};
         platformBuilders = <LibraryBuilder>[];
-        for (DillLibraryBuilder builder
-            in dillLoadedData!.loader.libraryBuilders) {
+        dillLoadedData!.loader.builders.forEach((uri, builder) {
           if (builder.importUri.scheme == "dart") {
             platformBuilders!.add(builder);
           } else {
-            userBuilders![builder.importUri] = builder;
+            userBuilders![uri] = builder;
           }
-        }
+        });
         if (userBuilders!.isEmpty) {
           userBuilders = null;
         }
@@ -1517,7 +1518,7 @@
       // a new error.
       Set<LibraryBuilder> builders = {};
       SourceLoader loader = userCode!.loader;
-      for (LibraryBuilder builder in loader.libraryBuilders) {
+      for (LibraryBuilder builder in loader.builders.values) {
         if (strongModeNNBDPackageOptOutUris.contains(builder.fileUri)) {
           builders.add(builder);
         }
@@ -1633,11 +1634,11 @@
     bool removedDillBuilders = false;
     for (Uri uri in potentiallyReferencedLibraries.keys) {
       if (uri.scheme == "package") continue;
-      LibraryBuilder? builder = userCode!.loader.deregisterLibraryBuilder(uri);
+      LibraryBuilder? builder = userCode!.loader.builders.remove(uri);
       if (builder != null) {
         Library lib = builder.library;
         removedLibraries.add(lib);
-        if (dillLoadedData!.loader.deregisterLibraryBuilder(uri) != null) {
+        if (dillLoadedData!.loader.builders.remove(uri) != null) {
           removedDillBuilders = true;
         }
         cleanupSourcesForBuilder(null, builder, uriTranslator,
@@ -1665,7 +1666,7 @@
   /// This method syncs the [libraries] list with the data in [builders].
   void makeDillLoaderLibrariesUpToDateWithBuildersMap() {
     dillLoadedData!.loader.libraries.clear();
-    for (LibraryBuilder builder in dillLoadedData!.loader.libraryBuilders) {
+    for (LibraryBuilder builder in dillLoadedData!.loader.builders.values) {
       dillLoadedData!.loader.libraries.add(builder.library);
     }
   }
@@ -1694,7 +1695,7 @@
       if (userCode?.loader != null) {
         Uri? partImportUri = uriToSource[partFileUri]?.importUri;
         if (partImportUri != null &&
-            userCode!.loader.containsLibraryBuilder(partImportUri)) {
+            userCode!.loader.builders.containsKey(partImportUri)) {
           continue;
         }
       } else if (reusedResult != null) {
@@ -2200,9 +2201,7 @@
 
     if (userCode != null) {
       // userCode already contains the builders from userBuilders.
-      for (LibraryBuilder libraryBuilder in userCode!.loader.libraryBuilders) {
-        addBuilderAndInvalidateUris(libraryBuilder.importUri, libraryBuilder);
-      }
+      userCode!.loader.builders.forEach(addBuilderAndInvalidateUris);
     } else {
       // userCode was null so we explicitly have to add the builders from
       // userBuilders (which cannot be null as we checked initially that one of
@@ -2292,8 +2291,8 @@
   @override
   void invalidateAllSources() {
     if (userCode != null) {
-      Set<Uri> uris = new Set<Uri>.from(userCode!.loader.libraryImportUris);
-      uris.removeAll(dillLoadedData!.loader.libraryImportUris);
+      Set<Uri> uris = new Set<Uri>.from(userCode!.loader.builders.keys);
+      uris.removeAll(dillLoadedData!.loader.builders.keys);
       if (previousSourceBuilders != null) {
         for (Library library in previousSourceBuilders!) {
           uris.add(library.importUri);
diff --git a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
index af63914..452d6e7 100644
--- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
@@ -1267,10 +1267,10 @@
   void ensureLoaded(Member? member) {
     if (member == null) return;
     Library ensureLibraryLoaded = member.enclosingLibrary;
-    LibraryBuilder? builder = libraryBuilder.loader
-            .lookupLibraryBuilder(ensureLibraryLoaded.importUri) ??
-        libraryBuilder.loader.target.dillTarget.loader
-            .lookupLibraryBuilder(ensureLibraryLoaded.importUri);
+    LibraryBuilder? builder =
+        libraryBuilder.loader.builders[ensureLibraryLoaded.importUri] ??
+            libraryBuilder.loader.target.dillTarget.loader
+                .builders[ensureLibraryLoaded.importUri];
     if (builder is DillLibraryBuilder) {
       builder.ensureLoaded();
     }
@@ -1285,10 +1285,10 @@
   bool isLoaded(Member? member) {
     if (member == null) return true;
     Library ensureLibraryLoaded = member.enclosingLibrary;
-    LibraryBuilder? builder = libraryBuilder.loader
-            .lookupLibraryBuilder(ensureLibraryLoaded.importUri) ??
-        libraryBuilder.loader.target.dillTarget.loader
-            .lookupLibraryBuilder(ensureLibraryLoaded.importUri);
+    LibraryBuilder? builder =
+        libraryBuilder.loader.builders[ensureLibraryLoaded.importUri] ??
+            libraryBuilder.loader.target.dillTarget.loader
+                .builders[ensureLibraryLoaded.importUri];
     if (builder is DillLibraryBuilder) {
       return builder.isBuiltAndMarked;
     }
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_constants.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_constants.dart
index af210a0..67be0a6 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_constants.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_constants.dart
@@ -20,9 +20,9 @@
   @override
   void report(LocatedMessage message, [List<LocatedMessage>? context]) {
     // Try to find library.
-    LibraryBuilder? builder = loader.lookupLibraryBuilder(message.uri!);
+    LibraryBuilder? builder = loader.builders[message.uri];
     if (builder == null) {
-      for (LibraryBuilder candidate in loader.libraryBuilders) {
+      for (LibraryBuilder candidate in loader.builders.values) {
         if (candidate.fileUri == message.uri) {
           // Found it.
           builder = candidate;
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
index 890bf9d..2f595eb 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
@@ -40,6 +40,7 @@
 import '../builder/void_type_declaration_builder.dart';
 import '../compiler_context.dart' show CompilerContext;
 import '../crash.dart' show withCrashReporting;
+import '../dill/dill_library_builder.dart' show DillLibraryBuilder;
 import '../dill/dill_member_builder.dart' show DillMemberBuilder;
 import '../dill/dill_target.dart' show DillTarget;
 import '../kernel/constructor_tearoff_lowering.dart';
@@ -49,11 +50,16 @@
         FormattedMessage,
         LocatedMessage,
         Message,
+        messageAgnosticWithStrongDillLibrary,
+        messageAgnosticWithWeakDillLibrary,
         messageConstConstructorLateFinalFieldCause,
         messageConstConstructorLateFinalFieldError,
         messageConstConstructorNonFinalField,
         messageConstConstructorNonFinalFieldCause,
         messageConstConstructorRedirectionToNonConst,
+        messageInvalidNnbdDillLibrary,
+        messageStrongWithWeakDillLibrary,
+        messageWeakWithStrongDillLibrary,
         noLength,
         templateFieldNonNullableNotInitializedByConstructorError,
         templateFieldNonNullableWithoutInitializerError,
@@ -66,7 +72,8 @@
 import '../scope.dart' show AmbiguousBuilder;
 import '../source/name_scheme.dart';
 import '../source/source_class_builder.dart' show SourceClassBuilder;
-import '../source/source_library_builder.dart' show SourceLibraryBuilder;
+import '../source/source_library_builder.dart'
+    show LanguageVersion, SourceLibraryBuilder;
 import '../source/source_loader.dart' show SourceLoader;
 import '../target_implementation.dart' show TargetImplementation;
 import '../ticker.dart' show Ticker;
@@ -361,10 +368,94 @@
     return entryPoint;
   }
 
+  /// Creates a [LibraryBuilder] corresponding to [uri], if one doesn't exist
+  /// already.
+  ///
+  /// [fileUri] must not be null and is a URI that can be passed to FileSystem
+  /// to locate the corresponding file.
+  ///
+  /// [origin] is non-null if the created library is a patch to [origin].
+  ///
+  /// [packageUri] is the base uri for the package which the library belongs to.
+  /// For instance 'package:foo'.
+  ///
+  /// This is used to associate libraries in for instance the 'bin' and 'test'
+  /// folders of a package source with the package uri of the 'lib' folder.
+  ///
+  /// If the [packageUri] is `null` the package association of this library is
+  /// based on its [importUri].
+  ///
+  /// For libraries with a 'package:' [importUri], the package path must match
+  /// the path in the [importUri]. For libraries with a 'dart:' [importUri] the
+  /// [packageUri] must be `null`.
+  ///
+  /// [packageLanguageVersion] is the language version defined by the package
+  /// which the library belongs to, or the current sdk version if the library
+  /// doesn't belong to a package.
+  LibraryBuilder createLibraryBuilder(
+      Uri uri,
+      Uri fileUri,
+      Uri? packageUri,
+      LanguageVersion packageLanguageVersion,
+      SourceLibraryBuilder? origin,
+      Library? referencesFrom,
+      bool? referenceIsPartOwner) {
+    if (dillTarget.isLoaded) {
+      DillLibraryBuilder? builder = dillTarget.loader.builders[uri];
+      if (builder != null) {
+        if (!builder.isNonNullableByDefault &&
+            (loader.nnbdMode == NnbdMode.Strong ||
+                loader.nnbdMode == NnbdMode.Agnostic)) {
+          loader.registerStrongOptOutLibrary(builder);
+        } else {
+          NonNullableByDefaultCompiledMode libraryMode =
+              builder.library.nonNullableByDefaultCompiledMode;
+          if (libraryMode == NonNullableByDefaultCompiledMode.Invalid) {
+            loader.registerNnbdMismatchLibrary(
+                builder, messageInvalidNnbdDillLibrary);
+          } else {
+            switch (loader.nnbdMode) {
+              case NnbdMode.Weak:
+                if (libraryMode != NonNullableByDefaultCompiledMode.Agnostic &&
+                    libraryMode != NonNullableByDefaultCompiledMode.Weak) {
+                  loader.registerNnbdMismatchLibrary(
+                      builder, messageWeakWithStrongDillLibrary);
+                }
+                break;
+              case NnbdMode.Strong:
+                if (libraryMode != NonNullableByDefaultCompiledMode.Agnostic &&
+                    libraryMode != NonNullableByDefaultCompiledMode.Strong) {
+                  loader.registerNnbdMismatchLibrary(
+                      builder, messageStrongWithWeakDillLibrary);
+                }
+                break;
+              case NnbdMode.Agnostic:
+                if (libraryMode != NonNullableByDefaultCompiledMode.Agnostic) {
+                  if (libraryMode == NonNullableByDefaultCompiledMode.Strong) {
+                    loader.registerNnbdMismatchLibrary(
+                        builder, messageAgnosticWithStrongDillLibrary);
+                  } else {
+                    loader.registerNnbdMismatchLibrary(
+                        builder, messageAgnosticWithWeakDillLibrary);
+                  }
+                }
+                break;
+            }
+          }
+        }
+        return builder;
+      }
+    }
+    return new SourceLibraryBuilder(
+        uri, fileUri, packageUri, packageLanguageVersion, loader, origin,
+        referencesFrom: referencesFrom,
+        referenceIsPartOwner: referenceIsPartOwner);
+  }
+
   /// Returns classes defined in libraries in [loader].
   List<SourceClassBuilder> collectMyClasses() {
     List<SourceClassBuilder> result = <SourceClassBuilder>[];
-    for (LibraryBuilder library in loader.libraryBuilders) {
+    for (LibraryBuilder library in loader.builders.values) {
       if (library.loader == loader) {
         Iterator<Builder> iterator = library.iterator;
         while (iterator.moveNext()) {
@@ -623,7 +714,7 @@
 
   void installDefaultSupertypes() {
     Class objectClass = this.objectClass;
-    for (LibraryBuilder library in loader.libraryBuilders) {
+    for (LibraryBuilder library in loader.builders.values) {
       if (library.loader == loader) {
         Iterator<Builder> iterator = library.iterator;
         while (iterator.moveNext()) {
@@ -767,8 +858,23 @@
           Reference? constructorReference;
           Reference? tearOffReference;
           if (indexedClass != null) {
-            constructorReference = indexedClass.lookupConstructorReference(
-                new Name(name, indexedClass.library));
+            constructorReference = indexedClass
+                // We use the name of the member builder here since it refers to
+                // the library of the original declaration when private. For
+                // instance:
+                //
+                //     // lib1:
+                //     class Super { Super._() }
+                //     class Subclass extends Class {
+                //       Subclass() : super._();
+                //     }
+                //     // lib2:
+                //     class Mixin {}
+                //     class Class = Super with Mixin;
+                //
+                // Here `super._()` in `Subclass` targets the forwarding stub
+                // added to `Class` whose name is `_` private to `lib1`.
+                .lookupConstructorReference(memberBuilder.member.name);
             tearOffReference = indexedClass.lookupGetterReference(
                 constructorTearOffName(name, indexedClass.library));
           }
@@ -995,7 +1101,7 @@
       ...backendTarget.extraIndexedLibraries
     ]) {
       Uri uri = Uri.parse(platformLibrary);
-      LibraryBuilder? libraryBuilder = loader.lookupLibraryBuilder(uri);
+      LibraryBuilder? libraryBuilder = loader.builders[uri];
       if (libraryBuilder == null) {
         // TODO(ahe): This is working around a bug in kernel_driver_test or
         // kernel_driver.
@@ -1392,8 +1498,8 @@
 
     if (loader.target.context.options
         .isExperimentEnabledGlobally(ExperimentalFlag.valueClass)) {
-      valueClass.transformComponent(
-          component!, loader.coreTypes, loader.hierarchy, environment);
+      valueClass.transformComponent(component!, loader.coreTypes,
+          loader.hierarchy, loader.referenceFromIndex, environment);
       ticker.logMs("Lowered value classes");
     }
 
diff --git a/pkg/front_end/lib/src/fasta/kernel/type_builder_computer.dart b/pkg/front_end/lib/src/fasta/kernel/type_builder_computer.dart
index 52d0a58..341c589 100644
--- a/pkg/front_end/lib/src/fasta/kernel/type_builder_computer.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/type_builder_computer.dart
@@ -181,8 +181,7 @@
     } else if (kernelClassOrTypeDef is Typedef) {
       kernelLibrary = kernelClassOrTypeDef.enclosingLibrary;
     }
-    LibraryBuilder library =
-        loader.lookupLibraryBuilder(kernelLibrary!.importUri)!;
+    LibraryBuilder library = loader.builders[kernelLibrary!.importUri]!;
     return new NamedTypeBuilder(
         parameter.name!,
         new NullabilityBuilder.fromNullability(node.nullability),
diff --git a/pkg/front_end/lib/src/fasta/loader.dart b/pkg/front_end/lib/src/fasta/loader.dart
index 4173b42..5b07db1 100644
--- a/pkg/front_end/lib/src/fasta/loader.dart
+++ b/pkg/front_end/lib/src/fasta/loader.dart
@@ -21,7 +21,7 @@
 abstract class Loader {
   TargetImplementation get target;
 
-  LibraryBuilder? lookupLibraryBuilder(Uri importUri);
+  Map<Uri, LibraryBuilder> get builders;
 
   /// Register [message] as a problem with a severity determined by the
   /// intrinsic severity of the message.
diff --git a/pkg/front_end/lib/src/fasta/source/source_library_builder.dart b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
index cfb438c..189058e 100644
--- a/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
@@ -691,7 +691,7 @@
     if (!loader.target.uriTranslator.isLibrarySupported(dottedName)) return "";
 
     LibraryBuilder? imported =
-        loader.lookupLibraryBuilder(new Uri(scheme: "dart", path: dottedName));
+        loader.builders[new Uri(scheme: "dart", path: dottedName)];
 
     if (imported == null) {
       LibraryBuilder coreLibrary = loader.read(
@@ -699,8 +699,8 @@
               new Uri(scheme: "dart", path: "core").toString(), -1),
           -1,
           accessor: loader.first);
-      imported = coreLibrary.loader
-          .lookupLibraryBuilder(new Uri(scheme: 'dart', path: dottedName));
+      imported = coreLibrary
+          .loader.builders[new Uri(scheme: 'dart', path: dottedName)];
     }
     return imported != null && !imported.isSynthetic ? "true" : "";
   }
@@ -2259,10 +2259,13 @@
     bool isStatic = (modifiers & staticMask) != 0;
     bool isExternal = (modifiers & externalMask) != 0;
     final bool fieldIsLateWithLowering = isLate &&
-        loader.target.backendTarget.isLateFieldLoweringEnabled(
-            hasInitializer: hasInitializer,
-            isFinal: isFinal,
-            isStatic: isTopLevel || isStatic);
+        (loader.target.backendTarget.isLateFieldLoweringEnabled(
+                hasInitializer: hasInitializer,
+                isFinal: isFinal,
+                isStatic: isTopLevel || isStatic) ||
+            (loader.target.backendTarget.useStaticFieldLowering &&
+                (isStatic || isTopLevel)));
+
     final bool isInstanceMember = currentTypeParameterScopeBuilder.kind !=
             TypeParameterScopeKind.library &&
         (modifiers & staticMask) == 0;
diff --git a/pkg/front_end/lib/src/fasta/source/source_loader.dart b/pkg/front_end/lib/src/fasta/source/source_loader.dart
index 29c7861..4c38811 100644
--- a/pkg/front_end/lib/src/fasta/source/source_loader.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_loader.dart
@@ -34,7 +34,6 @@
 import '../../base/common.dart';
 import '../../base/instrumentation.dart' show Instrumentation;
 import '../../base/nnbd_mode.dart';
-import '../dill/dill_library_builder.dart';
 import '../builder/builder.dart';
 import '../builder/class_builder.dart';
 import '../builder/constructor_builder.dart';
@@ -142,7 +141,8 @@
 
   final SourceLoaderDataForTesting? dataForTesting;
 
-  final Map<Uri, LibraryBuilder> _builders = <Uri, LibraryBuilder>{};
+  @override
+  final Map<Uri, LibraryBuilder> builders = <Uri, LibraryBuilder>{};
 
   final Queue<LibraryBuilder> _unparsedLibraries = new Queue<LibraryBuilder>();
 
@@ -203,256 +203,15 @@
       : dataForTesting =
             retainDataForTesting ? new SourceLoaderDataForTesting() : null;
 
-  bool containsLibraryBuilder(Uri importUri) =>
-      _builders.containsKey(importUri);
-
-  @override
-  LibraryBuilder? lookupLibraryBuilder(Uri importUri) => _builders[importUri];
-
-  Iterable<LibraryBuilder> get libraryBuilders => _builders.values;
-
-  Iterable<Uri> get libraryImportUris => _builders.keys;
-
-  void registerLibraryBuilder(LibraryBuilder libraryBuilder, [Uri? uri]) {
-    uri ??= libraryBuilder.importUri;
-    if (uri.scheme == "dart" && uri.path == "core") {
-      _coreLibrary = libraryBuilder;
-    }
-    _builders[uri] = libraryBuilder;
-  }
-
-  LibraryBuilder? deregisterLibraryBuilder(Uri importUri) {
-    return _builders.remove(importUri);
-  }
-
-  void clearLibraryBuilders() {
-    _builders.clear();
-  }
-
   @override
   LibraryBuilder get coreLibrary => _coreLibrary!;
 
+  void set coreLibrary(LibraryBuilder value) {
+    _coreLibrary = value;
+  }
+
   Ticker get ticker => target.ticker;
 
-  /// Creates a [SourceLibraryBuilder] corresponding to [uri], if one doesn't
-  /// exist already.
-  ///
-  /// [fileUri] must not be null and is a URI that can be passed to FileSystem
-  /// to locate the corresponding file.
-  ///
-  /// [origin] is non-null if the created library is a patch to [origin].
-  ///
-  /// [packageUri] is the base uri for the package which the library belongs to.
-  /// For instance 'package:foo'.
-  ///
-  /// This is used to associate libraries in for instance the 'bin' and 'test'
-  /// folders of a package source with the package uri of the 'lib' folder.
-  ///
-  /// If the [packageUri] is `null` the package association of this library is
-  /// based on its [importUri].
-  ///
-  /// For libraries with a 'package:' [importUri], the package path must match
-  /// the path in the [importUri]. For libraries with a 'dart:' [importUri] the
-  /// [packageUri] must be `null`.
-  ///
-  /// [packageLanguageVersion] is the language version defined by the package
-  /// which the library belongs to, or the current sdk version if the library
-  /// doesn't belong to a package.
-  SourceLibraryBuilder createLibraryBuilder(
-      Uri uri,
-      Uri fileUri,
-      Uri? packageUri,
-      LanguageVersion packageLanguageVersion,
-      SourceLibraryBuilder? origin,
-      Library? referencesFrom,
-      bool? referenceIsPartOwner) {
-    return new SourceLibraryBuilder(
-        uri, fileUri, packageUri, packageLanguageVersion, this, origin,
-        referencesFrom: referencesFrom,
-        referenceIsPartOwner: referenceIsPartOwner);
-  }
-
-  SourceLibraryBuilder _createSourceLibraryBuilder(
-      Uri uri,
-      Uri? fileUri,
-      SourceLibraryBuilder? origin,
-      Library? referencesFrom,
-      bool? referenceIsPartOwner) {
-    if (fileUri != null &&
-        (fileUri.scheme == "dart" ||
-            fileUri.scheme == "package" ||
-            fileUri.scheme == "dart-ext")) {
-      fileUri = null;
-    }
-    package_config.Package? packageForLanguageVersion;
-    if (fileUri == null) {
-      switch (uri.scheme) {
-        case "package":
-        case "dart":
-          fileUri = target.translateUri(uri) ??
-              new Uri(
-                  scheme: untranslatableUriScheme,
-                  path: Uri.encodeComponent("$uri"));
-          if (uri.scheme == "package") {
-            packageForLanguageVersion = target.uriTranslator.getPackage(uri);
-          } else {
-            packageForLanguageVersion =
-                target.uriTranslator.packages.packageOf(fileUri);
-          }
-          break;
-
-        default:
-          fileUri = uri;
-          packageForLanguageVersion =
-              target.uriTranslator.packages.packageOf(fileUri);
-          break;
-      }
-    } else {
-      packageForLanguageVersion =
-          target.uriTranslator.packages.packageOf(fileUri);
-    }
-    LanguageVersion? packageLanguageVersion;
-    Uri? packageUri;
-    Message? packageLanguageVersionProblem;
-    if (packageForLanguageVersion != null) {
-      Uri importUri = origin?.importUri ?? uri;
-      if (importUri.scheme != 'dart' &&
-          importUri.scheme != 'package' &&
-          // ignore: unnecessary_null_comparison
-          packageForLanguageVersion.name != null) {
-        packageUri =
-            new Uri(scheme: 'package', path: packageForLanguageVersion.name);
-      }
-      if (packageForLanguageVersion.languageVersion != null) {
-        if (packageForLanguageVersion.languageVersion
-            is package_config.InvalidLanguageVersion) {
-          packageLanguageVersionProblem =
-              messageLanguageVersionInvalidInDotPackages;
-          packageLanguageVersion = new InvalidLanguageVersion(
-              fileUri, 0, noLength, target.currentSdkVersion, false);
-        } else {
-          Version version = new Version(
-              packageForLanguageVersion.languageVersion!.major,
-              packageForLanguageVersion.languageVersion!.minor);
-          if (version > target.currentSdkVersion) {
-            packageLanguageVersionProblem =
-                templateLanguageVersionTooHigh.withArguments(
-                    target.currentSdkVersion.major,
-                    target.currentSdkVersion.minor);
-            packageLanguageVersion = new InvalidLanguageVersion(
-                fileUri, 0, noLength, target.currentSdkVersion, false);
-          } else {
-            packageLanguageVersion = new ImplicitLanguageVersion(version);
-          }
-        }
-      }
-    }
-    packageLanguageVersion ??=
-        new ImplicitLanguageVersion(target.currentSdkVersion);
-
-    SourceLibraryBuilder libraryBuilder = createLibraryBuilder(
-        uri,
-        fileUri,
-        packageUri,
-        packageLanguageVersion,
-        origin,
-        referencesFrom,
-        referenceIsPartOwner);
-    if (packageLanguageVersionProblem != null) {
-      libraryBuilder.addPostponedProblem(
-          packageLanguageVersionProblem, 0, noLength, libraryBuilder.fileUri);
-    }
-
-    // Add any additional logic after this block. Setting the
-    // firstSourceUri and first library should be done as early as
-    // possible.
-    firstSourceUri ??= uri;
-    first ??= libraryBuilder;
-
-    _checkForDartCore(uri, libraryBuilder);
-
-    Uri libraryUri = origin?.importUri ?? uri;
-    if (target.backendTarget.mayDefineRestrictedType(libraryUri)) {
-      libraryBuilder.mayImplementRestrictedTypes = true;
-    }
-    if (uri.scheme == "dart") {
-      target.readPatchFiles(libraryBuilder);
-    }
-    _unparsedLibraries.addLast(libraryBuilder);
-
-    return libraryBuilder;
-  }
-
-  DillLibraryBuilder? _lookupDillLibraryBuilder(Uri uri) {
-    DillLibraryBuilder? libraryBuilder =
-        target.dillTarget.loader.lookupLibraryBuilder(uri);
-    if (libraryBuilder != null) {
-      _checkDillLibraryBuilderNnbdMode(libraryBuilder);
-      _checkForDartCore(uri, libraryBuilder);
-    }
-    return libraryBuilder;
-  }
-
-  void _checkDillLibraryBuilderNnbdMode(DillLibraryBuilder libraryBuilder) {
-    if (!libraryBuilder.isNonNullableByDefault &&
-        (nnbdMode == NnbdMode.Strong || nnbdMode == NnbdMode.Agnostic)) {
-      registerStrongOptOutLibrary(libraryBuilder);
-    } else {
-      NonNullableByDefaultCompiledMode libraryMode =
-          libraryBuilder.library.nonNullableByDefaultCompiledMode;
-      if (libraryMode == NonNullableByDefaultCompiledMode.Invalid) {
-        registerNnbdMismatchLibrary(
-            libraryBuilder, messageInvalidNnbdDillLibrary);
-      } else {
-        switch (nnbdMode) {
-          case NnbdMode.Weak:
-            if (libraryMode != NonNullableByDefaultCompiledMode.Agnostic &&
-                libraryMode != NonNullableByDefaultCompiledMode.Weak) {
-              registerNnbdMismatchLibrary(
-                  libraryBuilder, messageWeakWithStrongDillLibrary);
-            }
-            break;
-          case NnbdMode.Strong:
-            if (libraryMode != NonNullableByDefaultCompiledMode.Agnostic &&
-                libraryMode != NonNullableByDefaultCompiledMode.Strong) {
-              registerNnbdMismatchLibrary(
-                  libraryBuilder, messageStrongWithWeakDillLibrary);
-            }
-            break;
-          case NnbdMode.Agnostic:
-            if (libraryMode != NonNullableByDefaultCompiledMode.Agnostic) {
-              if (libraryMode == NonNullableByDefaultCompiledMode.Strong) {
-                registerNnbdMismatchLibrary(
-                    libraryBuilder, messageAgnosticWithStrongDillLibrary);
-              } else {
-                registerNnbdMismatchLibrary(
-                    libraryBuilder, messageAgnosticWithWeakDillLibrary);
-              }
-            }
-            break;
-        }
-      }
-    }
-  }
-
-  void _checkForDartCore(Uri uri, LibraryBuilder libraryBuilder) {
-    if (uri.scheme == "dart") {
-      if (uri.path == "core") {
-        _coreLibrary = libraryBuilder;
-      } else if (uri.path == "typed_data") {
-        typedDataLibrary = libraryBuilder;
-      }
-    }
-    // TODO(johnniwinther): If we save the created library in [_builders]
-    // here, i.e. before calling `target.loadExtraRequiredLibraries` below,
-    // the order of the libraries change, making `dart:core` come before the
-    // required arguments. Currently [DillLoader.appendLibrary] one works
-    // when this is not the case.
-    if (_coreLibrary == libraryBuilder) {
-      target.loadExtraRequiredLibraries(this);
-    }
-  }
-
   /// Look up a library builder by the [uri], or if such doesn't exist, create
   /// one. The canonical URI of the library is [uri], and its actual location is
   /// [fileUri].
@@ -470,28 +229,135 @@
       LibraryBuilder? origin,
       Library? referencesFrom,
       bool? referenceIsPartOwner}) {
-    LibraryBuilder? libraryBuilder = _builders[uri];
-    if (libraryBuilder == null) {
-      if (target.dillTarget.isLoaded) {
-        libraryBuilder = _lookupDillLibraryBuilder(uri);
+    LibraryBuilder builder = builders.putIfAbsent(uri, () {
+      if (fileUri != null &&
+          (fileUri!.scheme == "dart" ||
+              fileUri!.scheme == "package" ||
+              fileUri!.scheme == "dart-ext")) {
+        fileUri = null;
       }
-      if (libraryBuilder == null) {
-        libraryBuilder = _createSourceLibraryBuilder(
-            uri,
-            fileUri,
-            origin as SourceLibraryBuilder?,
-            referencesFrom,
-            referenceIsPartOwner);
+      package_config.Package? packageForLanguageVersion;
+      if (fileUri == null) {
+        switch (uri.scheme) {
+          case "package":
+          case "dart":
+            fileUri = target.translateUri(uri) ??
+                new Uri(
+                    scheme: untranslatableUriScheme,
+                    path: Uri.encodeComponent("$uri"));
+            if (uri.scheme == "package") {
+              packageForLanguageVersion = target.uriTranslator.getPackage(uri);
+            } else {
+              packageForLanguageVersion =
+                  target.uriTranslator.packages.packageOf(fileUri!);
+            }
+            break;
+
+          default:
+            fileUri = uri;
+            packageForLanguageVersion =
+                target.uriTranslator.packages.packageOf(fileUri!);
+            break;
+        }
+      } else {
+        packageForLanguageVersion =
+            target.uriTranslator.packages.packageOf(fileUri!);
+      }
+      LanguageVersion? packageLanguageVersion;
+      Uri? packageUri;
+      Message? packageLanguageVersionProblem;
+      if (packageForLanguageVersion != null) {
+        Uri importUri = origin?.importUri ?? uri;
+        if (importUri.scheme != 'dart' &&
+            importUri.scheme != 'package' &&
+            // ignore: unnecessary_null_comparison
+            packageForLanguageVersion.name != null) {
+          packageUri =
+              new Uri(scheme: 'package', path: packageForLanguageVersion.name);
+        }
+        if (packageForLanguageVersion.languageVersion != null) {
+          if (packageForLanguageVersion.languageVersion
+              is package_config.InvalidLanguageVersion) {
+            packageLanguageVersionProblem =
+                messageLanguageVersionInvalidInDotPackages;
+            packageLanguageVersion = new InvalidLanguageVersion(
+                fileUri!, 0, noLength, target.currentSdkVersion, false);
+          } else {
+            Version version = new Version(
+                packageForLanguageVersion.languageVersion!.major,
+                packageForLanguageVersion.languageVersion!.minor);
+            if (version > target.currentSdkVersion) {
+              packageLanguageVersionProblem =
+                  templateLanguageVersionTooHigh.withArguments(
+                      target.currentSdkVersion.major,
+                      target.currentSdkVersion.minor);
+              packageLanguageVersion = new InvalidLanguageVersion(
+                  fileUri!, 0, noLength, target.currentSdkVersion, false);
+            } else {
+              packageLanguageVersion = new ImplicitLanguageVersion(version);
+            }
+          }
+        }
+      }
+      packageLanguageVersion ??=
+          new ImplicitLanguageVersion(target.currentSdkVersion);
+
+      LibraryBuilder library = target.createLibraryBuilder(
+          uri,
+          fileUri!,
+          packageUri,
+          packageLanguageVersion,
+          origin as SourceLibraryBuilder?,
+          referencesFrom,
+          referenceIsPartOwner);
+      if (packageLanguageVersionProblem != null &&
+          library is SourceLibraryBuilder) {
+        library.addPostponedProblem(
+            packageLanguageVersionProblem, 0, noLength, library.fileUri);
       }
 
-      _builders[uri] = libraryBuilder;
-    }
+      if (uri.scheme == "dart") {
+        if (uri.path == "core") {
+          _coreLibrary = library;
+        } else if (uri.path == "typed_data") {
+          typedDataLibrary = library;
+        }
+      }
+      if (library.loader != this) {
+        if (_coreLibrary == library) {
+          target.loadExtraRequiredLibraries(this);
+        }
+        // This library isn't owned by this loader, so no further processing
+        // should be attempted.
+        return library;
+      }
+
+      {
+        // Add any additional logic after this block. Setting the
+        // firstSourceUri and first library should be done as early as
+        // possible.
+        firstSourceUri ??= uri;
+        first ??= library;
+      }
+      if (_coreLibrary == library) {
+        target.loadExtraRequiredLibraries(this);
+      }
+      Uri libraryUri = origin?.importUri ?? uri;
+      if (target.backendTarget.mayDefineRestrictedType(libraryUri)) {
+        library.mayImplementRestrictedTypes = true;
+      }
+      if (uri.scheme == "dart") {
+        target.readPatchFiles(library as SourceLibraryBuilder);
+      }
+      _unparsedLibraries.addLast(library);
+      return library;
+    });
     if (accessor == null) {
-      if (libraryBuilder.loader == this && first != libraryBuilder) {
+      if (builder.loader == this && first != builder) {
         unhandled("null", "accessor", charOffset, uri);
       }
     } else {
-      libraryBuilder.recordAccess(charOffset, noLength, accessor.fileUri);
+      builder.recordAccess(charOffset, noLength, accessor.fileUri);
       if (!accessor.isPatch &&
           !accessor.isPart &&
           !target.backendTarget
@@ -500,7 +366,7 @@
             noLength, accessor.fileUri);
       }
     }
-    return libraryBuilder;
+    return builder;
   }
 
   void _ensureCoreLibrary() {
@@ -516,7 +382,7 @@
 
   Future<Null> buildBodies() async {
     assert(_coreLibrary != null);
-    for (LibraryBuilder library in libraryBuilders) {
+    for (LibraryBuilder library in builders.values) {
       if (library.loader == this) {
         currentUriForCrashReporting = library.importUri;
         await buildBody(library);
@@ -529,7 +395,7 @@
   void logSummary(Template<SummaryTemplate> template) {
     ticker.log((Duration elapsed, Duration sinceStart) {
       int libraryCount = 0;
-      for (LibraryBuilder library in libraryBuilders) {
+      for (LibraryBuilder library in builders.values) {
         if (library.loader == this) libraryCount++;
       }
       double ms = elapsed.inMicroseconds / Duration.microsecondsPerMillisecond;
@@ -1046,7 +912,7 @@
   void resolveParts() {
     List<Uri> parts = <Uri>[];
     List<SourceLibraryBuilder> libraries = <SourceLibraryBuilder>[];
-    _builders.forEach((Uri uri, LibraryBuilder library) {
+    builders.forEach((Uri uri, LibraryBuilder library) {
       if (library.loader == this) {
         if (library.isPart) {
           parts.add(uri);
@@ -1061,17 +927,16 @@
     }
     for (Uri uri in parts) {
       if (usedParts.contains(uri)) {
-        _builders.remove(uri);
+        builders.remove(uri);
       } else {
-        SourceLibraryBuilder part =
-            lookupLibraryBuilder(uri) as SourceLibraryBuilder;
+        SourceLibraryBuilder part = builders[uri] as SourceLibraryBuilder;
         part.addProblem(messagePartOrphan, 0, 1, part.fileUri);
         part.validatePart(null, null);
       }
     }
     ticker.logMs("Resolved parts");
 
-    for (LibraryBuilder library in libraryBuilders) {
+    for (LibraryBuilder library in builders.values) {
       if (library.loader == this) {
         library.applyPatches();
       }
@@ -1082,7 +947,7 @@
   void computeLibraryScopes() {
     Set<LibraryBuilder> exporters = new Set<LibraryBuilder>();
     Set<LibraryBuilder> exportees = new Set<LibraryBuilder>();
-    for (LibraryBuilder library in libraryBuilders) {
+    for (LibraryBuilder library in builders.values) {
       if (library.loader == this) {
         SourceLibraryBuilder sourceLibrary = library as SourceLibraryBuilder;
         sourceLibrary.buildInitialScopes();
@@ -1116,7 +981,7 @@
         }
       }
     } while (wasChanged);
-    for (LibraryBuilder library in libraryBuilders) {
+    for (LibraryBuilder library in builders.values) {
       if (library.loader == this) {
         SourceLibraryBuilder sourceLibrary = library as SourceLibraryBuilder;
         sourceLibrary.addImportsToScope();
@@ -1135,7 +1000,7 @@
 
   void debugPrintExports() {
     // TODO(sigmund): should be `covariant SourceLibraryBuilder`.
-    _builders.forEach((Uri uri, dynamic l) {
+    builders.forEach((Uri uri, dynamic l) {
       SourceLibraryBuilder library = l;
       Set<Builder> members = new Set<Builder>();
       Iterator<Builder> iterator = library.iterator;
@@ -1159,7 +1024,7 @@
 
   void resolveTypes() {
     int typeCount = 0;
-    for (LibraryBuilder library in libraryBuilders) {
+    for (LibraryBuilder library in builders.values) {
       if (library.loader == this) {
         SourceLibraryBuilder sourceLibrary = library as SourceLibraryBuilder;
         typeCount += sourceLibrary.resolveTypes();
@@ -1170,7 +1035,7 @@
 
   void finishDeferredLoadTearoffs() {
     int count = 0;
-    for (LibraryBuilder library in libraryBuilders) {
+    for (LibraryBuilder library in builders.values) {
       if (library.loader == this) {
         count += library.finishDeferredLoadTearoffs();
       }
@@ -1180,7 +1045,7 @@
 
   void finishNoSuchMethodForwarders() {
     int count = 0;
-    for (LibraryBuilder library in libraryBuilders) {
+    for (LibraryBuilder library in builders.values) {
       if (library.loader == this) {
         count += library.finishForwarders();
       }
@@ -1190,7 +1055,7 @@
 
   void resolveConstructors() {
     int count = 0;
-    for (LibraryBuilder library in libraryBuilders) {
+    for (LibraryBuilder library in builders.values) {
       if (library.loader == this) {
         count += library.resolveConstructors(null);
       }
@@ -1200,7 +1065,7 @@
 
   void installTypedefTearOffs() {
     if (target.backendTarget.isTypedefTearOffLoweringEnabled) {
-      for (LibraryBuilder library in libraryBuilders) {
+      for (LibraryBuilder library in builders.values) {
         if (library.loader == this && library is SourceLibraryBuilder) {
           library.installTypedefTearOffs();
         }
@@ -1210,7 +1075,7 @@
 
   void finishTypeVariables(ClassBuilder object, TypeBuilder dynamicType) {
     int count = 0;
-    for (LibraryBuilder library in libraryBuilders) {
+    for (LibraryBuilder library in builders.values) {
       if (library.loader == this) {
         count += library.finishTypeVariables(object, dynamicType);
       }
@@ -1220,7 +1085,7 @@
 
   void computeVariances() {
     int count = 0;
-    for (LibraryBuilder library in libraryBuilders) {
+    for (LibraryBuilder library in builders.values) {
       if (library.loader == this) {
         count += library.computeVariances();
       }
@@ -1231,7 +1096,7 @@
   void computeDefaultTypes(TypeBuilder dynamicType, TypeBuilder nullType,
       TypeBuilder bottomType, ClassBuilder objectClass) {
     int count = 0;
-    for (LibraryBuilder library in libraryBuilders) {
+    for (LibraryBuilder library in builders.values) {
       if (library.loader == this) {
         count += library.computeDefaultTypes(
             dynamicType, nullType, bottomType, objectClass);
@@ -1242,7 +1107,7 @@
 
   void finishNativeMethods() {
     int count = 0;
-    for (LibraryBuilder library in libraryBuilders) {
+    for (LibraryBuilder library in builders.values) {
       if (library.loader == this) {
         count += library.finishNativeMethods();
       }
@@ -1252,7 +1117,7 @@
 
   void finishPatchMethods() {
     int count = 0;
-    for (LibraryBuilder library in libraryBuilders) {
+    for (LibraryBuilder library in builders.values) {
       if (library.loader == this) {
         count += library.finishPatchMethods();
       }
@@ -1291,7 +1156,7 @@
   List<SourceClassBuilder> handleHierarchyCycles(ClassBuilder objectClass) {
     // Compute the initial work list of all classes declared in this loader.
     List<SourceClassBuilder> workList = <SourceClassBuilder>[];
-    for (LibraryBuilder library in libraryBuilders) {
+    for (LibraryBuilder library in builders.values) {
       if (library.loader == this) {
         Iterator<Builder> members = library.iterator;
         while (members.moveNext()) {
@@ -1490,7 +1355,7 @@
 
   /// Builds the core AST structure needed for the outline of the component.
   void buildComponent() {
-    for (LibraryBuilder library in libraryBuilders) {
+    for (LibraryBuilder library in builders.values) {
       if (library.loader == this) {
         SourceLibraryBuilder sourceLibrary = library as SourceLibraryBuilder;
         Library target = sourceLibrary.build(coreLibrary);
@@ -1510,7 +1375,7 @@
   Component computeFullComponent() {
     Set<Library> libraries = new Set<Library>();
     List<Library> workList = <Library>[];
-    for (LibraryBuilder libraryBuilder in libraryBuilders) {
+    for (LibraryBuilder libraryBuilder in builders.values) {
       if (!libraryBuilder.isPatch &&
           (libraryBuilder.loader == this ||
               libraryBuilder.importUri.scheme == "dart" ||
@@ -1557,7 +1422,7 @@
   }
 
   void computeShowHideElements() {
-    for (LibraryBuilder libraryBuilder in libraryBuilders) {
+    for (LibraryBuilder libraryBuilder in builders.values) {
       if (libraryBuilder.loader == this &&
           libraryBuilder is SourceLibraryBuilder) {
         libraryBuilder.computeShowHideElements(_builderHierarchy!);
@@ -1605,7 +1470,7 @@
   }
 
   void checkTypes() {
-    for (LibraryBuilder library in libraryBuilders) {
+    for (LibraryBuilder library in builders.values) {
       if (library is SourceLibraryBuilder) {
         if (library.loader == this) {
           library
@@ -1686,7 +1551,7 @@
       List<SynthesizedFunctionNode> synthesizedFunctionNodes) {
     List<DelayedActionPerformer> delayedActionPerformers =
         <DelayedActionPerformer>[];
-    for (LibraryBuilder library in libraryBuilders) {
+    for (LibraryBuilder library in builders.values) {
       if (library.loader == this) {
         (library as SourceLibraryBuilder).buildOutlineExpressions();
         Iterator<Builder> iterator = library.iterator;
@@ -1743,7 +1608,7 @@
     builderHierarchy.computeTypes();
 
     List<FieldBuilder> allImplicitlyTypedFields = <FieldBuilder>[];
-    for (LibraryBuilder library in libraryBuilders) {
+    for (LibraryBuilder library in builders.values) {
       if (library.loader == this) {
         List<FieldBuilder>? implicitlyTypedFields =
             library.takeImplicitlyTypedFields();
@@ -1839,7 +1704,7 @@
   void checkMainMethods() {
     DartType? listOfString;
 
-    for (LibraryBuilder libraryBuilder in libraryBuilders) {
+    for (LibraryBuilder libraryBuilder in builders.values) {
       if (libraryBuilder.loader == this &&
           libraryBuilder.isNonNullableByDefault) {
         Builder? mainBuilder =
@@ -1968,7 +1833,7 @@
     hierarchy = null;
     _builderHierarchy = null;
     _typeInferenceEngine = null;
-    _builders.clear();
+    builders.clear();
     libraries.clear();
     first = null;
     sourceBytes.clear();
@@ -1982,7 +1847,7 @@
   @override
   ClassBuilder computeClassBuilderFromTargetClass(Class cls) {
     Library kernelLibrary = cls.enclosingLibrary;
-    LibraryBuilder? library = lookupLibraryBuilder(kernelLibrary.importUri);
+    LibraryBuilder? library = builders[kernelLibrary.importUri];
     if (library == null) {
       return target.dillTarget.loader.computeClassBuilderFromTargetClass(cls);
     }
diff --git a/pkg/front_end/lib/src/testing/id_testing_utils.dart b/pkg/front_end/lib/src/testing/id_testing_utils.dart
index 4c4f476..02297a9 100644
--- a/pkg/front_end/lib/src/testing/id_testing_utils.dart
+++ b/pkg/front_end/lib/src/testing/id_testing_utils.dart
@@ -124,7 +124,7 @@
     InternalCompilerResult compilerResult, Library library,
     {bool required: true}) {
   SourceLoader loader = compilerResult.kernelTargetForTesting!.loader;
-  LibraryBuilder? builder = loader.lookupLibraryBuilder(library.importUri);
+  LibraryBuilder? builder = loader.builders[library.importUri];
   if (builder == null && required) {
     throw new ArgumentError("DeclarationBuilder for $library not found.");
   }
diff --git a/pkg/front_end/test/crashing_test_case_minimizer_impl.dart b/pkg/front_end/test/crashing_test_case_minimizer_impl.dart
index dfd6efa..e8e1ed7 100644
--- a/pkg/front_end/test/crashing_test_case_minimizer_impl.dart
+++ b/pkg/front_end/test/crashing_test_case_minimizer_impl.dart
@@ -1767,8 +1767,7 @@
 
   bool _knownByCompiler(Uri uri) {
     LibraryBuilder? libraryBuilder = _latestCrashingIncrementalCompiler!
-        .userCode!.loader
-        .lookupLibraryBuilder(_getImportUri(uri));
+        .userCode!.loader.builders[_getImportUri(uri)];
     if (libraryBuilder != null) {
       return true;
     }
@@ -1786,14 +1785,13 @@
   bool _isUriNnbd(Uri uri, {bool crashOnFail: true}) {
     Uri asImportUri = _getImportUri(uri);
     LibraryBuilder? libraryBuilder = _latestCrashingIncrementalCompiler!
-        .userCode!.loader
-        .lookupLibraryBuilder(asImportUri);
+        .userCode!.loader.builders[asImportUri];
     if (libraryBuilder != null) {
       return libraryBuilder.isNonNullableByDefault;
     }
     print("Couldn't lookup $uri");
     for (LibraryBuilder libraryBuilder in _latestCrashingIncrementalCompiler!
-        .userCode!.loader.libraryBuilders) {
+        .userCode!.loader.builders.values) {
       if (libraryBuilder.importUri == uri) {
         print("Found $uri as ${libraryBuilder.importUri} (!= ${asImportUri})");
         return libraryBuilder.isNonNullableByDefault;
diff --git a/pkg/front_end/test/fasta/testing/suite.dart b/pkg/front_end/test/fasta/testing/suite.dart
index 0c88143..b933c35 100644
--- a/pkg/front_end/test/fasta/testing/suite.dart
+++ b/pkg/front_end/test/fasta/testing/suite.dart
@@ -1343,7 +1343,7 @@
     // Create lookup-table from file uri to whatever.
     Map<Uri, LibraryBuilder> builders = {};
     for (LibraryBuilder builder
-        in incrementalCompiler.userCode!.loader.libraryBuilders) {
+        in incrementalCompiler.userCode!.loader.builders.values) {
       if (builder.importUri.scheme == "dart" && !builder.isSynthetic) continue;
       builders[builder.fileUri] = builder;
       for (LibraryPart part in builder.library.parts) {
diff --git a/pkg/front_end/test/incremental_suite.dart b/pkg/front_end/test/incremental_suite.dart
index 2ce5c81..30745c3 100644
--- a/pkg/front_end/test/incremental_suite.dart
+++ b/pkg/front_end/test/incremental_suite.dart
@@ -1941,7 +1941,7 @@
         .computeDelta(entryPoints: entryPoints, fullComponent: fullComponent);
 
     // We should at least have the SDK builders available. Slight smoke test.
-    if (!dillLoadedData!.loader.libraryImportUris
+    if (!dillLoadedData!.loader.builders.keys
         .map((uri) => uri.toString())
         .contains("dart:core")) {
       throw "Loaders builder should contain the sdk, "
diff --git a/pkg/front_end/test/spell_checking_list_code.txt b/pkg/front_end/test/spell_checking_list_code.txt
index 5746a68..44c927d 100644
--- a/pkg/front_end/test/spell_checking_list_code.txt
+++ b/pkg/front_end/test/spell_checking_list_code.txt
@@ -317,7 +317,6 @@
 deps
 dereferenced
 dereferencing
-deregister
 descent
 deserializer
 deserializers
diff --git a/pkg/front_end/testing.json b/pkg/front_end/testing.json
index d2a057e..bc37385 100644
--- a/pkg/front_end/testing.json
+++ b/pkg/front_end/testing.json
@@ -248,7 +248,7 @@
       "pattern": [
         "pkg/front_end/.*\\.dart$",
         "pkg/front_end/.*\\.crash_dart$",
-        "/tests/.*\\.dart$"
+        "tests/.*\\.dart$"
       ],
       "exclude": []
     },
@@ -392,7 +392,7 @@
       "kind": "test_dart",
       "arch": "x64",
       "mode": "release",
-      "common": "--dart2js-batch --time -pcolor --report -ax64 -mrelease --write-result-log",
+      "common": "--time -pcolor --report -ax64 -mrelease --write-result-log",
       "command-lines": [
         "--checked dart2js",
         "-cdart2js -rd8 --exclude-suite=observatory_ui",
@@ -418,7 +418,7 @@
       "kind": "test_dart",
       "arch": "x64",
       "mode": "release",
-      "common": "--dart2js-batch --time -pcolor --report -ax64 -mrelease --write-result-log",
+      "common": "--time -pcolor --report -ax64 -mrelease --write-result-log",
       "command-lines": [
         "-t240 --checked pkg/(kernel|front_end|fasta) dart2js",
         "-cdartk -rvm",
@@ -432,7 +432,7 @@
       "kind": "test_dart",
       "arch": "x64",
       "mode": "release",
-      "common": "--dart2js-batch --time -pcolor --report -ax64 -mrelease --write-result-log",
+      "common": "--time -pcolor --report -ax64 -mrelease --write-result-log",
       "command-lines": [
         "-cdart2js -rd8 --use-sdk --minified language language_2 web_2 corelib corelib_2"
       ]
diff --git a/pkg/front_end/tool/dart_doctest_impl.dart b/pkg/front_end/tool/dart_doctest_impl.dart
index 1e51b84..3ef774c 100644
--- a/pkg/front_end/tool/dart_doctest_impl.dart
+++ b/pkg/front_end/tool/dart_doctest_impl.dart
@@ -51,7 +51,6 @@
     show useImplicitCreationExpressionInCfe;
 // ignore: import_of_legacy_library_into_null_safe
 import 'package:front_end/src/fasta/source/source_library_builder.dart';
-import 'package:front_end/src/fasta/source/source_loader.dart';
 import 'package:front_end/src/fasta/uri_translator.dart';
 import 'package:kernel/kernel.dart' as kernel
     show Combinator, Component, LibraryDependency, Library, Location, Source;
@@ -879,20 +878,7 @@
       : super(fileSystem, includeComments, dillTarget, uriTranslator);
 
   @override
-  SourceLoader createLoader() {
-    return new DocTestSourceLoader(compiler, fileSystem, includeComments, this);
-  }
-}
-
-class DocTestSourceLoader extends SourceLoader {
-  final DocTestIncrementalCompiler compiler;
-
-  DocTestSourceLoader(this.compiler, FileSystem fileSystem,
-      bool includeComments, DocTestIncrementalKernelTarget target)
-      : super(fileSystem, includeComments, target);
-
-  @override
-  SourceLibraryBuilder createLibraryBuilder(
+  LibraryBuilder createLibraryBuilder(
       Uri uri,
       Uri fileUri,
       Uri? packageUri,
diff --git a/pkg/frontend_server/test/src/javascript_bundle_test.dart b/pkg/frontend_server/test/src/javascript_bundle_test.dart
index d927f82..69a7156 100644
--- a/pkg/frontend_server/test/src/javascript_bundle_test.dart
+++ b/pkg/frontend_server/test/src/javascript_bundle_test.dart
@@ -40,7 +40,6 @@
   'dart:svg': [],
   'dart:web_audio': [],
   'dart:web_gl': [],
-  'dart:web_sql': [],
   'dart:_js_helper': [
     'PrivateSymbol',
     'LinkedMap',
diff --git a/pkg/kernel/lib/ast.dart b/pkg/kernel/lib/ast.dart
index 19b2465..3bddafe 100644
--- a/pkg/kernel/lib/ast.dart
+++ b/pkg/kernel/lib/ast.dart
@@ -3181,6 +3181,9 @@
       function = v.transform(function);
       function.parent = this;
     }
+    if (signatureType != null) {
+      signatureType = v.visitDartType(signatureType!) as FunctionType;
+    }
   }
 
   @override
@@ -3191,6 +3194,15 @@
       function = v.transform(function);
       function.parent = this;
     }
+    if (signatureType != null) {
+      DartType newSignatureType =
+          v.visitDartType(signatureType!, dummyDartType);
+      if (identical(newSignatureType, dummyDartType)) {
+        signatureType = null;
+      } else {
+        signatureType = newSignatureType as FunctionType;
+      }
+    }
   }
 
   @override
diff --git a/pkg/kernel/lib/transformations/value_class.dart b/pkg/kernel/lib/transformations/value_class.dart
index 2a96ffd..f69a386 100644
--- a/pkg/kernel/lib/transformations/value_class.dart
+++ b/pkg/kernel/lib/transformations/value_class.dart
@@ -9,6 +9,7 @@
 import '../ast.dart';
 import '../core_types.dart' show CoreTypes;
 import '../class_hierarchy.dart' show ClassHierarchy;
+import '../reference_from_index.dart';
 import './scanner.dart';
 
 class ValueClassScanner extends ClassScanner<Null> {
@@ -64,12 +65,23 @@
   }
 }
 
-void transformComponent(Component node, CoreTypes coreTypes,
-    ClassHierarchy hierarchy, TypeEnvironment typeEnvironment) {
+void transformComponent(
+    Component node,
+    CoreTypes coreTypes,
+    ClassHierarchy hierarchy,
+    ReferenceFromIndex? referenceFromIndex,
+    TypeEnvironment typeEnvironment) {
   ValueClassScanner scanner = new ValueClassScanner();
   ScanResult<Class, Null> valueClasses = scanner.scan(node);
   for (Class valueClass in valueClasses.targets.keys) {
-    transformValueClass(valueClass, coreTypes, hierarchy, typeEnvironment);
+    transformValueClass(
+        valueClass,
+        coreTypes,
+        hierarchy,
+        referenceFromIndex
+            ?.lookupLibrary(valueClass.enclosingLibrary)
+            ?.lookupIndexedClass(valueClass.name),
+        typeEnvironment);
   }
 
   treatCopyWithCallSites(node, coreTypes, typeEnvironment, hierarchy);
@@ -79,8 +91,12 @@
   }
 }
 
-void transformValueClass(Class cls, CoreTypes coreTypes,
-    ClassHierarchy hierarchy, TypeEnvironment typeEnvironment) {
+void transformValueClass(
+    Class cls,
+    CoreTypes coreTypes,
+    ClassHierarchy hierarchy,
+    IndexedClass? indexedClass,
+    TypeEnvironment typeEnvironment) {
   Constructor? syntheticConstructor = null;
   for (Constructor constructor in cls.constructors) {
     if (constructor.isSynthetic) {
@@ -93,11 +109,11 @@
   allVariablesList.sort((a, b) => a.name!.compareTo(b.name!));
 
   addConstructor(cls, coreTypes, syntheticConstructor!);
-  addEqualsOperator(cls, coreTypes, hierarchy, allVariablesList);
-  addHashCode(cls, coreTypes, hierarchy, allVariablesList);
-  addToString(cls, coreTypes, hierarchy, allVariablesList);
-  addCopyWith(cls, coreTypes, hierarchy, allVariablesList, syntheticConstructor,
-      typeEnvironment);
+  addEqualsOperator(cls, coreTypes, hierarchy, indexedClass, allVariablesList);
+  addHashCode(cls, coreTypes, hierarchy, indexedClass, allVariablesList);
+  addToString(cls, coreTypes, hierarchy, indexedClass, allVariablesList);
+  addCopyWith(cls, coreTypes, hierarchy, indexedClass, allVariablesList,
+      syntheticConstructor, typeEnvironment);
 }
 
 void addConstructor(
@@ -137,7 +153,7 @@
 }
 
 void addEqualsOperator(Class cls, CoreTypes coreTypes, ClassHierarchy hierarchy,
-    List<VariableDeclaration> allVariablesList) {
+    IndexedClass? indexedClass, List<VariableDeclaration> allVariablesList) {
   List<VariableDeclaration> allVariables = allVariablesList.toList();
   for (Procedure procedure in cls.procedures) {
     if (procedure.kind == ProcedureKind.Operator &&
@@ -167,8 +183,9 @@
     targets[variable] = target;
   }
 
+  Name name = Name("==");
   Procedure equalsOperator = Procedure(
-      Name("=="),
+      name,
       ProcedureKind.Operator,
       FunctionNode(
           ReturnStatement(allVariables
@@ -184,13 +201,14 @@
                       previousValue!, LogicalExpressionOperator.AND, element))),
           returnType: returnType,
           positionalParameters: [other]),
-      fileUri: cls.fileUri)
+      fileUri: cls.fileUri,
+      reference: indexedClass?.lookupGetterReference(name))
     ..fileOffset = cls.fileOffset;
   cls.addProcedure(equalsOperator);
 }
 
 void addHashCode(Class cls, CoreTypes coreTypes, ClassHierarchy hierarchy,
-    List<VariableDeclaration> allVariablesList) {
+    IndexedClass? indexedClass, List<VariableDeclaration> allVariablesList) {
   List<VariableDeclaration> allVariables = allVariablesList.toList();
   for (Procedure procedure in cls.procedures) {
     if (procedure.kind == ProcedureKind.Getter &&
@@ -234,8 +252,9 @@
     targetsHashcode[variable] = targetHashcode;
     targets[variable] = target;
   }
+  Name name = Name("hashCode");
   cls.addProcedure(Procedure(
-      Name("hashCode"),
+      name,
       ProcedureKind.Getter,
       FunctionNode(
           ReturnStatement(StaticInvocation(
@@ -259,12 +278,13 @@
                             hashCombine!, Arguments([previousValue, element])))
               ]))),
           returnType: returnType),
-      fileUri: cls.fileUri)
+      fileUri: cls.fileUri,
+      reference: indexedClass?.lookupGetterReference(name))
     ..fileOffset = cls.fileOffset);
 }
 
 void addToString(Class cls, CoreTypes coreTypes, ClassHierarchy hierarchy,
-    List<VariableDeclaration> allVariablesList) {
+    IndexedClass? indexedClass, List<VariableDeclaration> allVariablesList) {
   List<Expression> wording = [StringLiteral("${cls.name}(")];
 
   for (VariableDeclaration variable in allVariablesList) {
@@ -291,12 +311,14 @@
   }
   DartType returnType =
       coreTypes.stringRawType(cls.enclosingLibrary.nonNullable);
+  Name name = Name("toString");
   cls.addProcedure(Procedure(
-      Name("toString"),
+      name,
       ProcedureKind.Method,
       FunctionNode(ReturnStatement(StringConcatenation(wording)),
           returnType: returnType),
-      fileUri: cls.fileUri)
+      fileUri: cls.fileUri,
+      reference: indexedClass?.lookupGetterReference(name))
     ..fileOffset = cls.fileOffset);
 }
 
@@ -304,6 +326,7 @@
     Class cls,
     CoreTypes coreTypes,
     ClassHierarchy hierarchy,
+    IndexedClass? indexedClass,
     List<VariableDeclaration> allVariablesList,
     Constructor syntheticConstructor,
     TypeEnvironment typeEnvironment) {
@@ -324,8 +347,9 @@
     targets[variable] = target;
   }
 
+  Name name = Name("copyWith");
   cls.addProcedure(Procedure(
-      Name("copyWith"),
+      name,
       ProcedureKind.Method,
       FunctionNode(
           ReturnStatement(ConstructorInvocation(
@@ -335,7 +359,8 @@
                       .map((f) => NamedExpression(f.name!, VariableGet(f)))
                       .toList()))),
           namedParameters: allVariables),
-      fileUri: cls.fileUri)
+      fileUri: cls.fileUri,
+      reference: indexedClass?.lookupGetterReference(name))
     ..fileOffset = cls.fileOffset);
 }
 
diff --git a/pkg/nnbd_migration/test/abstract_context.dart b/pkg/nnbd_migration/test/abstract_context.dart
index 88ee434..3d5267f 100644
--- a/pkg/nnbd_migration/test/abstract_context.dart
+++ b/pkg/nnbd_migration/test/abstract_context.dart
@@ -41,6 +41,8 @@
 
   String get homePath => '/home';
 
+  Folder get sdkRoot => newFolder('/sdk');
+
   AnalysisSession get session => driver!.currentSession;
 
   String get testsPath => '$homePath/tests';
@@ -164,7 +166,10 @@
     setupResourceProvider();
     overlayResourceProvider = OverlayResourceProvider(resourceProvider);
 
-    MockSdk(resourceProvider: resourceProvider);
+    createMockSdk(
+      resourceProvider: resourceProvider,
+      root: sdkRoot,
+    );
 
     newFolder(testsPath);
     newFile('$testsPath/.packages', content: '''
@@ -217,7 +222,7 @@
       includedPaths: [convertPath(homePath)],
       enableIndex: true,
       resourceProvider: overlayResourceProvider,
-      sdkPath: convertPath('/sdk'),
+      sdkPath: sdkRoot.path,
     );
 
     _driver = getDriver(convertPath(testsPath));
diff --git a/pkg/nnbd_migration/test/migration_cli_test.dart b/pkg/nnbd_migration/test/migration_cli_test.dart
index e4df376..08b16bc 100644
--- a/pkg/nnbd_migration/test/migration_cli_test.dart
+++ b/pkg/nnbd_migration/test/migration_cli_test.dart
@@ -41,6 +41,8 @@
   });
 }
 
+const sdkRootPathPosix = '/sdk';
+
 /// Specialization of [InstrumentationListener] that generates artificial
 /// exceptions, so that we can test they are properly propagated to top level.
 class _ExceptionGeneratingInstrumentationListener
@@ -97,7 +99,7 @@
             binaryName: 'nnbd_migration',
             loggerFactory: (isVerbose) => _test.logger = TestLogger(isVerbose),
             defaultSdkPathOverride:
-                _test.resourceProvider.convertPath(mock_sdk.sdkRoot),
+                _test.resourceProvider.convertPath(sdkRootPathPosix),
             resourceProvider: _test.resourceProvider,
             environmentVariables: _test.environmentVariables);
 
@@ -450,7 +452,7 @@
     // the signature that was present prior to NNBD.  (This is what the
     // migration tool uses to detect an old SDK).
     var coreLib = resourceProvider.getFile(
-        resourceProvider.convertPath('${mock_sdk.sdkRoot}/lib/core/core.dart'));
+        resourceProvider.convertPath('$sdkRootPathPosix/lib/core/core.dart'));
     var oldCoreLibText = coreLib.readAsStringSync();
     var newCoreLibText = oldCoreLibText.replaceAll(
         'external bool operator ==(Object other)',
@@ -470,7 +472,7 @@
     // the signature that was present prior to NNBD.  (This is what the
     // migration tool uses to detect an old SDK).
     var coreLib = resourceProvider.getFile(
-        resourceProvider.convertPath('${mock_sdk.sdkRoot}/lib/core/core.dart'));
+        resourceProvider.convertPath('$sdkRootPathPosix/lib/core/core.dart'));
     var oldCoreLibText = coreLib.readAsStringSync();
     var newCoreLibText = oldCoreLibText.replaceAll(
         'external bool operator ==(Object other)',
@@ -597,7 +599,7 @@
 
     var projectContents = createProject();
     var projectDir = createProjectDir(projectContents);
-    var cliRunner = _createCli(nullSafePackages: ['test'])
+    var cliRunner = _createCli()
         .decodeCommandLineArgs(_parseArgs(['--apply-changes', projectDir]))!;
     await cliRunner.run();
     assertNormalExit(cliRunner);
@@ -2140,58 +2142,6 @@
 '''));
   }
 
-  test_pubspec_with_sdk_version_beta() async {
-    var projectDir = createProjectDir(simpleProject());
-    var cliRunner = _createCli(sdkVersion: '2.12.0-1.2.beta')
-        .decodeCommandLineArgs(_parseArgs(['--apply-changes', projectDir]))!;
-    await cliRunner.run();
-    assertProjectContents(
-        projectDir, simpleProject(migrated: true, pubspecText: '''
-name: test
-environment:
-  sdk: '>=2.12.0-1.2.beta <3.0.0'
-'''));
-  }
-
-  test_pubspec_with_sdk_version_dev() async {
-    var projectDir = createProjectDir(simpleProject());
-    var cliRunner = _createCli(sdkVersion: '2.12.0-1.2.dev')
-        .decodeCommandLineArgs(_parseArgs(['--apply-changes', projectDir]))!;
-    await cliRunner.run();
-    assertProjectContents(
-        projectDir, simpleProject(migrated: true, pubspecText: '''
-name: test
-environment:
-  sdk: '>=2.12.0-0 <3.0.0'
-'''));
-  }
-
-  test_pubspec_with_sdk_version_edge() async {
-    var projectDir = createProjectDir(simpleProject());
-    var cliRunner = _createCli(sdkVersion: '2.12.0-edge.1234567')
-        .decodeCommandLineArgs(_parseArgs(['--apply-changes', projectDir]))!;
-    await cliRunner.run();
-    assertProjectContents(
-        projectDir, simpleProject(migrated: true, pubspecText: '''
-name: test
-environment:
-  sdk: '>=2.12.0-0 <3.0.0'
-'''));
-  }
-
-  test_pubspec_with_sdk_version_internal() async {
-    var projectDir = createProjectDir(simpleProject());
-    var cliRunner = _createCli(sdkVersion: '2.12.0-1234567')
-        .decodeCommandLineArgs(_parseArgs(['--apply-changes', projectDir]))!;
-    await cliRunner.run();
-    assertProjectContents(
-        projectDir, simpleProject(migrated: true, pubspecText: '''
-name: test
-environment:
-  sdk: '>=2.12.0-0 <3.0.0'
-'''));
-  }
-
   test_uses_physical_resource_provider_by_default() {
     var cli = MigrationCli(binaryName: 'nnbd_migration');
     expect(cli.resourceProvider, same(PhysicalResourceProvider.INSTANCE));
@@ -2206,12 +2156,13 @@
         headers: {'Content-Type': 'application/json; charset=UTF-8'});
   }
 
-  _MigrationCli _createCli(
-      {List<String> nullSafePackages = const [], String? sdkVersion}) {
-    mock_sdk.MockSdk(
-        resourceProvider: resourceProvider,
-        nullSafePackages: nullSafePackages,
-        sdkVersion: sdkVersion);
+  _MigrationCli _createCli() {
+    mock_sdk.createMockSdk(
+      resourceProvider: resourceProvider,
+      root: resourceProvider.newFolder(
+        resourceProvider.convertPath(sdkRootPathPosix),
+      ),
+    );
     return _MigrationCli(this);
   }
 
diff --git a/pkg/test_runner/lib/src/configuration.dart b/pkg/test_runner/lib/src/configuration.dart
index 2201710..51110c0 100644
--- a/pkg/test_runner/lib/src/configuration.dart
+++ b/pkg/test_runner/lib/src/configuration.dart
@@ -31,7 +31,6 @@
       this.testList,
       this.repeat,
       this.batch,
-      this.batchDart2JS,
       this.copyCoreDumps,
       this.rr,
       this.isVerbose,
@@ -81,7 +80,6 @@
   // Boolean flags.
 
   final bool batch;
-  final bool batchDart2JS;
   final bool build;
   final bool copyCoreDumps;
   final bool rr;
diff --git a/pkg/test_runner/lib/src/options.dart b/pkg/test_runner/lib/src/options.dart
index fe3b012..bfe16f6 100644
--- a/pkg/test_runner/lib/src/options.dart
+++ b/pkg/test_runner/lib/src/options.dart
@@ -263,9 +263,7 @@
     _Option('output_directory',
         'The name of the output directory for storing log files.',
         defaultsTo: "logs", hide: true),
-    _Option.bool('noBatch', 'Do not run tests in batch mode.', hide: true),
-    _Option.bool('dart2js_batch', 'Run dart2js tests in batch mode.',
-        hide: true),
+    _Option.bool('no_batch', 'Do not run tests in batch mode.', hide: true),
     _Option.bool('write_debug_log',
         'Don\'t write debug messages to stdout but rather to a logfile.',
         hide: true),
@@ -744,8 +742,7 @@
           build: data["build"] as bool,
           testList: data["test_list_contents"] as List<String>,
           repeat: data["repeat"] as int,
-          batch: !(data["noBatch"] as bool),
-          batchDart2JS: data["dart2js_batch"] as bool,
+          batch: !(data["no_batch"] as bool),
           copyCoreDumps: data["copy_coredumps"] as bool,
           rr: data["rr"] as bool,
           isVerbose: data["verbose"] as bool,
diff --git a/pkg/test_runner/lib/src/process_queue.dart b/pkg/test_runner/lib/src/process_queue.dart
index 2943b26..2965f44 100644
--- a/pkg/test_runner/lib/src/process_queue.dart
+++ b/pkg/test_runner/lib/src/process_queue.dart
@@ -568,16 +568,12 @@
       assert(name == 'vm_compile_to_kernel');
       return _getBatchRunner(name)
           .runCommand(name, command, timeout, command.arguments);
-    } else if (command is CompilationCommand &&
-        globalConfiguration.batchDart2JS &&
-        command.displayName == 'dart2js') {
-      return _getBatchRunner("dart2js")
-          .runCommand("dart2js", command, timeout, command.arguments);
     } else if (command is AnalysisCommand && globalConfiguration.batch) {
       return _getBatchRunner(command.displayName)
           .runCommand(command.displayName, command, timeout, command.arguments);
     } else if (command is CompilationCommand &&
-        (command.displayName == 'dartdevc' ||
+        (command.displayName == 'dart2js' ||
+            command.displayName == 'dartdevc' ||
             command.displayName == 'dartdevk' ||
             command.displayName == 'fasta') &&
         globalConfiguration.batch) {
diff --git a/pkg/test_runner/lib/src/test_configurations.dart b/pkg/test_runner/lib/src/test_configurations.dart
index bbacb13..6d7f1f8 100644
--- a/pkg/test_runner/lib/src/test_configurations.dart
+++ b/pkg/test_runner/lib/src/test_configurations.dart
@@ -268,8 +268,7 @@
     await Future.wait(serverFutures);
   }
 
-  // [firstConf] is needed here, since the ProcessQueue needs to know the
-  // settings of 'noBatch' and 'local_ip'
+  // [firstConf] is needed here, because the ProcessQueue uses some settings.
   ProcessQueue(firstConf, maxProcesses, maxBrowserProcesses, testSuites,
       eventListener, allTestsFinished, verbose, adbDevicePool);
 }
diff --git a/pkg/test_runner/test/test_runner_test.dart b/pkg/test_runner/test/test_runner_test.dart
index 3d9ab93..2fd217a 100644
--- a/pkg/test_runner/test/test_runner_test.dart
+++ b/pkg/test_runner/test/test_runner_test.dart
@@ -120,7 +120,7 @@
 void testProcessQueue() {
   var maxProcesses = 2;
   var maxBrowserProcesses = maxProcesses;
-  var config = OptionsParser().parse(['--noBatch'])[0];
+  var config = OptionsParser().parse(['--no-batch'])[0];
   ProcessQueue(config, maxProcesses, maxBrowserProcesses,
       [CustomTestSuite(config)], [EventListener()], TestController.finished);
 }
diff --git a/pkg/vm/lib/target/vm.dart b/pkg/vm/lib/target/vm.dart
index 4316715..cb866c8 100644
--- a/pkg/vm/lib/target/vm.dart
+++ b/pkg/vm/lib/target/vm.dart
@@ -18,12 +18,12 @@
 import '../transformations/call_site_annotator.dart' as callSiteAnnotator;
 import '../transformations/lowering.dart' as lowering
     show transformLibraries, transformProcedure;
-import '../transformations/ffi.dart' as ffiHelper show importsFfi;
-import '../transformations/ffi_definitions.dart' as transformFfiDefinitions
+import '../transformations/ffi/common.dart' as ffiHelper show importsFfi;
+import '../transformations/ffi/definitions.dart' as transformFfiDefinitions
     show transformLibraries;
-import '../transformations/ffi_native.dart' as transformFfiNative
+import '../transformations/ffi/native.dart' as transformFfiNative
     show transformLibraries;
-import '../transformations/ffi_use_sites.dart' as transformFfiUseSites
+import '../transformations/ffi/use_sites.dart' as transformFfiUseSites
     show transformLibraries;
 
 /// Specializes the kernel IR to the Dart VM.
diff --git a/pkg/vm/lib/transformations/ffi.dart b/pkg/vm/lib/transformations/ffi/common.dart
similarity index 100%
rename from pkg/vm/lib/transformations/ffi.dart
rename to pkg/vm/lib/transformations/ffi/common.dart
diff --git a/pkg/vm/lib/transformations/ffi_definitions.dart b/pkg/vm/lib/transformations/ffi/definitions.dart
similarity index 99%
rename from pkg/vm/lib/transformations/ffi_definitions.dart
rename to pkg/vm/lib/transformations/ffi/definitions.dart
index f9ef464..49a4b8d 100644
--- a/pkg/vm/lib/transformations/ffi_definitions.dart
+++ b/pkg/vm/lib/transformations/ffi/definitions.dart
@@ -31,7 +31,7 @@
 import 'package:kernel/type_environment.dart' show SubtypeCheckMode;
 import 'package:kernel/util/graph.dart';
 
-import 'ffi.dart';
+import 'common.dart';
 
 /// Checks and elaborates the dart:ffi compounds and their fields.
 ///
diff --git a/pkg/vm/lib/transformations/ffi_native.dart b/pkg/vm/lib/transformations/ffi/native.dart
similarity index 98%
rename from pkg/vm/lib/transformations/ffi_native.dart
rename to pkg/vm/lib/transformations/ffi/native.dart
index ebd2cf6..bf8a531 100644
--- a/pkg/vm/lib/transformations/ffi_native.dart
+++ b/pkg/vm/lib/transformations/ffi/native.dart
@@ -17,7 +17,7 @@
 import 'package:kernel/target/targets.dart' show DiagnosticReporter;
 import 'package:kernel/type_environment.dart';
 
-import 'ffi.dart' show FfiTransformer;
+import 'common.dart' show FfiTransformer;
 
 /// Transform @FfiNative annotated functions into FFI native function pointer
 /// functions.
@@ -180,6 +180,13 @@
             named: [NamedExpression('isLeaf', BoolLiteral(isLeaf.value))]))
       ..fileOffset = fileOffset;
 
+    var fileUri = currentLibrary.fileUri;
+    if (parent is Class) {
+      fileUri = parent.fileUri;
+    } else if (parent is Library) {
+      fileUri = parent.fileUri;
+    }
+
     // static final _doXyz$FfiNative$Ptr = ...
     final fieldName =
         Name('_$dartFunctionName\$FfiNative\$Ptr', currentLibrary);
@@ -188,7 +195,7 @@
         initializer: asFunctionInvocation,
         isStatic: true,
         isFinal: true,
-        fileUri: currentLibrary.fileUri,
+        fileUri: fileUri,
         getterReference: currentLibraryIndex?.lookupGetterReference(fieldName))
       ..fileOffset = fileOffset;
 
diff --git a/pkg/vm/lib/transformations/ffi_use_sites.dart b/pkg/vm/lib/transformations/ffi/use_sites.dart
similarity index 99%
rename from pkg/vm/lib/transformations/ffi_use_sites.dart
rename to pkg/vm/lib/transformations/ffi/use_sites.dart
index 403feb9..744bc00 100644
--- a/pkg/vm/lib/transformations/ffi_use_sites.dart
+++ b/pkg/vm/lib/transformations/ffi/use_sites.dart
@@ -26,7 +26,7 @@
 import 'package:kernel/type_algebra.dart' show Substitution;
 import 'package:kernel/type_environment.dart';
 
-import 'ffi.dart'
+import 'common.dart'
     show
         NativeType,
         FfiTransformer,
diff --git a/pkg/vm/lib/transformations/ffi_checks.md b/pkg/vm/lib/transformations/ffi_checks.md
deleted file mode 100644
index ed1ce41..0000000
--- a/pkg/vm/lib/transformations/ffi_checks.md
+++ /dev/null
@@ -1,69 +0,0 @@
-# FFI static checks
-
-## Translating FFI types
-
-The FFI library defines a number of "native" types, which have corresponding
-Dart types. This is a many-to-one mapping, defined by `DartRepresentationOf` in
-`native_type.dart`.
-
-## Subtyping restrictions
-
-No class may extend, implement or mixin any classes inside the FFI library, with
-the following exception. Any class may extend (but not implement or mixin)
-`ffi.Struct`. In this case, the subclass is considered a *struct class*. No
-class may extend, implement or mixin a struct class.
-
-## Struct rules
-
-The following restrictions apply to struct classes:
-
-- A struct class must not be generic.
-- A struct class `X` must extend `Struct<X>`. That is, the type argument to the
-  superclass must be exactly the subclass itself.
-
-Some restrictions apply to fields of struct classes:
-
-- A field of a struct class must not have an initializer.
-- A field of a struct class must either have a type which is a subtype of
-  `ffi.Pointer` or else be annotated by one of the following types:
-    - `ffi.UintN` or `ffi.IntN` for any N
-    - `ffi.Float` or `ffi.Double`
-  If the field is annotated, the Dart version of the annotated type must be
-  identical to the field's declared type. Note that struct classes currently
-  must not be used as fields.
-- A field of a struct class must not have more than one annotation corresponding
-  to an FFI native type.
-
-Finally, struct classes must not have constructors with field initializers.
-
-## `fromFunction` rules
-
-The following restrictions apply to static invocations of the factory
-constructor `Pointer<T>.fromFunction(f, e)`. Dynamic invocations of this method,
-e.g. through mirrors, are runtime errors. `T` must be a subtype of
-`NativeFunction<T'>` for some `T'`. Let `F` be the Dart type which corresponds
-to static type of `T'` and `R` be the return type of `F`.
-
-- `T` must be instantiated; i.e., it must not reference any class or function
-  type parameters.
-- The static type of `f` must be a subtype of `F`.
-- Struct classes are not allowed as the top-level class in a parameter or return
-  type of `F`.
-- The static type of `e` must be a subtype of `R`.
-- `e` must be an expression which is legal in a constant context.
-- `f` must be a direct reference to a top-level method.
-- `e` must not be provided if `R` is `void` or `ffi.Pointer`.
-- `e` must be provided otherwise.
-
-## `asFunction` and `lookupFunction ` rules
-
-The following restrictions apply to statically resolved invocations of the
-instance method `Pointer<T>.asFunction<F>()` and
-`DynamicLibrary.lookupFunction<S, F>()`. Dynamic invocations of these methods,
-e.g. through mirrors or a receiver of static type `dynamic`, are runtime errors.
-`T` must be a subtype of `NativeFunction<T'>` for some `T'`. Let `F'` be the
-Dart type which corresponds to static type of `T'`/`S`.
-
-- `T`, `S` and `F` must be constants; i.e., they must not reference any class or
-  function type parameters.
-- `F'` must be a subtype of `F`.
diff --git a/pkg/vm/test/transformations/ffinative_test.dart b/pkg/vm/test/transformations/ffinative_test.dart
index dfcb6f4..a6326a1 100644
--- a/pkg/vm/test/transformations/ffinative_test.dart
+++ b/pkg/vm/test/transformations/ffinative_test.dart
@@ -13,7 +13,7 @@
 
 import 'package:test/test.dart';
 
-import 'package:vm/transformations/ffi_native.dart' show transformLibraries;
+import 'package:vm/transformations/ffi/native.dart' show transformLibraries;
 
 import '../common_test_utils.dart';
 
diff --git a/runtime/bin/BUILD.gn b/runtime/bin/BUILD.gn
index 727ccb9..ea7d40d 100644
--- a/runtime/bin/BUILD.gn
+++ b/runtime/bin/BUILD.gn
@@ -203,6 +203,7 @@
       frameworks = [
         "CoreFoundation.framework",
         "CoreServices.framework",
+        "Foundation.framework",
       ]
     }
 
@@ -336,6 +337,12 @@
       "io_natives.cc",
       "io_natives.h",
     ]
+    if (is_ios || is_mac) {
+      sources += [
+        "platform_macos_cocoa.h",
+        "platform_macos_cocoa.mm",
+      ]
+    }
 
     include_dirs = [
       "..",
@@ -412,6 +419,7 @@
       frameworks = [
         "CoreFoundation.framework",
         "Security.framework",
+        "Foundation.framework",
       ]
 
       if (is_mac) {
@@ -437,6 +445,12 @@
                  "io_natives.cc",
                  "io_natives.h",
                ] + extra_sources
+    if (is_ios || is_mac) {
+      sources += [
+        "platform_macos_cocoa.h",
+        "platform_macos_cocoa.mm",
+      ]
+    }
 
     if (is_linux || is_win || is_fuchsia) {
       if (dart_use_fallback_root_certificates) {
diff --git a/runtime/bin/io_impl_sources.gni b/runtime/bin/io_impl_sources.gni
index 8c368bb..33090f3 100644
--- a/runtime/bin/io_impl_sources.gni
+++ b/runtime/bin/io_impl_sources.gni
@@ -109,7 +109,4 @@
   "typed_data_utils.h",
 ]
 
-io_impl_tests = [
-  "platform_macos_test.cc",
-  "secure_socket_utils_test.cc",
-]
+io_impl_tests = [ "secure_socket_utils_test.cc" ]
diff --git a/runtime/bin/platform_macos.cc b/runtime/bin/platform_macos.cc
index 26f40a4..0c22675 100644
--- a/runtime/bin/platform_macos.cc
+++ b/runtime/bin/platform_macos.cc
@@ -22,8 +22,11 @@
 #include <sys/utsname.h>   // NOLINT
 #include <unistd.h>        // NOLINT
 
+#include <string>
+
 #include "bin/console.h"
 #include "bin/file.h"
+#include "bin/platform_macos_cocoa.h"
 
 namespace dart {
 namespace bin {
@@ -113,89 +116,9 @@
 #endif
 }
 
-char* ExtractsOSVersionFromString(char* str) {
-  char* pos = strstr(str, "<key>ProductVersion</key>");
-  if (pos == NULL) {
-    return NULL;
-  }
-  pos = strstr(pos, "<string>");
-  if (pos == NULL) {
-    return NULL;
-  }
-  // Shift the index by the length of "<string>".
-  pos += 8;
-  char* end_pos = strstr(pos, "</string>");
-  if (end_pos == NULL) {
-    return NULL;
-  }
-
-  int length = end_pos - pos;
-  char* result =
-      reinterpret_cast<char*>(Dart_ScopeAllocate(length * sizeof(char)) + 1);
-  strncpy(result, pos, length);
-  result[length] = '\0';
-  return result;
-}
-
-static char* GetOSVersionFromPlist() {
-  const char* path = "/System/Library/CoreServices/SystemVersion.plist";
-  File* file = File::Open(NULL, path, File::kRead);
-  if (file == NULL) {
-    return NULL;
-  }
-  int length = file->Length();
-  if (length < 0) {
-    return NULL;
-  }
-  char* buffer =
-      reinterpret_cast<char*>(Dart_ScopeAllocate(length * sizeof(char) + 1));
-  int bytes = file->ReadFully(buffer, length);
-  buffer[length * sizeof(char)] = '\0';
-  file->Close();
-  file->Release();
-  if (bytes < 0) {
-    return NULL;
-  }
-  return ExtractsOSVersionFromString(buffer);
-}
-
 const char* Platform::OperatingSystemVersion() {
-  char str[64];
-  size_t size = sizeof(str);
-  // This is only available to some versions later than 10.13.*. If it failed,
-  // try to read from "SystemVersion.plist".
-  int res = sysctlbyname("kern.osproductversion", str, &size, NULL, 0);
-  if (res == 0) {
-    int len = snprintf(NULL, 0, "%s", str);
-    char* result_string = DartUtils::ScopedCString(len + 1);
-    strncpy(result_string, str, len);
-    result_string[len] = '\0';
-    return result_string;
-  }
-  char* result_string = GetOSVersionFromPlist();
-  if (result_string != NULL) {
-    return result_string;
-  }
-
-  struct utsname info;
-  int ret = uname(&info);
-  if (ret != 0) {
-    return NULL;
-  }
-  const char* kFormat = "%s %s %s";
-  int len =
-      snprintf(NULL, 0, kFormat, info.sysname, info.release, info.version);
-  if (len <= 0) {
-    return NULL;
-  }
-  char* result = DartUtils::ScopedCString(len + 1);
-  ASSERT(result != NULL);
-  len = snprintf(result, len + 1, kFormat, info.sysname, info.release,
-                 info.version);
-  if (len <= 0) {
-    return NULL;
-  }
-  return result;
+  std::string version(NSProcessInfoOperatingSystemVersionString());
+  return DartUtils::ScopedCopyCString(version.c_str());
 }
 
 const char* Platform::LibraryPrefix() {
diff --git a/runtime/bin/platform_macos_cocoa.h b/runtime/bin/platform_macos_cocoa.h
new file mode 100644
index 0000000..b166432
--- /dev/null
+++ b/runtime/bin/platform_macos_cocoa.h
@@ -0,0 +1,30 @@
+// Copyright (c) 2021, 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.
+
+#ifndef RUNTIME_BIN_PLATFORM_MACOS_COCOA_H_
+#define RUNTIME_BIN_PLATFORM_MACOS_COCOA_H_
+
+// platform_macos_cocoa[.h,.mm] defines a new compilation unit, written
+// in Objective-C++, that acts as a minimal bridge between platform_macos
+// and the Cocoa (https://en.wikipedia.org/wiki/Cocoa_(API)) API.
+
+#include "platform/globals.h"
+
+#if !defined(DART_HOST_OS_MACOS)
+#error Do not include platform_macos_cocoa.h on non-MacOS platforms.
+#endif
+
+#include <string>
+
+namespace dart {
+namespace bin {
+
+// Return the operating system version string.
+// See https://developer.apple.com/documentation/foundation/nsprocessinfo/1408730-operatingsystemversionstring.
+std::string NSProcessInfoOperatingSystemVersionString();
+
+}  // namespace bin
+}  // namespace dart
+
+#endif  // RUNTIME_BIN_PLATFORM_MACOS_COCOA_H_
diff --git a/runtime/bin/platform_macos_cocoa.mm b/runtime/bin/platform_macos_cocoa.mm
new file mode 100644
index 0000000..4a364e9
--- /dev/null
+++ b/runtime/bin/platform_macos_cocoa.mm
@@ -0,0 +1,29 @@
+// Copyright (c) 2021, 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.
+
+#include "platform/globals.h"
+
+#if !defined(DART_HOST_OS_MACOS)
+#error Do not build platform_macos_cocoa.mm on non-MacOS platforms.
+#endif
+
+#include "bin/platform_macos_cocoa.h"
+
+#import <Foundation/NSProcessInfo.h>
+#import <Foundation/NSString.h>
+
+namespace dart {
+namespace bin {
+
+std::string NSProcessInfoOperatingSystemVersionString() {
+  @autoreleasepool {
+    // `operatingSystemVersionString` has been available since iOS 2.0+ and macOS 10.2+.
+    NSString* version =
+        [[NSProcessInfo processInfo] operatingSystemVersionString];
+    return std::string([version UTF8String]);
+  }
+}
+
+}  // namespace bin
+}  // namespace dart
diff --git a/runtime/bin/platform_macos_test.cc b/runtime/bin/platform_macos_test.cc
deleted file mode 100644
index 3c37901..0000000
--- a/runtime/bin/platform_macos_test.cc
+++ /dev/null
@@ -1,53 +0,0 @@
-// Copyright (c) 2020, 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.
-
-#if defined(DART_HOST_OS_MACOS)
-#include "bin/platform.h"
-#include "vm/unit_test.h"
-
-namespace dart {
-
-TEST_CASE(Platform_ExtractsOSVersionFromString) {
-  char str[] =
-      "some overheads\n<key>ProductVersion</key>\nsome bytes<string>Fake "
-      "version</string>";
-  char* result = bin::ExtractsOSVersionFromString(str);
-  EXPECT(result != NULL);
-  EXPECT_STREQ("Fake version", result);
-
-  EXPECT(bin::ExtractsOSVersionFromString("<key>ProductVersion</key>") == NULL);
-
-  // Incomplete file
-  EXPECT(bin::ExtractsOSVersionFromString(
-             "<key>ProductVersion</key><string>Fake version</string") != NULL);
-
-  // A copy of actual SystemVersion.plist on mac.
-  str =
-      "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
-      "<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" "
-      "\"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n"
-      "<plist version=\"1.0\">\n"
-      "<dict>\n"
-      "        <key>ProductBuildVersion</key>\n"
-      "        <string>19E287</string>\n"
-      "        <key>ProductCopyright</key>\n"
-      "        <string>1983-2020 Apple Inc.</string>\n"
-      "        <key>ProductName</key>\n"
-      "        <string>Mac OS X</string>\n"
-      "        <key>ProductUserVisibleVersion</key>\n"
-      "        <string>10.15.4</string>\n"
-      "        <key>ProductVersion</key>\n"
-      "        <string>10.15.4</string>\n"
-      "        <key>iOSSupportVersion</key>\n"
-      "        <string>13.4</string>\n"
-      "</dict>\n"
-      "</plist>"
-
-      result = bin::ExtractsOSVersionFromString(str);
-  EXPECT(result != NULL);
-  EXPECT_STREQ("10.15.4", result);
-}
-
-}  // namespace dart
-#endif  // defined(DART_HOST_OS_MACOS)
diff --git a/runtime/vm/compiler/backend/il_arm64.cc b/runtime/vm/compiler/backend/il_arm64.cc
index aa96c5a..ce64f09 100644
--- a/runtime/vm/compiler/backend/il_arm64.cc
+++ b/runtime/vm/compiler/backend/il_arm64.cc
@@ -6082,14 +6082,14 @@
       compiler::Label* deopt =
           compiler->AddDeoptStub(deopt_id(), ICData::kDeoptBinaryInt64Op);
 
-      __ tbnz(deopt, right, kBitsPerWord - 1);
+      __ tbnz(deopt, right, compiler::target::kSmiBits + 1);
     }
 
     EmitShiftUint32ByRegister(compiler, op_kind(), out, left, right);
 
     if (!shift_count_in_range) {
       // If shift value is > 31, return zero.
-      __ CompareImmediate(right, 31);
+      __ CompareImmediate(right, 31, compiler::kObjectBytes);
       __ csel(out, out, ZR, LE);
     }
   }
diff --git a/runtime/vm/compiler/backend/il_x64.cc b/runtime/vm/compiler/backend/il_x64.cc
index b3c92e0..2ad4305 100644
--- a/runtime/vm/compiler/backend/il_x64.cc
+++ b/runtime/vm/compiler/backend/il_x64.cc
@@ -6608,12 +6608,12 @@
         compiler::Label* deopt =
             compiler->AddDeoptStub(deopt_id(), ICData::kDeoptBinaryInt64Op);
 
-        __ testq(RCX, RCX);
+        __ OBJ(test)(RCX, RCX);
         __ j(LESS, deopt);
       }
 
       compiler::Label cont;
-      __ cmpq(RCX, compiler::Immediate(kUint32ShiftCountLimit));
+      __ OBJ(cmp)(RCX, compiler::Immediate(kUint32ShiftCountLimit));
       __ j(LESS_EQUAL, &cont);
 
       __ xorl(left, left);
diff --git a/runtime/vm/heap/scavenger.cc b/runtime/vm/heap/scavenger.cc
index 8897dda..7cc5b8c 100644
--- a/runtime/vm/heap/scavenger.cc
+++ b/runtime/vm/heap/scavenger.cc
@@ -1109,8 +1109,10 @@
 
   // TODO(rmacnak): Investigate collecting a history of idle period durations.
   intptr_t used_in_words = UsedInWords();
+  intptr_t external_in_words = ExternalInWords();
   // Normal reason: new space is getting full.
-  bool for_new_space = used_in_words >= idle_scavenge_threshold_in_words_;
+  bool for_new_space = (used_in_words >= idle_scavenge_threshold_in_words_) ||
+                       (external_in_words >= idle_scavenge_threshold_in_words_);
   // New-space objects are roots during old-space GC. This means that even
   // unreachable new-space objects prevent old-space objects they reference
   // from being collected during an old-space GC. Normally this is not an
diff --git a/runtime/vm/service/service.md b/runtime/vm/service/service.md
index 1581c44..ad7d3bc 100644
--- a/runtime/vm/service/service.md
+++ b/runtime/vm/service/service.md
@@ -40,6 +40,7 @@
   - [evaluateInFrame](#evaluateinframe)
   - [getAllocationProfile](#getallocationprofile)
   - [getAllocationTraces](#getallocationtraces)
+  - [getClassList](#getclasslist)
   - [getCpuSamples](#getcpusamples)
   - [getFlagList](#getflaglist)
   - [getInstances](#getinstances)
diff --git a/sdk/lib/_internal/sdk_library_metadata/lib/libraries.dart b/sdk/lib/_internal/sdk_library_metadata/lib/libraries.dart
index b0482a8..49845a2 100644
--- a/sdk/lib/_internal/sdk_library_metadata/lib/libraries.dart
+++ b/sdk/lib/_internal/sdk_library_metadata/lib/libraries.dart
@@ -139,10 +139,6 @@
       categories: "Client",
       maturity: Maturity.WEB_STABLE,
       platforms: DART2JS_PLATFORM),
-  "web_sql": const LibraryInfo("web_sql/dart2js/web_sql_dart2js.dart",
-      categories: "Client",
-      maturity: Maturity.WEB_STABLE,
-      platforms: DART2JS_PLATFORM),
   "_internal": const LibraryInfo("internal/internal.dart",
       categories: "",
       documented: false,
diff --git a/sdk/lib/_internal/vm/lib/math_patch.dart b/sdk/lib/_internal/vm/lib/math_patch.dart
index cc1c7c0..270bbbc 100644
--- a/sdk/lib/_internal/vm/lib/math_patch.dart
+++ b/sdk/lib/_internal/vm/lib/math_patch.dart
@@ -206,6 +206,8 @@
 // TODO(iposva): Handle patch methods within a patch class correctly.
 @patch
 class Random {
+  static final Random _secureRandom = _SecureRandom();
+
   @patch
   factory Random([int? seed]) {
     var state = _Random._setupSeed((seed == null) ? _Random._nextSeed() : seed);
@@ -218,9 +220,7 @@
   }
 
   @patch
-  factory Random.secure() {
-    return new _SecureRandom();
-  }
+  factory Random.secure() => _secureRandom;
 }
 
 class _Random implements Random {
diff --git a/sdk/lib/core/exceptions.dart b/sdk/lib/core/exceptions.dart
index 5904ec5..889c991 100644
--- a/sdk/lib/core/exceptions.dart
+++ b/sdk/lib/core/exceptions.dart
@@ -166,8 +166,11 @@
 
 // Exception thrown when doing integer division with a zero divisor.
 // TODO(30743): Should be removed, and division by zero should just throw an
-// [ArgumentError].
-class IntegerDivisionByZeroException implements Exception {
+// [UnsupportedError].
+@Deprecated("Use UnsupportedError instead")
+class IntegerDivisionByZeroException implements Exception, UnsupportedError {
+  String? get message => "Division resulted in non-finite value";
+  StackTrace? get stackTrace => null;
   @pragma("vm:entry-point")
   const IntegerDivisionByZeroException();
   String toString() => "IntegerDivisionByZeroException";
diff --git a/sdk/lib/core/num.dart b/sdk/lib/core/num.dart
index 74dfd78..f7b72a5 100644
--- a/sdk/lib/core/num.dart
+++ b/sdk/lib/core/num.dart
@@ -142,11 +142,19 @@
 
   /// Truncating division operator.
   ///
-  /// If either operand is a [double] then the result of the truncating division
-  /// `a ~/ b` is equivalent to `(a / b).truncate().toInt()`.
+  /// Performs truncating division of this number by [other].
+  /// Truncating division is division where a fractional result
+  /// is converted to an integer by rounding towards zero.
   ///
-  /// If both operands are [int]s then `a ~/ b` performs the truncating
-  /// integer division.
+  /// If both operands are [int]s then [other] must not be zero.
+  /// Then `a ~/ b` corresponds to `a.remainder(b)`
+  /// such that `a == (a ~/ b) * b + a.remainder(b)`.
+  ///
+  /// If either operand is a [double] then the other operand is converted
+  /// to a double before performing the division and truncation of the result.
+  /// Then `a ~/ b` is equivalent to `(a / b).truncate()`.
+  /// This means that the intermediate result of the double division
+  /// must be a finite integer (not an infinity or [double.nan]).
   int operator ~/(num other);
 
   /// The negation of this value.
diff --git a/sdk/lib/html/dart2js/html_dart2js.dart b/sdk/lib/html/dart2js/html_dart2js.dart
index 5d53fb1..0bdc1ef 100644
--- a/sdk/lib/html/dart2js/html_dart2js.dart
+++ b/sdk/lib/html/dart2js/html_dart2js.dart
@@ -31,7 +31,6 @@
 import 'dart:web_audio' show AudioBuffer, AudioTrack, AudioTrackList;
 import 'dart:web_gl' as gl;
 import 'dart:web_gl' show RenderingContext, RenderingContext2;
-import 'dart:web_sql';
 import 'dart:_foreign_helper' show JS, JS_INTERCEPTOR_CONSTANT;
 import 'dart:js_util' as js_util;
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -9212,13 +9211,6 @@
 
 // WARNING: Do not edit - generated code.
 
-typedef void DatabaseCallback(SqlDatabase database);
-// Copyright (c) 2012, 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.
-
-// WARNING: Do not edit - generated code.
-
 typedef void DecodeErrorCallback(DomException error);
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -32982,16 +32974,6 @@
   @JSName('moveTo')
   void _moveTo(int x, int y) native;
 
-  @JSName('openDatabase')
-
-  /// *Deprecated.*
-  @SupportedBrowser(SupportedBrowser.CHROME)
-  @SupportedBrowser(SupportedBrowser.SAFARI)
-  @Creates('SqlDatabase')
-  SqlDatabase _openDatabase(
-      String name, String version, String displayName, int estimatedSize,
-      [DatabaseCallback? creationCallback]) native;
-
   void postMessage(/*any*/ message, String targetOrigin,
       [List<Object>? transfer]) {
     if (transfer != null) {
@@ -33679,26 +33661,6 @@
     _moveTo(p.x.toInt(), p.y.toInt());
   }
 
-  @JSName('openDatabase')
-  @SupportedBrowser(SupportedBrowser.CHROME)
-  @SupportedBrowser(SupportedBrowser.SAFARI)
-  @Creates('SqlDatabase')
-  @deprecated
-  SqlDatabase openDatabase(
-      String name, String version, String displayName, int estimatedSize,
-      [DatabaseCallback? creationCallback]) {
-    var db;
-    if (creationCallback == null)
-      db = _openDatabase(name, version, displayName, estimatedSize);
-    else
-      db = _openDatabase(
-          name, version, displayName, estimatedSize, creationCallback);
-
-    applyExtension('Database', db);
-
-    return db;
-  }
-
   int get pageXOffset => JS<num>('num', '#.pageXOffset', this).round();
 
   int get pageYOffset => JS<num>('num', '#.pageYOffset', this).round();
diff --git a/sdk/lib/io/platform.dart b/sdk/lib/io/platform.dart
index 72053f5..06dd98f 100644
--- a/sdk/lib/io/platform.dart
+++ b/sdk/lib/io/platform.dart
@@ -121,7 +121,7 @@
   ///   "mycomputer"
   ///
   /// Uses the platform
-  /// [`gethostname`](https://pubs.opengroup.org/onlinepubs/9699919799/)
+  /// [`gethostname`](https://pubs.opengroup.org/onlinepubs/9699919799/functions/gethostname.html)
   /// implementation.
   static String get localHostname => _localHostname;
 
diff --git a/sdk/lib/js_util/js_util.dart b/sdk/lib/js_util/js_util.dart
index db385b6..7842a32 100644
--- a/sdk/lib/js_util/js_util.dart
+++ b/sdk/lib/js_util/js_util.dart
@@ -64,65 +64,63 @@
   return _convert(data)!;
 }
 
-dynamic newObject() => JS('=Object', '{}');
+T newObject<T>() => JS('=Object', '{}');
 
 bool hasProperty(Object o, Object name) => JS('bool', '# in #', name, o);
 
-// A CFE transformation will optimize all calls to `getProperty`.
-dynamic getProperty(Object o, Object name) =>
-    JS('Object|Null', '#[#]', o, name);
+T getProperty<T>(Object o, Object name) => JS('Object|Null', '#[#]', o, name);
 
 // A CFE transformation may optimize calls to `setProperty`, when [value] is
 // statically known to be a non-function.
-dynamic setProperty(Object o, Object name, Object? value) {
+T setProperty<T>(Object o, Object name, T? value) {
   assertInterop(value);
   return JS('', '#[#]=#', o, name, value);
 }
 
 /// Unchecked version of setProperty, only used in a CFE transformation.
 @pragma('dart2js:tryInline')
-dynamic _setPropertyUnchecked(Object o, Object name, Object? value) {
+T _setPropertyUnchecked<T>(Object o, Object name, T? value) {
   return JS('', '#[#]=#', o, name, value);
 }
 
 // A CFE transformation may optimize calls to `callMethod` when [args] is a
 // a list literal or const list containing at most 4 values, all of which are
 // statically known to be non-functions.
-dynamic callMethod(Object o, String method, List<Object?> args) {
+T callMethod<T>(Object o, String method, List<Object?> args) {
   assertInteropArgs(args);
   return JS('Object|Null', '#[#].apply(#, #)', o, method, o, args);
 }
 
 /// Unchecked version for 0 arguments, only used in a CFE transformation.
 @pragma('dart2js:tryInline')
-dynamic _callMethodUnchecked0(Object o, String method) {
+T _callMethodUnchecked0<T>(Object o, String method) {
   return JS('Object|Null', '#[#]()', o, method);
 }
 
 /// Unchecked version for 1 argument, only used in a CFE transformation.
 @pragma('dart2js:tryInline')
-dynamic _callMethodUnchecked1(Object o, String method, Object? arg1) {
+T _callMethodUnchecked1<T>(Object o, String method, Object? arg1) {
   return JS('Object|Null', '#[#](#)', o, method, arg1);
 }
 
 /// Unchecked version for 2 arguments, only used in a CFE transformation.
 @pragma('dart2js:tryInline')
-dynamic _callMethodUnchecked2(
+T _callMethodUnchecked2<T>(
     Object o, String method, Object? arg1, Object? arg2) {
   return JS('Object|Null', '#[#](#, #)', o, method, arg1, arg2);
 }
 
 /// Unchecked version for 3 arguments, only used in a CFE transformation.
 @pragma('dart2js:tryInline')
-dynamic _callMethodUnchecked3(
+T _callMethodUnchecked3<T>(
     Object o, String method, Object? arg1, Object? arg2, Object? arg3) {
   return JS('Object|Null', '#[#](#, #, #)', o, method, arg1, arg2, arg3);
 }
 
 /// Unchecked version for 4 arguments, only used in a CFE transformation.
 @pragma('dart2js:tryInline')
-dynamic _callMethodUnchecked4(Object o, String method, Object? arg1,
-    Object? arg2, Object? arg3, Object? arg4) {
+T _callMethodUnchecked4<T>(Object o, String method, Object? arg1, Object? arg2,
+    Object? arg3, Object? arg4) {
   return JS(
       'Object|Null', '#[#](#, #, #, #)', o, method, arg1, arg2, arg3, arg4);
 }
@@ -134,7 +132,7 @@
 bool instanceof(Object? o, Object type) =>
     JS('bool', '# instanceof #', o, type);
 
-dynamic callConstructor(Object constr, List<Object?>? arguments) {
+T callConstructor<T>(Object constr, List<Object?>? arguments) {
   if (arguments == null) {
     return JS('Object', 'new #()', constr);
   } else {
@@ -197,32 +195,32 @@
 
 /// Unchecked version for 0 arguments, only used in a CFE transformation.
 @pragma('dart2js:tryInline')
-dynamic _callConstructorUnchecked0(Object constr) {
+T _callConstructorUnchecked0<T>(Object constr) {
   return JS('Object', 'new #()', constr);
 }
 
 /// Unchecked version for 1 argument, only used in a CFE transformation.
 @pragma('dart2js:tryInline')
-dynamic _callConstructorUnchecked1(Object constr, Object? arg1) {
+T _callConstructorUnchecked1<T>(Object constr, Object? arg1) {
   return JS('Object', 'new #(#)', constr, arg1);
 }
 
 /// Unchecked version for 2 arguments, only used in a CFE transformation.
 @pragma('dart2js:tryInline')
-dynamic _callConstructorUnchecked2(Object constr, Object? arg1, Object? arg2) {
+T _callConstructorUnchecked2<T>(Object constr, Object? arg1, Object? arg2) {
   return JS('Object', 'new #(#, #)', constr, arg1, arg2);
 }
 
 /// Unchecked version for 3 arguments, only used in a CFE transformation.
 @pragma('dart2js:tryInline')
-dynamic _callConstructorUnchecked3(
+T _callConstructorUnchecked3<T>(
     Object constr, Object? arg1, Object? arg2, Object? arg3) {
   return JS('Object', 'new #(#, #, #)', constr, arg1, arg2, arg3);
 }
 
 /// Unchecked version for 4 arguments, only used in a CFE transformation.
 @pragma('dart2js:tryInline')
-dynamic _callConstructorUnchecked4(
+T _callConstructorUnchecked4<T>(
     Object constr, Object? arg1, Object? arg2, Object? arg3, Object? arg4) {
   return JS('Object', 'new #(#, #, #, #)', constr, arg1, arg2, arg3, arg4);
 }
diff --git a/sdk/lib/libraries.json b/sdk/lib/libraries.json
index 2ca5b70..c59dc6f 100644
--- a/sdk/lib/libraries.json
+++ b/sdk/lib/libraries.json
@@ -231,9 +231,6 @@
       "web_gl": {
         "uri": "web_gl/dart2js/web_gl_dart2js.dart"
       },
-      "web_sql": {
-        "uri": "web_sql/dart2js/web_sql_dart2js.dart"
-      },
       "_dart2js_runtime_metrics": {
         "uri": "_internal/js_runtime/lib/dart2js_runtime_metrics.dart"
       },
@@ -476,10 +473,7 @@
       },
       "web_gl": {
         "uri": "web_gl/dart2js/web_gl_dart2js.dart"
-      },
-      "web_sql": {
-        "uri": "web_sql/dart2js/web_sql_dart2js.dart"
       }
     }
   }
-}
\ No newline at end of file
+}
diff --git a/sdk/lib/libraries.yaml b/sdk/lib/libraries.yaml
index 1066ab0..812487a 100644
--- a/sdk/lib/libraries.yaml
+++ b/sdk/lib/libraries.yaml
@@ -229,9 +229,6 @@
     web_gl:
       uri: "web_gl/dart2js/web_gl_dart2js.dart"
 
-    web_sql:
-      uri: "web_sql/dart2js/web_sql_dart2js.dart"
-
     _dart2js_runtime_metrics:
       uri: "_internal/js_runtime/lib/dart2js_runtime_metrics.dart"
 
@@ -470,6 +467,3 @@
 
       web_gl:
         uri: "web_gl/dart2js/web_gl_dart2js.dart"
-
-      web_sql:
-        uri: "web_sql/dart2js/web_sql_dart2js.dart"
diff --git a/tests/corelib/duration_test.dart b/tests/corelib/duration_test.dart
index 1f8c543..7080723 100644
--- a/tests/corelib/duration_test.dart
+++ b/tests/corelib/duration_test.dart
@@ -205,7 +205,7 @@
   Expect.equals(-3600000000, d.inMicroseconds);
   d = d1 * 0;
   Expect.equals(0, d.inMicroseconds);
-  Expect.throws(() => d1 ~/ 0, (e) => e is IntegerDivisionByZeroException);
+  Expect.throws(() => d1 ~/ 0, (e) => e is UnsupportedError);
 
   d = new Duration(microseconds: 0);
   Expect.isTrue(d < new Duration(microseconds: 1));
diff --git a/tests/corelib_2/duration_test.dart b/tests/corelib_2/duration_test.dart
index 1e5c5a3..fb80464 100644
--- a/tests/corelib_2/duration_test.dart
+++ b/tests/corelib_2/duration_test.dart
@@ -207,7 +207,7 @@
   Expect.equals(-3600000000, d.inMicroseconds);
   d = d1 * 0;
   Expect.equals(0, d.inMicroseconds);
-  Expect.throws(() => d1 ~/ 0, (e) => e is IntegerDivisionByZeroException);
+  Expect.throws(() => d1 ~/ 0, (e) => e is UnsupportedError);
 
   d = new Duration(microseconds: 0);
   Expect.isTrue(d < new Duration(microseconds: 1));
diff --git a/tests/language/library/env_test.dart b/tests/language/library/env_test.dart
index a80b8c1..9adcf8d 100644
--- a/tests/language/library/env_test.dart
+++ b/tests/language/library/env_test.dart
@@ -47,10 +47,6 @@
         expectedResult,
         const bool.fromEnvironment("dart.library.web_gl",
             defaultValue: NOT_PRESENT));
-    Expect.equals(
-        expectedResult,
-        const bool.fromEnvironment("dart.library.web_sql",
-            defaultValue: NOT_PRESENT));
   }
 
   bool? hasIoSupport;
diff --git a/tests/language/operator/div_with_power_of_two2_test.dart b/tests/language/operator/div_with_power_of_two2_test.dart
index ef58026..72cddc6 100644
--- a/tests/language/operator/div_with_power_of_two2_test.dart
+++ b/tests/language/operator/div_with_power_of_two2_test.dart
@@ -146,7 +146,6 @@
         Expect.equals(res, f(arg));
       }
     }
-    Expect.throws(() => divBy0(4),
-        (e) => e is IntegerDivisionByZeroException || e is UnsupportedError);
+    Expect.throws<UnsupportedError>(() => divBy0(4));
   }
 }
diff --git a/tests/language/operator/integer_division_by_zero_test.dart b/tests/language/operator/integer_division_by_zero_test.dart
index 03cd661..117bd18 100644
--- a/tests/language/operator/integer_division_by_zero_test.dart
+++ b/tests/language/operator/integer_division_by_zero_test.dart
@@ -7,8 +7,43 @@
 
 import "package:expect/expect.dart";
 
-divBy0(a) => a ~/ 0;
+num divBy(num a, num b) => a ~/ b;
 
 main() {
-  Expect.throws(() => divBy0(4), (e) => e is IntegerDivisionByZeroException);
+  // Dividing integers by zero is an error.
+  Expect.throws<Error>(() => divBy(1, 0));
+  Expect.throws<Error>(() => divBy(0, 0));
+
+  // Dividing doubles by zero is an error (result is never finite).
+  Expect.throws<Error>(() => divBy(1.0, 0));
+  Expect.throws<Error>(() => divBy(1, 0.0));
+  Expect.throws<Error>(() => divBy(1, -0.0));
+  Expect.throws<Error>(() => divBy(1.0, 0.0));
+  // Double division yielding infinity is an error, even when not dividing
+  // by zero.
+  Expect.throws<Error>(() => divBy(double.maxFinite, 0.5));
+  Expect.throws<Error>(() => divBy(1, double.minPositive));
+  Expect.throws<Error>(() => divBy(double.infinity, 2.0));
+  Expect.throws<Error>(() => divBy(-double.maxFinite, 0.5));
+  Expect.throws<Error>(() => divBy(-1, double.minPositive));
+  Expect.throws<Error>(() => divBy(-double.infinity, 2.0));
+  // Double division yielding NaN is an error.
+  Expect.throws<Error>(() => divBy(0.0, 0.0));
+  Expect.throws<Error>(() => divBy(double.infinity, double.infinity));
+  Expect.throws<Error>(() => divBy(-0.0, 0.0));
+  Expect.throws<Error>(() => divBy(-double.infinity, double.infinity));
+
+  // Truncating division containing a double truncates to max integer
+  // on non-web.
+  num one = 1;
+  if (one is! double) {
+    var minInt = -0x8000000000000000;
+    var maxInt = minInt - 1;
+    Expect.isTrue(maxInt > 0);
+    // Not on web.
+    Expect.equals(divBy(double.maxFinite, 2), maxInt);
+    Expect.equals(divBy(-double.maxFinite, 2), minInt);
+    Expect.equals(divBy(maxInt, 0.25), maxInt);
+    Expect.equals(divBy(minInt, 0.25), minInt);
+  }
 }
diff --git a/tests/language/operator/modulo_test.dart b/tests/language/operator/modulo_test.dart
index ae55626..8f20730 100644
--- a/tests/language/operator/modulo_test.dart
+++ b/tests/language/operator/modulo_test.dart
@@ -13,11 +13,11 @@
   for (int i = -30; i < 30; i++) {
     Expect.equals(i % 256, foo(i));
     Expect.equals(i % -256, boo(i));
-    Expect.throws(() => hoo(i), (e) => e is IntegerDivisionByZeroException);
+    Expect.throws(() => hoo(i), (e) => e is UnsupportedError);
 
     Expect.equals(i ~/ 254 + i % 254, fooTwo(i));
     Expect.equals(i ~/ -254 + i % -254, booTwo(i));
-    Expect.throws(() => hooTwo(i), (e) => e is IntegerDivisionByZeroException);
+    Expect.throws(() => hooTwo(i), (e) => e is UnsupportedError);
     if (i > 0) {
       Expect.equals(i % 10, noDom(i));
     } else {
@@ -35,8 +35,8 @@
       Expect.equals(i ~/ i + i % i, fooTwo2(i));
     }
   }
-  Expect.throws(() => foo2(0), (e) => e is IntegerDivisionByZeroException);
-  Expect.throws(() => fooTwo2(0), (e) => e is IntegerDivisionByZeroException);
+  Expect.throws(() => foo2(0), (e) => e is UnsupportedError);
+  Expect.throws(() => fooTwo2(0), (e) => e is UnsupportedError);
 }
 
 foo(i) => i % 256; // This will get optimized to AND instruction.
diff --git a/tests/language/operator/truncdiv_test.dart b/tests/language/operator/truncdiv_test.dart
index bd043d1..12b53fe 100644
--- a/tests/language/operator/truncdiv_test.dart
+++ b/tests/language/operator/truncdiv_test.dart
@@ -17,10 +17,8 @@
     }
   }
   // We don't specify the exact exception type here, that is covered in
-  // truncdiv_zero_test. The correct answer is IntegerDivisionByZeroException,
-  // but the web platform has only one num type and can't distinguish between
-  // int and double, so it throws UnsupportedError (the behaviour for double).
-  Expect.throws(() => foo2(0));
+  // truncdiv_zero_test.
+  Expect.throws<UnsupportedError>(() => foo2(0));
 }
 
 foo(i, x) => i % x;
diff --git a/tests/language/operator/truncdiv_zero_test.dart b/tests/language/operator/truncdiv_zero_test.dart
index 34cecc3..11f0bb4 100644
--- a/tests/language/operator/truncdiv_zero_test.dart
+++ b/tests/language/operator/truncdiv_zero_test.dart
@@ -9,6 +9,6 @@
 import "truncdiv_test.dart" as truncdiv_test show foo, foo2;
 
 main() {
-  Expect.throws<IntegerDivisionByZeroException>(() => truncdiv_test.foo(12, 0));
-  Expect.throws<IntegerDivisionByZeroException>(() => truncdiv_test.foo2(0));
+  Expect.throws<UnsupportedError>(() => truncdiv_test.foo(12, 0));
+  Expect.throws<UnsupportedError>(() => truncdiv_test.foo2(0));
 }
diff --git a/tests/language/regress/regress31596_covariant_declaration_test.dart b/tests/language/regress/regress31596_covariant_declaration_test.dart
index c9c9053..9b91bd4 100644
--- a/tests/language/regress/regress31596_covariant_declaration_test.dart
+++ b/tests/language/regress/regress31596_covariant_declaration_test.dart
@@ -2,6 +2,10 @@
 // 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.
 
+// Test the treatment of a method whose signature has a covariant parameter
+// in the interface of a class `C`, when the implementation of that method
+// is inherited and its parameter is not covariant.
+
 class I0 {}
 
 class A {}
@@ -16,9 +20,7 @@
   void f(covariant A x);
 }
 
+// As of dart-lang/language#1833 this is not a compile-time.
 class D extends C implements I {}
-//    ^
-// [analyzer] COMPILE_TIME_ERROR.INVALID_IMPLEMENTATION_OVERRIDE
-// [cfe] unspecified
 
 main() {}
diff --git a/tests/language/vm/div_mod_test.dart b/tests/language/vm/div_mod_test.dart
index ea22240..84c8c71 100755
--- a/tests/language/vm/div_mod_test.dart
+++ b/tests/language/vm/div_mod_test.dart
@@ -138,7 +138,7 @@
     bool threw = false;
     try {
       div0(i);
-    } on IntegerDivisionByZeroException catch (e) {
+    } on UnsupportedError catch (e) {
       threw = true;
     }
     Expect.isTrue(threw);
@@ -149,7 +149,7 @@
     bool threw = false;
     try {
       mod0(i);
-    } on IntegerDivisionByZeroException catch (e) {
+    } on UnsupportedError catch (e) {
       threw = true;
     }
     Expect.isTrue(threw);
diff --git a/tests/language/vm/modtruncdiv_int_test.dart b/tests/language/vm/modtruncdiv_int_test.dart
index 9fc5b53..5948647 100644
--- a/tests/language/vm/modtruncdiv_int_test.dart
+++ b/tests/language/vm/modtruncdiv_int_test.dart
@@ -285,14 +285,14 @@
     try {
       doModVars(9, 9, -9, 0);
       acc = 0; // don't reach!
-    } on IntegerDivisionByZeroException catch (e, s) {}
+    } on UnsupportedError catch (e, s) {}
     Expect.equals(12, acc);
 
     acc = 0;
     try {
       doTruncDivVars(9, 9, -9, 0);
       acc = 0; // don't reach!
-    } on IntegerDivisionByZeroException catch (e, s) {}
+    } on UnsupportedError catch (e, s) {}
     Expect.equals(-23, acc);
   }
 }
diff --git a/tests/language/vm/regression_37622_test.dart b/tests/language/vm/regression_37622_test.dart
index d5999fc..b11e9a4 100755
--- a/tests/language/vm/regression_37622_test.dart
+++ b/tests/language/vm/regression_37622_test.dart
@@ -30,7 +30,7 @@
   bool d = false;
   try {
     x = foo();
-  } on IntegerDivisionByZeroException catch (e) {
+  } on UnsupportedError catch (e) {
     d = true;
   }
   Expect.equals(x, 0);
diff --git a/tests/language_2/library/env_test.dart b/tests/language_2/library/env_test.dart
index 9367eb5..8df205b 100644
--- a/tests/language_2/library/env_test.dart
+++ b/tests/language_2/library/env_test.dart
@@ -49,10 +49,6 @@
         expectedResult,
         const bool.fromEnvironment("dart.library.web_gl",
             defaultValue: NOT_PRESENT));
-    Expect.equals(
-        expectedResult,
-        const bool.fromEnvironment("dart.library.web_sql",
-            defaultValue: NOT_PRESENT));
   }
 
   bool hasIoSupport;
diff --git a/tests/language_2/operator/div_with_power_of_two2_test.dart b/tests/language_2/operator/div_with_power_of_two2_test.dart
index fdbf571..b3db5ce 100644
--- a/tests/language_2/operator/div_with_power_of_two2_test.dart
+++ b/tests/language_2/operator/div_with_power_of_two2_test.dart
@@ -148,7 +148,7 @@
         Expect.equals(res, f(arg));
       }
     }
-    Expect.throws(() => divBy0(4),
-        (e) => e is IntegerDivisionByZeroException || e is UnsupportedError);
+    Expect.throws<UnsupportedError>(() => divBy0(4));
+    ;
   }
 }
diff --git a/tests/language_2/operator/integer_division_by_zero_test.dart b/tests/language_2/operator/integer_division_by_zero_test.dart
index 3ba518a..e1fc343 100644
--- a/tests/language_2/operator/integer_division_by_zero_test.dart
+++ b/tests/language_2/operator/integer_division_by_zero_test.dart
@@ -9,8 +9,43 @@
 
 import "package:expect/expect.dart";
 
-divBy0(a) => a ~/ 0;
+num divBy(num a, num b) => a ~/ b;
 
 main() {
-  Expect.throws(() => divBy0(4), (e) => e is IntegerDivisionByZeroException);
+  // Dividing integers by zero is an error.
+  Expect.throws<Error>(() => divBy(1, 0));
+  Expect.throws<Error>(() => divBy(0, 0));
+
+  // Dividing doubles by zero is an error (result is never finite).
+  Expect.throws<Error>(() => divBy(1.0, 0));
+  Expect.throws<Error>(() => divBy(1, 0.0));
+  Expect.throws<Error>(() => divBy(1, -0.0));
+  Expect.throws<Error>(() => divBy(1.0, 0.0));
+  // Double division yielding infinity is an error, even when not dividing
+  // by zero.
+  Expect.throws<Error>(() => divBy(double.maxFinite, 0.5));
+  Expect.throws<Error>(() => divBy(1, double.minPositive));
+  Expect.throws<Error>(() => divBy(double.infinity, 2.0));
+  Expect.throws<Error>(() => divBy(-double.maxFinite, 0.5));
+  Expect.throws<Error>(() => divBy(-1, double.minPositive));
+  Expect.throws<Error>(() => divBy(-double.infinity, 2.0));
+  // Double division yielding NaN is an error.
+  Expect.throws<Error>(() => divBy(0.0, 0.0));
+  Expect.throws<Error>(() => divBy(double.infinity, double.infinity));
+  Expect.throws<Error>(() => divBy(-0.0, 0.0));
+  Expect.throws<Error>(() => divBy(-double.infinity, double.infinity));
+
+  // Truncating division containing a double truncates to max integer
+  // on non-web.
+  num one = 1;
+  if (one is! double) {
+    var minInt = -0x8000000000000000;
+    var maxInt = minInt - 1;
+    Expect.isTrue(maxInt > 0);
+    // Not on web.
+    Expect.equals(divBy(double.maxFinite, 2), maxInt);
+    Expect.equals(divBy(-double.maxFinite, 2), minInt);
+    Expect.equals(divBy(maxInt, 0.25), maxInt);
+    Expect.equals(divBy(minInt, 0.25), minInt);
+  }
 }
diff --git a/tests/language_2/operator/modulo_test.dart b/tests/language_2/operator/modulo_test.dart
index 6e38c09..417c556 100644
--- a/tests/language_2/operator/modulo_test.dart
+++ b/tests/language_2/operator/modulo_test.dart
@@ -15,11 +15,11 @@
   for (int i = -30; i < 30; i++) {
     Expect.equals(i % 256, foo(i));
     Expect.equals(i % -256, boo(i));
-    Expect.throws(() => hoo(i), (e) => e is IntegerDivisionByZeroException);
+    Expect.throws(() => hoo(i), (e) => e is UnsupportedError);
 
     Expect.equals(i ~/ 254 + i % 254, fooTwo(i));
     Expect.equals(i ~/ -254 + i % -254, booTwo(i));
-    Expect.throws(() => hooTwo(i), (e) => e is IntegerDivisionByZeroException);
+    Expect.throws(() => hooTwo(i), (e) => e is UnsupportedError);
     if (i > 0) {
       Expect.equals(i % 10, noDom(i));
     } else {
@@ -37,8 +37,8 @@
       Expect.equals(i ~/ i + i % i, fooTwo2(i));
     }
   }
-  Expect.throws(() => foo2(0), (e) => e is IntegerDivisionByZeroException);
-  Expect.throws(() => fooTwo2(0), (e) => e is IntegerDivisionByZeroException);
+  Expect.throws(() => foo2(0), (e) => e is UnsupportedError);
+  Expect.throws(() => fooTwo2(0), (e) => e is UnsupportedError);
 }
 
 foo(i) => i % 256; // This will get optimized to AND instruction.
diff --git a/tests/language_2/operator/truncdiv_test.dart b/tests/language_2/operator/truncdiv_test.dart
index b3f3cbd..e8d7d92 100644
--- a/tests/language_2/operator/truncdiv_test.dart
+++ b/tests/language_2/operator/truncdiv_test.dart
@@ -19,10 +19,8 @@
     }
   }
   // We don't specify the exact exception type here, that is covered in
-  // truncdiv_zero_test. The correct answer is IntegerDivisionByZeroException,
-  // but the web platform has only one num type and can't distinguish between
-  // int and double, so it throws UnsupportedError (the behaviour for double).
-  Expect.throws(() => foo2(0));
+  // truncdiv_zero_test.
+  Expect.throws<UnsupportedError>(() => foo2(0));
 }
 
 foo(i, x) => i % x;
diff --git a/tests/language_2/operator/truncdiv_zero_test.dart b/tests/language_2/operator/truncdiv_zero_test.dart
index ed41090..c69b928 100644
--- a/tests/language_2/operator/truncdiv_zero_test.dart
+++ b/tests/language_2/operator/truncdiv_zero_test.dart
@@ -11,6 +11,6 @@
 import "truncdiv_test.dart" as truncdiv_test show foo, foo2;
 
 main() {
-  Expect.throws<IntegerDivisionByZeroException>(() => truncdiv_test.foo(12, 0));
-  Expect.throws<IntegerDivisionByZeroException>(() => truncdiv_test.foo2(0));
+  Expect.throws<UnsupportedError>(() => truncdiv_test.foo(12, 0));
+  Expect.throws<UnsupportedError>(() => truncdiv_test.foo2(0));
 }
diff --git a/tests/language_2/regress/regress31596_covariant_declaration_test.dart b/tests/language_2/regress/regress31596_covariant_declaration_test.dart
index 6c6297e..677efe6 100644
--- a/tests/language_2/regress/regress31596_covariant_declaration_test.dart
+++ b/tests/language_2/regress/regress31596_covariant_declaration_test.dart
@@ -4,6 +4,10 @@
 
 // @dart = 2.9
 
+// Test the treatment of a method whose signature has a covariant parameter
+// in the interface of a class `C`, when the implementation of that method
+// is inherited and its parameter is not covariant.
+
 class I0 {}
 
 class A {}
@@ -18,9 +22,7 @@
   void f(covariant A x);
 }
 
+// As of dart-lang/language#1833 this is not a compile-time error.
 class D extends C implements I {}
-//    ^
-// [analyzer] COMPILE_TIME_ERROR.INVALID_IMPLEMENTATION_OVERRIDE
-// [cfe] unspecified
 
 main() {}
diff --git a/tests/language_2/vm/div_mod_test.dart b/tests/language_2/vm/div_mod_test.dart
index 0ce3c28..47d3b0b 100755
--- a/tests/language_2/vm/div_mod_test.dart
+++ b/tests/language_2/vm/div_mod_test.dart
@@ -138,7 +138,7 @@
     bool threw = false;
     try {
       div0(i);
-    } on IntegerDivisionByZeroException catch (e) {
+    } on UnsupportedError catch (e) {
       threw = true;
     }
     Expect.isTrue(threw);
@@ -149,7 +149,7 @@
     bool threw = false;
     try {
       mod0(i);
-    } on IntegerDivisionByZeroException catch (e) {
+    } on UnsupportedError catch (e) {
       threw = true;
     }
     Expect.isTrue(threw);
diff --git a/tests/language_2/vm/modtruncdiv_int_test.dart b/tests/language_2/vm/modtruncdiv_int_test.dart
index 907f912..b34ac76 100644
--- a/tests/language_2/vm/modtruncdiv_int_test.dart
+++ b/tests/language_2/vm/modtruncdiv_int_test.dart
@@ -287,14 +287,14 @@
     try {
       doModVars(9, 9, -9, 0);
       acc = 0; // don't reach!
-    } on IntegerDivisionByZeroException catch (e, s) {}
+    } on UnsupportedError catch (e, s) {}
     Expect.equals(12, acc);
 
     acc = 0;
     try {
       doTruncDivVars(9, 9, -9, 0);
       acc = 0; // don't reach!
-    } on IntegerDivisionByZeroException catch (e, s) {}
+    } on UnsupportedError catch (e, s) {}
     Expect.equals(-23, acc);
   }
 }
diff --git a/tests/language_2/vm/regression_37622_test.dart b/tests/language_2/vm/regression_37622_test.dart
index c7ef6f0..48562f5 100755
--- a/tests/language_2/vm/regression_37622_test.dart
+++ b/tests/language_2/vm/regression_37622_test.dart
@@ -31,7 +31,7 @@
   bool d = false;
   try {
     x = foo();
-  } on IntegerDivisionByZeroException catch (e) {
+  } on UnsupportedError catch (e) {
     d = true;
   }
   Expect.equals(x, 0);
diff --git a/tests/lib/html/websql_static_test.dart b/tests/lib/html/websql_static_test.dart
new file mode 100644
index 0000000..c4a84b2
--- /dev/null
+++ b/tests/lib/html/websql_static_test.dart
@@ -0,0 +1,10 @@
+// Copyright (c) 2021, 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:web_sql';
+//     ^^^^^^^^^^^^^^
+// [analyzer] COMPILE_TIME_ERROR.URI_DOES_NOT_EXIST
+// [cfe] Not found: 'dart:web_sql'
+
+void main() {}
diff --git a/tests/lib/html/websql_test.dart b/tests/lib/html/websql_test.dart
deleted file mode 100644
index 3445764..0000000
--- a/tests/lib/html/websql_test.dart
+++ /dev/null
@@ -1,122 +0,0 @@
-// Copyright (c) 2020, 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.
-
-library WebDBTest;
-
-import 'dart:async';
-import 'dart:html';
-import 'dart:web_sql';
-
-import 'package:async_helper/async_minitest.dart';
-
-Future<SqlResultSet> createTable(
-    SqlTransaction transaction, String tableName, String columnName) async {
-  return transaction.executeSql('CREATE TABLE $tableName ($columnName)', []);
-}
-
-Future<SqlResultSet> insertTable(SqlTransaction transaction, String tableName,
-    String columnName, value) async {
-  final sql = 'INSERT INTO $tableName ($columnName) VALUES (?)';
-  return transaction.executeSql(sql, [value]);
-}
-
-Future<SqlResultSet> queryTable(
-    SqlTransaction transaction, String tableName) async {
-  final sql = 'SELECT * FROM $tableName';
-  return transaction.executeSql(sql, []);
-}
-
-Future<SqlResultSet?> dropTable(SqlTransaction transaction, String tableName,
-    [bool ignoreFailure = false]) async {
-  try {
-    var result = await transaction.executeSql('DROP TABLE $tableName', []);
-    return result;
-  } catch (error) {
-    if (!ignoreFailure) throw error;
-  }
-}
-
-final tableName = 'test_table';
-final columnName = 'test_data';
-
-late SqlDatabase db;
-late SqlTransaction tx;
-
-Future setup() async {
-  if (SqlDatabase.supported) {
-    db = await window.openDatabase('test_db', '1.0', 'test_db', 1024 * 1024);
-    expect(db, isNotNull, reason: 'Unable to open database');
-
-    tx = await db.transaction_future();
-    expect(tx, isNotNull, reason: "Transaction not ready");
-  }
-}
-
-main() async {
-  await setup();
-
-  group('Database', () {
-    test('Open/Transaction', () async {
-      if (!SqlDatabase.supported) return;
-
-      expect(tx, isNotNull, reason: "Transaction not ready");
-
-      // Should not succeed table doesn't exist to be dropped.
-      try {
-        await dropTable(tx, tableName);
-        expect(false, true, reason: "dropTable should fail");
-      } on DomException catch (error) {
-        expect(error.message,
-            "could not prepare statement (1 no such table: test_table)");
-      }
-    });
-
-    test('create', () async {
-      if (!SqlDatabase.supported) return;
-
-      expect(tx, isNotNull, reason: "Transaction not ready");
-      try {
-        SqlResultSet createResult =
-            await createTable(tx, tableName, columnName);
-        expect(createResult.insertId, 0);
-      } on DomException catch (error) {
-        expect(false, true, reason: "createTable failed - ${error.message}");
-      }
-    });
-
-    test('insert', () async {
-      if (!SqlDatabase.supported) return;
-
-      expect(tx, isNotNull, reason: "Transaction not ready");
-      try {
-        SqlResultSet insertResult =
-            await insertTable(tx, tableName, columnName, 'Some text data');
-        expect(insertResult.insertId, 1);
-        expect(insertResult.rowsAffected, 1);
-      } on DomException catch (error) {
-        expect(false, true, reason: "insert failed - ${error.message}");
-      }
-    });
-
-    test('query', () async {
-      if (!SqlDatabase.supported) return;
-
-      expect(tx, isNotNull, reason: "Transaction not ready");
-      try {
-        SqlResultSet queryResult = await queryTable(tx, tableName);
-        expect(queryResult.rows!.length, 1);
-        expect(queryResult.rows![0]['test_data'], "Some text data");
-      } on DomException catch (error) {
-        expect(false, true, reason: "queryTable failed - ${error.message}");
-      }
-    });
-
-    test('cleanup', () async {
-      if (!SqlDatabase.supported) return;
-
-      expect(tx, isNotNull, reason: "Transaction not ready");
-      await dropTable(tx, tableName, true);
-    });
-  });
-}
diff --git a/tests/lib_2/html/websql_static_test.dart b/tests/lib_2/html/websql_static_test.dart
new file mode 100644
index 0000000..9acdce6
--- /dev/null
+++ b/tests/lib_2/html/websql_static_test.dart
@@ -0,0 +1,12 @@
+// Copyright (c) 2021, 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.
+
+// @dart = 2.9
+
+import 'dart:web_sql';
+//     ^^^^^^^^^^^^^^
+// [analyzer] COMPILE_TIME_ERROR.URI_DOES_NOT_EXIST
+// [cfe] Not found: 'dart:web_sql'
+
+void main() {}
diff --git a/tests/lib_2/html/websql_test.dart b/tests/lib_2/html/websql_test.dart
deleted file mode 100644
index bcd6231..0000000
--- a/tests/lib_2/html/websql_test.dart
+++ /dev/null
@@ -1,120 +0,0 @@
-
-// @dart = 2.9
-library WebDBTest;
-
-import 'dart:async';
-import 'dart:html';
-import 'dart:web_sql';
-
-import 'package:async_helper/async_minitest.dart';
-
-Future<SqlResultSet> createTable(
-    SqlTransaction transaction, String tableName, String columnName) async {
-  return transaction.executeSql('CREATE TABLE $tableName ($columnName)', []);
-}
-
-Future<SqlResultSet> insertTable(SqlTransaction transaction, String tableName,
-    String columnName, value) async {
-  final sql = 'INSERT INTO $tableName ($columnName) VALUES (?)';
-  return transaction.executeSql(sql, [value]);
-}
-
-Future<SqlResultSet> queryTable(
-    SqlTransaction transaction, String tableName) async {
-  final sql = 'SELECT * FROM $tableName';
-  return transaction.executeSql(sql, []);
-}
-
-Future<SqlResultSet> dropTable(SqlTransaction transaction, String tableName,
-    [bool ignoreFailure = false]) async {
-  try {
-    var result = await transaction.executeSql('DROP TABLE $tableName', []);
-    return result;
-  } catch (error) {
-    if (!ignoreFailure) throw error;
-  }
-}
-
-final tableName = 'test_table';
-final columnName = 'test_data';
-
-SqlDatabase db;
-SqlTransaction tx;
-
-Future setup() async {
-  if (SqlDatabase.supported) {
-    db = await window.openDatabase('test_db', '1.0', 'test_db', 1024 * 1024);
-    expect(db, isNotNull, reason: 'Unable to open database');
-
-    tx = await db.transaction_future();
-    expect(tx, isNotNull, reason: "Transaction not ready");
-  }
-}
-
-main() async {
-  await setup();
-
-  group('Database', () {
-    test('Open/Transaction', () async {
-      if (!SqlDatabase.supported) return;
-
-      expect(tx, isNotNull, reason: "Transaction not ready");
-
-      // Should not succeed table doesn't exist to be dropped.
-      try {
-        await dropTable(tx, tableName);
-        expect(false, true, reason: "dropTable should fail");
-      } catch (error) {
-        expect(error.message,
-            "could not prepare statement (1 no such table: test_table)");
-      }
-    });
-
-    test('create', () async {
-      if (!SqlDatabase.supported) return;
-
-      expect(tx, isNotNull, reason: "Transaction not ready");
-      try {
-        SqlResultSet createResult =
-            await createTable(tx, tableName, columnName);
-        expect(createResult.insertId, 0);
-      } catch (error) {
-        expect(false, true, reason: "createTable failed - ${error.message}");
-      }
-    });
-
-    test('insert', () async {
-      if (!SqlDatabase.supported) return;
-
-      expect(tx, isNotNull, reason: "Transaction not ready");
-      try {
-        SqlResultSet insertResult =
-            await insertTable(tx, tableName, columnName, 'Some text data');
-        expect(insertResult.insertId, 1);
-        expect(insertResult.rowsAffected, 1);
-      } catch (error) {
-        expect(false, true, reason: "insert failed - ${error.message}");
-      }
-    });
-
-    test('query', () async {
-      if (!SqlDatabase.supported) return;
-
-      expect(tx, isNotNull, reason: "Transaction not ready");
-      try {
-        SqlResultSet queryResult = await queryTable(tx, tableName);
-        expect(queryResult.rows.length, 1);
-        expect(queryResult.rows[0]['test_data'], "Some text data");
-      } catch (error) {
-        expect(false, true, reason: "queryTable failed - ${error.message}");
-      }
-    });
-
-    test('cleanup', () async {
-      if (!SqlDatabase.supported) return;
-
-      expect(tx, isNotNull, reason: "Transaction not ready");
-      await dropTable(tx, tableName, true);
-    });
-  });
-}
diff --git a/tests/standalone/io/platform_os_version_test.dart b/tests/standalone/io/platform_os_version_test.dart
index fff7335..f16b059 100644
--- a/tests/standalone/io/platform_os_version_test.dart
+++ b/tests/standalone/io/platform_os_version_test.dart
@@ -10,4 +10,5 @@
   var version = Platform.operatingSystemVersion;
   Expect.isNotNull(version);
   Expect.isTrue(version is String);
+  Expect.notEquals("", version);
 }
diff --git a/tests/standalone_2/io/platform_os_version_test.dart b/tests/standalone_2/io/platform_os_version_test.dart
index dde94c4..cf312c4 100644
--- a/tests/standalone_2/io/platform_os_version_test.dart
+++ b/tests/standalone_2/io/platform_os_version_test.dart
@@ -12,4 +12,5 @@
   var version = Platform.operatingSystemVersion;
   Expect.isNotNull(version);
   Expect.isTrue(version is String);
+  Expect.notEquals("", version);
 }
diff --git a/tests/web/lax_runtime_type_instantiate_to_string_test.dart b/tests/web/lax_runtime_type_instantiate_to_string_test.dart
index 26ba4e8..25e1b97 100644
--- a/tests/web/lax_runtime_type_instantiate_to_string_test.dart
+++ b/tests/web/lax_runtime_type_instantiate_to_string_test.dart
@@ -14,7 +14,10 @@
     // `true` if non-minified.
     // The signature of `id` is not otherwise needed so the instantiation
     // wrapper doesn't have a function type.
-    Expect.equals("Instantiation1<dynamic>", toString);
+    // The type parameter is present since it is required because `==`
+    // distinguishes instantiations of the same generic function with different
+    // types.
+    Expect.equals("Instantiation1<int>", toString);
   }
   print(toString);
 }
diff --git a/tests/web_2/lax_runtime_type_instantiate_to_string_test.dart b/tests/web_2/lax_runtime_type_instantiate_to_string_test.dart
index 0e4d623..9d7c13c 100644
--- a/tests/web_2/lax_runtime_type_instantiate_to_string_test.dart
+++ b/tests/web_2/lax_runtime_type_instantiate_to_string_test.dart
@@ -16,7 +16,10 @@
     // `true` if non-minified.
     // The signature of `id` is not otherwise needed so the instantiation
     // wrapper doesn't have a function type.
-    Expect.equals("Instantiation1<dynamic>", toString);
+    // The type parameter is present since it is required because `==`
+    // distinguishes instantiations of the same generic function with different
+    // types.
+    Expect.equals("Instantiation1<int>", toString);
   }
   print(toString);
 }
diff --git a/tools/VERSION b/tools/VERSION
index f8b3ab0..2748fd6 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 15
 PATCH 0
-PRERELEASE 233
+PRERELEASE 234
 PRERELEASE_PATCH 0
\ No newline at end of file
diff --git a/tools/bots/test_matrix.json b/tools/bots/test_matrix.json
index 9c1191c..ab04c56 100644
--- a/tools/bots/test_matrix.json
+++ b/tools/bots/test_matrix.json
@@ -565,17 +565,17 @@
     },
     "dart2js-win-ie11": {
       "options": {
-        "use-sdk": true,
-        "babel": "{\"presets\":[\"es2015\"]}"
+        "babel": "{\"presets\":[\"es2015\"]}",
+        "use-sdk": true
       }
     },
     "dart2js-win-ie11-unsound": {
       "options": {
-        "use-sdk": true,
         "babel": "{\"presets\":[\"es2015\"]}",
         "dart2js-options": [
           "--no-sound-null-safety"
-        ]
+        ],
+        "use-sdk": true
       }
     },
     "dart2js-win-edge": {
@@ -2490,7 +2490,6 @@
           "name": "dart2js tests",
           "arguments": [
             "-ndart2js-hostasserts-linux-ia32-d8",
-            "--dart2js-batch",
             "--exclude_suite=observatory_ui"
           ],
           "shards": 6,
@@ -2500,7 +2499,6 @@
           "name": "dart2js co19_2 tests",
           "arguments": [
             "-ndart2js-hostasserts-linux-ia32-d8",
-            "--dart2js-batch",
             "co19_2"
           ],
           "shards": 6,
@@ -2510,7 +2508,6 @@
           "name": "dart2js package tests",
           "arguments": [
             "-ndart2js-hostasserts-linux-ia32-d8",
-            "--dart2js-batch",
             "pkg"
           ]
         },
@@ -2518,7 +2515,6 @@
           "name": "dart2js observatory-ui tests",
           "arguments": [
             "-ndart2js-hostasserts-linux-ia32-d8-unsound",
-            "--dart2js-batch",
             "observatory_ui"
           ]
         },
@@ -2526,7 +2522,6 @@
           "name": "dart2js extra tests",
           "arguments": [
             "-ndart2js-hostasserts-linux-ia32-d8",
-            "--dart2js-batch",
             "web_2"
           ]
         }
@@ -2558,7 +2553,6 @@
           "name": "dart2js tests",
           "arguments": [
             "-ndart2js-${system}-${runtime}",
-            "--dart2js-batch",
             "--reset-browser-configuration",
             "--exclude_suite=observatory_ui"
           ],
@@ -2569,7 +2563,6 @@
           "name": "dart2js co19_2 tests",
           "arguments": [
             "-ndart2js-${system}-${runtime}",
-            "--dart2js-batch",
             "--reset-browser-configuration",
             "co19_2"
           ],
@@ -2580,7 +2573,6 @@
           "name": "dart2js package tests",
           "arguments": [
             "-ndart2js-${system}-${runtime}",
-            "--dart2js-batch",
             "--reset-browser-configuration",
             "pkg"
           ]
@@ -2589,7 +2581,6 @@
           "name": "dart2js observatory-ui tests",
           "arguments": [
             "-ndart2js-${system}-${runtime}-unsound",
-            "--dart2js-batch",
             "--reset-browser-configuration",
             "observatory_ui"
           ]
@@ -2598,7 +2589,6 @@
           "name": "dart2js extra tests",
           "arguments": [
             "-ndart2js-${system}-${runtime}",
-            "--dart2js-batch",
             "--reset-browser-configuration",
             "web_2"
           ]
@@ -2624,7 +2614,6 @@
           "name": "dart2js tests",
           "arguments": [
             "-ndart2js-minified-linux-d8",
-            "--dart2js-batch",
             "--exclude_suite=observatory_ui"
           ],
           "shards": 6,
@@ -2634,7 +2623,6 @@
           "name": "dart2js package tests",
           "arguments": [
             "-ndart2js-minified-linux-d8",
-            "--dart2js-batch",
             "pkg"
           ]
         },
@@ -2642,7 +2630,6 @@
           "name": "dart2js observatory-ui tests",
           "arguments": [
             "-ndart2js-minified-linux-d8-unsound",
-            "--dart2js-batch",
             "observatory_ui"
           ]
         },
@@ -2650,7 +2637,6 @@
           "name": "dart2js extra tests",
           "arguments": [
             "-ndart2js-minified-linux-d8",
-            "--dart2js-batch",
             "web_2"
           ]
         },
@@ -2658,7 +2644,6 @@
           "name": "dart2js production tests",
           "arguments": [
             "-ndart2js-production-linux-d8",
-            "--dart2js-batch",
             "--exclude_suite=observatory_ui"
           ],
           "shards": 6,
@@ -2668,7 +2653,6 @@
           "name": "dart2js production extra tests",
           "arguments": [
             "-ndart2js-production-linux-d8",
-            "--dart2js-batch",
             "web_2"
           ]
         },
@@ -2676,7 +2660,6 @@
           "name": "dart2js -O0 smoke tests",
           "arguments": [
             "-ndart2js-o0-linux-d8",
-            "--dart2js-batch",
             "web_2"
           ]
         },
@@ -2684,7 +2667,6 @@
           "name": "dart2js --canary smoke tests",
           "arguments": [
             "-ndart2js-modern-linux-d8",
-            "--dart2js-batch",
             "web_2"
           ]
         },
@@ -2692,7 +2674,6 @@
           "name": "dart2js d8 fragment merging tests",
           "arguments": [
             "-ndart2js-minified-hostasserts-weak-max-fragments-linux-x64-d8",
-            "--dart2js-batch",
             "web/deferred/"
           ],
           "shards": 1,
@@ -2719,7 +2700,6 @@
           "name": "dart2js tests",
           "arguments": [
             "-ndart2js-minified-csp-linux-chrome",
-            "--dart2js-batch",
             "--reset-browser-configuration",
             "--exclude_suite=observatory_ui"
           ],
@@ -2730,7 +2710,6 @@
           "name": "dart2js package tests",
           "arguments": [
             "-ndart2js-minified-csp-linux-chrome",
-            "--dart2js-batch",
             "--reset-browser-configuration",
             "pkg"
           ]
@@ -2739,7 +2718,6 @@
           "name": "dart2js observatory-ui tests",
           "arguments": [
             "-ndart2js-minified-csp-linux-chrome-unsound",
-            "--dart2js-batch",
             "--reset-browser-configuration",
             "observatory_ui"
           ]
@@ -2748,7 +2726,6 @@
           "name": "dart2js extra tests",
           "arguments": [
             "-ndart2js-minified-csp-linux-chrome",
-            "--dart2js-batch",
             "web_2"
           ]
         },
@@ -2756,7 +2733,6 @@
           "name": "dart2js d8 fragment merging tests",
           "arguments": [
             "-ndart2js-minified-csp-max-fragments-linux-chrome",
-            "--dart2js-batch",
             "web/deferred/"
           ]
         }
@@ -2782,7 +2758,6 @@
           "name": "dart2js nnbd weak d8 tests",
           "arguments": [
             "-ndart2js-hostasserts-weak-linux-x64-d8",
-            "--dart2js-batch",
             "language",
             "corelib"
           ],
@@ -2793,7 +2768,6 @@
           "name": "dart2js nnbd weak d8 fragment merging tests",
           "arguments": [
             "-ndart2js-hostasserts-weak-max-fragments-linux-x64-d8",
-            "--dart2js-batch",
             "web/deferred/"
           ],
           "shards": 1,
@@ -2803,7 +2777,6 @@
           "name": "dart2js nnbd weak chrome tests",
           "arguments": [
             "-ndart2js-hostasserts-weak-linux-x64-chrome",
-            "--dart2js-batch",
             "web"
           ],
           "shards": 3,
@@ -2813,7 +2786,6 @@
           "name": "dart2js nnbd weak lib tests",
           "arguments": [
             "-ndart2js-hostasserts-weak-linux-x64-chrome",
-            "--dart2js-batch",
             "lib"
           ],
           "shards": 3,
@@ -2823,7 +2795,6 @@
           "name": "dart2js nnbd weak co19 tests",
           "arguments": [
             "-ndart2js-hostasserts-weak-linux-x64-chrome",
-            "--dart2js-batch",
             "co19"
           ],
           "shards": 6,
@@ -2833,7 +2804,6 @@
           "name": "dart2js nnbd strong d8 tests",
           "arguments": [
             "-ndart2js-hostasserts-strong-linux-x64-d8",
-            "--dart2js-batch",
             "language",
             "corelib"
           ],
@@ -2844,7 +2814,6 @@
           "name": "dart2js nnbd strong d8 fragment merging tests",
           "arguments": [
             "-ndart2js-hostasserts-strong-max-fragments-linux-x64-d8",
-            "--dart2js-batch",
             "web/deferred/"
           ],
           "shards": 1,
@@ -2854,7 +2823,6 @@
           "name": "dart2js nnbd strong chrome tests",
           "arguments": [
             "-ndart2js-hostasserts-strong-linux-x64-chrome",
-            "--dart2js-batch",
             "web"
           ],
           "shards": 3,
@@ -2864,7 +2832,6 @@
           "name": "dart2js nnbd strong lib tests",
           "arguments": [
             "-ndart2js-hostasserts-strong-linux-x64-chrome",
-            "--dart2js-batch",
             "lib"
           ],
           "shards": 3,
@@ -2874,7 +2841,6 @@
           "name": "dart2js nnbd strong co19 tests",
           "arguments": [
             "-ndart2js-hostasserts-strong-linux-x64-chrome",
-            "--dart2js-batch",
             "co19"
           ],
           "shards": 6,
diff --git a/tools/dom/scripts/htmlrenamer.py b/tools/dom/scripts/htmlrenamer.py
index 96cdf8a..7e84e7c 100644
--- a/tools/dom/scripts/htmlrenamer.py
+++ b/tools/dom/scripts/htmlrenamer.py
@@ -146,6 +146,7 @@
     'CSSValue',
     'Counter',
     'DOMFileSystemSync',  # Workers
+    'DatabaseCallback',  # WebSql was removed
     'DatabaseSync',  # Workers
     'DirectoryEntrySync',  # Workers
     'DirectoryReaderSync',  # Workers
@@ -527,7 +528,6 @@
         'Window.getComputedStyle',
         'Window.clearInterval',
         'Window.clearTimeout',
-        'Window.openDatabase',
         # TODO(tll): These have been converted from int to double in Chrome 39 for
         #            subpixel precision.  Special case for backward compatibility.
         'Window.pageXOffset',
@@ -704,6 +704,7 @@
         'Window.createImageBitmap',
         'Window.get:frames',
         'Window.get:length',
+        'Window.openDatabase',
         'Window.on:beforeUnload',
         'Window.on:webkitTransitionEnd',
         'Window.pagePopupController',
diff --git a/tools/dom/templates/html/dart2js/html_dart2js.darttemplate b/tools/dom/templates/html/dart2js/html_dart2js.darttemplate
index d1e9e6b..b3dc526 100644
--- a/tools/dom/templates/html/dart2js/html_dart2js.darttemplate
+++ b/tools/dom/templates/html/dart2js/html_dart2js.darttemplate
@@ -39,7 +39,6 @@
 import 'dart:web_audio' show AudioBuffer, AudioTrack, AudioTrackList;
 import 'dart:web_gl' as gl;
 import 'dart:web_gl' show RenderingContext,RenderingContext2;
-import 'dart:web_sql';
 import 'dart:_js_helper' show
     convertDartClosureToJS, Creates, JavaScriptIndexingBehavior,
     JSName, Native, Returns,
diff --git a/tools/dom/templates/html/impl/impl_Window.darttemplate b/tools/dom/templates/html/impl/impl_Window.darttemplate
index 15f8219..a433f83 100644
--- a/tools/dom/templates/html/impl/impl_Window.darttemplate
+++ b/tools/dom/templates/html/impl/impl_Window.darttemplate
@@ -222,26 +222,6 @@
     _moveTo(p.x.toInt(), p.y.toInt());
   }
 
-  @JSName('openDatabase')
-  @SupportedBrowser(SupportedBrowser.CHROME)
-  @SupportedBrowser(SupportedBrowser.SAFARI)
-  @Creates('SqlDatabase')
-  @deprecated
-  SqlDatabase openDatabase(
-      String name, String version, String displayName, int estimatedSize,
-      [DatabaseCallback$NULLABLE creationCallback]) {
-    var db;
-    if (creationCallback == null)
-      db = _openDatabase(name, version, displayName, estimatedSize);
-    else
-      db = _openDatabase(
-        name, version, displayName, estimatedSize, creationCallback);
-
-    applyExtension('Database', db);
-
-    return db;
-  }
-
   int get pageXOffset => JS<num>('num', '#.pageXOffset', this).round();
 
   int get pageYOffset => JS<num>('num', '#.pageYOffset', this).round();
diff --git a/tools/verify_docs/README.md b/tools/verify_docs/README.md
index aa44c8a..a79aa7c 100644
--- a/tools/verify_docs/README.md
+++ b/tools/verify_docs/README.md
@@ -73,3 +73,17 @@
 
 For most code sample, the auto-detection code will select `template:main` or
 `template:expression`.
+
+### Including additional code for analysis
+
+You can declare code that should be included in the analysis but not shown in
+the API docs by adding a comment "// Examples can assume:" to the file (usually
+at the top of the file, after the imports), following by one or more
+commented-out lines of code. That code is included verbatim in the analysis. For
+example:
+
+```dart
+// Examples can assume:
+// final BuildContext context;
+// final String userAvatarUrl;
+```
diff --git a/tools/verify_docs/bin/verify_docs.dart b/tools/verify_docs/bin/verify_docs.dart
index 686b734..aee1176 100644
--- a/tools/verify_docs/bin/verify_docs.dart
+++ b/tools/verify_docs/bin/verify_docs.dart
@@ -31,7 +31,7 @@
   print('To run this tool, run `dart tools/verify_docs/bin/verify_docs.dart`.');
   print('');
   print('For documentation about how to author dart: code samples,'
-      ' see tools/verify_docs/README.md');
+      ' see tools/verify_docs/README.md.');
   print('');
 
   final coreLibraries = args.isEmpty
@@ -103,11 +103,14 @@
     throw Exception(syntacticErrors);
   }
 
+  final sampleAssumptions = findFileAssumptions(text);
+
   var visitor = ValidateCommentCodeSamplesVisitor(
     analysisHelper,
     coreLibName,
     file.path,
     parseResult.lineInfo,
+    sampleAssumptions,
   );
   await visitor.process(parseResult);
   if (visitor.errors.isNotEmpty) {
@@ -118,13 +121,14 @@
   return visitor.errors.isEmpty;
 }
 
-/// Visit a compilation unit and collect the list of code samples found in
-/// dartdoc comments.
+/// Visit a compilation unit and validate the code samples found in dartdoc
+/// comments.
 class ValidateCommentCodeSamplesVisitor extends GeneralizingAstVisitor {
   final AnalysisHelper analysisHelper;
   final String coreLibName;
   final String filePath;
   final LineInfo lineInfo;
+  final String? sampleAssumptions;
 
   final List<CodeSample> samples = [];
   final StringBuffer errors = StringBuffer();
@@ -134,6 +138,7 @@
     this.coreLibName,
     this.filePath,
     this.lineInfo,
+    this.sampleAssumptions,
   );
 
   Future process(ParseStringResult parseResult) async {
@@ -226,13 +231,15 @@
       }
     }
 
+    final assumptions = sampleAssumptions ?? '';
+
     if (!hasImports) {
       if (template == 'none') {
         // just use the sample text as is
       } else if (template == 'main') {
-        text = "main() async {\n${text.trimRight()}\n}\n";
+        text = "${assumptions}main() async {\n${text.trimRight()}\n}\n";
       } else if (template == 'expression') {
-        text = "main() async {\n${text.trimRight()}\n;\n}\n";
+        text = "${assumptions}main() async {\n${text.trimRight()}\n;\n}\n";
       } else {
         throw 'unexpected template directive: $template';
       }
@@ -341,6 +348,24 @@
   }
 }
 
+/// Find and return any '// Examples can assume:' sample text.
+String? findFileAssumptions(String text) {
+  var inAssumptions = false;
+  var assumptions = <String>[];
+
+  for (final line in text.split('\n')) {
+    if (line == '// Examples can assume:') {
+      inAssumptions = true;
+    } else if (line.trim().isEmpty && inAssumptions) {
+      inAssumptions = false;
+    } else if (inAssumptions) {
+      assumptions.add(line.substring('// '.length));
+    }
+  }
+
+  return '${assumptions.join('\n')}\n';
+}
+
 String _severity(Severity severity) {
   switch (severity) {
     case Severity.info:
