Version 2.16.0-154.0.dev

Merge commit '2f222990dcda6081059e1d31870f24ebd3409066' into 'dev'
diff --git a/.dart_tool/package_config.json b/.dart_tool/package_config.json
index 284ed91..8839a05 100644
--- a/.dart_tool/package_config.json
+++ b/.dart_tool/package_config.json
@@ -11,7 +11,7 @@
     "constraint, update this by running tools/generate_package_config.dart."
   ],
   "configVersion": 2,
-  "generated": "2021-12-10T17:31:54.553345",
+  "generated": "2021-12-22T16:24:00.538300",
   "generator": "tools/generate_package_config.dart",
   "packages": [
     {
@@ -629,7 +629,7 @@
       "name": "source_span",
       "rootUri": "../third_party/pkg/source_span",
       "packageUri": "lib/",
-      "languageVersion": "2.12"
+      "languageVersion": "2.14"
     },
     {
       "name": "sourcemap_testing",
@@ -817,4 +817,4 @@
       "languageVersion": "2.12"
     }
   ]
-}
\ No newline at end of file
+}
diff --git a/DEPS b/DEPS
index b98102b..e0dda5f 100644
--- a/DEPS
+++ b/DEPS
@@ -118,7 +118,7 @@
   "http_io_rev": "2fa188caf7937e313026557713f7feffedd4978b",
   "http_multi_server_rev": "de1b312164c24a1690b46c6e97bd47eff40c4649",
   "http_parser_rev": "202391286ddc13c4c3c284ac5b511f04697250ed",
-  "http_rev": "f35d1e1467092f6a5edb2abf7071c4a99e8c737a",
+  "http_rev": "1e42ffa181b263f7790f276a5465832bff7ce615",
   "icu_rev" : "81d656878ec611cb0b42d52c82e9dae93920d9ba",
   "intl_tag": "0.17.0-nullsafety",
   "jinja2_rev": "2222b31554f03e62600cd7e383376a7c187967a1",
@@ -152,7 +152,7 @@
   "source_map_stack_trace_rev": "1c3026f69d9771acf2f8c176a1ab750463309cce",
   "source_maps-0.9.4_rev": "38524",
   "source_maps_rev": "6499ee3adac8d469e2953e2e8ba4bdb4c2fbef90",
-  "source_span_rev": "1be3c44045a06dff840d2ed3a13e6082d7a03a23",
+  "source_span_rev": "dc189b455d823e2919667f6c5dcb41ab7483bce0",
   "sse_rev": "9084339389eb441d0c0518cddac211a097e78657",
   "stack_trace_rev": "5220580872625ddee41e9ca9a5f3364789b2f0f6",
   "stream_channel_rev": "3fa3e40c75c210d617b8b943b9b8f580e9866a89",
diff --git a/pkg/_fe_analyzer_shared/lib/src/macros/executor.dart b/pkg/_fe_analyzer_shared/lib/src/macros/executor.dart
index 0d4e878..d4d248d 100644
--- a/pkg/_fe_analyzer_shared/lib/src/macros/executor.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/macros/executor.dart
@@ -4,6 +4,13 @@
 
 import 'api.dart';
 
+/// Exposes a platform specific [MacroExecutor], through a top level
+/// `Future<MacroExecutor> start()` function.
+///
+/// TODO: conditionally load isolate_mirrors_executor.dart once conditional
+/// imports of mirrors are supported in AOT (issue #48057).
+import 'fake_executor/fake_executor.dart' as executor_impl show start;
+
 /// The interface used by Dart language implementations, in order to load
 /// and execute macros, as well as produce library augmentations from those
 /// macro applications.
@@ -12,6 +19,11 @@
 /// during macro discovery and expansion, and unifies how augmentation libraries
 /// are produced.
 abstract class MacroExecutor {
+  /// Returns a platform specific [MacroExecutor]. On unsupported platforms this
+  /// will be a fake executor object, which will throw an [UnsupportedError] if
+  /// used.
+  static Future<MacroExecutor> start() => executor_impl.start();
+
   /// Invoked when an implementation discovers a new macro definition in a
   /// [library] with [name], and prepares this executor to run the macro.
   ///
diff --git a/pkg/_fe_analyzer_shared/lib/src/macros/fake_executor/fake_executor.dart b/pkg/_fe_analyzer_shared/lib/src/macros/fake_executor/fake_executor.dart
new file mode 100644
index 0000000..9bfd0a7
--- /dev/null
+++ b/pkg/_fe_analyzer_shared/lib/src/macros/fake_executor/fake_executor.dart
@@ -0,0 +1,18 @@
+// 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 '../executor.dart';
+
+/// The only public api exposed by this library, returns a [_FakeMacroExecutor].
+Future<MacroExecutor> start() async => new _FakeMacroExecutor();
+
+/// A [MacroExecutor] implementation which throws an [UnsupportedError] in all
+/// methods.
+class _FakeMacroExecutor implements MacroExecutor {
+  @override
+  dynamic noSuchMethod(Invocation invocation) {
+    throw new UnsupportedError(
+        'Macro expansion is not supported on this platform.');
+  }
+}
diff --git a/pkg/_fe_analyzer_shared/lib/src/macros/isolate_mirrors_executor/isolate_mirrors_executor.dart b/pkg/_fe_analyzer_shared/lib/src/macros/isolate_mirrors_executor/isolate_mirrors_executor.dart
index d6476af..48b0229 100644
--- a/pkg/_fe_analyzer_shared/lib/src/macros/isolate_mirrors_executor/isolate_mirrors_executor.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/macros/isolate_mirrors_executor/isolate_mirrors_executor.dart
@@ -11,12 +11,17 @@
 import '../executor.dart';
 import '../api.dart';
 
+/// Returns an instance of [_IsolateMirrorMacroExecutor].
+///
+/// This is the only public api exposed by this library.
+Future<MacroExecutor> start() => _IsolateMirrorMacroExecutor.start();
+
 /// A [MacroExecutor] implementation which relies on [IsolateMirror.loadUri]
 /// in order to load macros libraries.
 ///
 /// All actual work happens in a separate [Isolate], and this class serves as
 /// a bridge between that isolate and the language frontends.
-class IsolateMirrorMacroExecutor implements MacroExecutor {
+class _IsolateMirrorMacroExecutor implements MacroExecutor {
   /// The actual isolate doing macro loading and execution.
   final Isolate _macroIsolate;
 
@@ -33,7 +38,7 @@
   /// to perform any necessary cleanup.
   final void Function() _onClose;
 
-  IsolateMirrorMacroExecutor._(
+  _IsolateMirrorMacroExecutor._(
       this._macroIsolate, this._sendPort, this._responseStream, this._onClose) {
     _responseStream.listen((event) {
       Completer<GenericResponse>? completer =
@@ -63,7 +68,7 @@
     }).onDone(responseStreamController.close);
     Isolate macroIsolate = await Isolate.spawn(spawn, receivePort.sendPort);
 
-    return new IsolateMirrorMacroExecutor._(
+    return new _IsolateMirrorMacroExecutor._(
         macroIsolate,
         await sendPortCompleter.future,
         responseStreamController.stream,
diff --git a/pkg/_fe_analyzer_shared/lib/src/util/libraries_specification.dart b/pkg/_fe_analyzer_shared/lib/src/util/libraries_specification.dart
index bbc64f4..bcbe485 100644
--- a/pkg/_fe_analyzer_shared/lib/src/util/libraries_specification.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/util/libraries_specification.dart
@@ -96,9 +96,10 @@
 /// Contains information about all libraries on all target platforms defined in
 /// that file.
 class LibrariesSpecification {
+  final Uri specUri;
   final Map<String, TargetLibrariesSpecification> _targets;
 
-  const LibrariesSpecification(
+  const LibrariesSpecification(this.specUri,
       [this._targets = const <String, TargetLibrariesSpecification>{}]);
 
   /// The library specification for a given [target], or throws if none is
@@ -107,23 +108,53 @@
     TargetLibrariesSpecification? targetSpec = _targets[target];
     if (targetSpec == null) {
       throw new LibrariesSpecificationException(
-          'No library specification for target "$target"');
+          messageMissingTarget(target, specUri));
     }
     return targetSpec;
   }
 
+  static Future<LibrariesSpecification> load(
+      Uri uri, Future<String> Function(Uri uri) read) {
+    Map<Uri, LibrariesSpecification?> cache = {};
+    Future<LibrariesSpecification> loadSpecification(Uri uri) async {
+      if (cache.containsKey(uri)) {
+        LibrariesSpecification? specification = cache[uri];
+        if (specification == null) {
+          throw new LibrariesSpecificationException(messageCyclicSpec(uri));
+        }
+        return specification;
+      }
+      cache[uri] = null;
+      String json;
+      try {
+        json = await read(uri);
+      } catch (e) {
+        throw new LibrariesSpecificationException(
+            messageIncludePathCouldNotBeRead(uri, e));
+      }
+      return cache[uri] =
+          await LibrariesSpecification.parse(uri, json, loadSpecification);
+    }
+
+    return loadSpecification(uri);
+  }
+
   /// Parse the given [json] as a library specification, resolving any relative
-  /// paths from [baseUri].
+  /// paths from [specUri].
   ///
   /// May throw an exception if [json] is not properly formatted or contains
   /// invalid values.
-  static LibrariesSpecification parse(Uri baseUri, String? json) {
-    if (json == null) return const LibrariesSpecification();
+  static Future<LibrariesSpecification> parse(
+      Uri specUri,
+      String? json,
+      Future<LibrariesSpecification> Function(Uri uri)
+          loadSpecification) async {
+    if (json == null) return new LibrariesSpecification(specUri);
     Map<String, dynamic> jsonData;
     try {
       dynamic data = jsonDecode(json);
       if (data is! Map<String, dynamic>) {
-        return _reportError('top-level specification is not a map');
+        return _reportError(messageTopLevelIsNotAMap(specUri));
       }
       jsonData = data;
     } on FormatException catch (e) {
@@ -131,62 +162,129 @@
     }
     Map<String, TargetLibrariesSpecification> targets =
         <String, TargetLibrariesSpecification>{};
-    jsonData.forEach((String targetName, targetData) {
-      if (targetName.startsWith("comment:")) return null;
+
+    Set<String> currentTargets = {};
+
+    Future<TargetLibrariesSpecification> resolveTargetData(
+        String targetName) async {
+      TargetLibrariesSpecification? spec = targets[targetName];
+      if (spec != null) {
+        return spec;
+      }
+      if (currentTargets.contains(targetName)) {
+        _reportError(messageCyclicInternalInclude(targetName, specUri));
+      }
+
+      currentTargets.add(targetName);
       Map<String, LibraryInfo> libraries = <String, LibraryInfo>{};
+      Object? targetData = jsonData[targetName];
       if (targetData is! Map) {
-        _reportError("target specification for '$targetName' is not a map");
+        _reportError(messageTargetIsNotAMap(targetName, specUri));
+      }
+
+      Object? include = targetData["include"];
+      if (include != null) {
+        if (include is! List) {
+          _reportError(messageIncludeIsNotAList(targetName, specUri));
+        }
+        for (Object? map in include) {
+          if (map is! Map<String, dynamic>) {
+            _reportError(messageIncludeEntryIsNotAMap(targetName, specUri));
+          }
+          if (!map.containsKey("target")) {
+            _reportError(messageIncludeTargetMissing(targetName, specUri));
+          }
+          Object? target = map["target"];
+          if (target is! String) {
+            _reportError(messageIncludeTargetIsNotAString(targetName, specUri));
+          }
+          if (!map.containsKey("path")) {
+            if (!jsonData.containsKey(target)) {
+              _reportError(messageMissingTarget(target, specUri));
+            }
+            TargetLibrariesSpecification targetLibrariesSpecification =
+                await resolveTargetData(target);
+            libraries.addAll(targetLibrariesSpecification._libraries);
+          } else {
+            Object? path = map["path"];
+            if (path is! String) {
+              _reportError(messageIncludePathIsNotAString(targetName, specUri));
+            }
+            Uri uri = Uri.parse(path);
+            if (uri.scheme != '' && uri.scheme != 'file') {
+              return _reportError(messageUnsupportedUriScheme(path, specUri));
+            }
+            LibrariesSpecification specification =
+                await loadSpecification(specUri.resolveUri(uri));
+            TargetLibrariesSpecification targetSpecification =
+                specification.specificationFor(target);
+            for (LibraryInfo libraryInfo in targetSpecification.allLibraries) {
+              libraries[libraryInfo.name] = libraryInfo;
+            }
+          }
+        }
       }
       if (!targetData.containsKey("libraries")) {
-        _reportError("target specification "
-            "for '$targetName' doesn't have a libraries entry");
+        _reportError(messageTargetLibrariesMissing(targetName, specUri));
       }
-      dynamic librariesData = targetData["libraries"];
+      Object? librariesData = targetData["libraries"];
       if (librariesData is! Map<String, dynamic>) {
-        _reportError("libraries entry for '$targetName' is not a map");
+        _reportError(messageLibrariesEntryIsNotAMap(targetName, specUri));
       }
-      librariesData.forEach((String name, data) {
+      librariesData.forEach((String libraryName, Object? data) {
         if (data is! Map<String, dynamic>) {
           _reportError(
-              "library data for '$name' in target '$targetName' is not a map");
+              messageLibraryDataIsNotAMap(libraryName, targetName, specUri));
         }
-        Uri checkAndResolve(uriString) {
+        Uri checkAndResolve(Object? uriString) {
           if (uriString is! String) {
-            return _reportError("uri value '$uriString' is not a string"
-                "(from library '$name' in target '$targetName')");
+            return _reportError(messageLibraryUriIsNotAString(
+                uriString, libraryName, targetName, specUri));
           }
           Uri uri = Uri.parse(uriString);
           if (uri.scheme != '' && uri.scheme != 'file') {
-            return _reportError("uri scheme in '$uriString' is not supported.");
+            return _reportError(
+                messageUnsupportedUriScheme(uriString, specUri));
           }
-          return baseUri.resolveUri(uri);
+          return specUri.resolveUri(uri);
         }
 
+        if (!data.containsKey('uri')) {
+          _reportError(
+              messageLibraryUriMissing(libraryName, targetName, specUri));
+        }
         Uri uri = checkAndResolve(data['uri']);
         List<Uri> patches;
         if (data['patches'] is List) {
           patches =
-              data['patches'].map<Uri>((s) => baseUri.resolve(s)).toList();
+              data['patches'].map<Uri>((s) => specUri.resolve(s)).toList();
         } else if (data['patches'] is String) {
           patches = [checkAndResolve(data['patches'])];
         } else if (data['patches'] == null) {
           patches = const [];
         } else {
-          _reportError("patches entry for '$name' is not a list or a string");
+          _reportError(messagePatchesMustBeListOrString(libraryName));
         }
 
         dynamic supported = data['supported'] ?? true;
         if (supported is! bool) {
-          _reportError("\"supported\" entry: expected a 'bool' but "
-              "got a '${supported.runtimeType}' ('$supported')");
+          _reportError(messageSupportedIsNotABool(supported));
         }
-        libraries[name] =
-            new LibraryInfo(name, uri, patches, isSupported: supported);
+        libraries[libraryName] =
+            new LibraryInfo(libraryName, uri, patches, isSupported: supported);
       });
-      targets[targetName] =
+      currentTargets.remove(targetName);
+      return targets[targetName] =
           new TargetLibrariesSpecification(targetName, libraries);
-    });
-    return new LibrariesSpecification(targets);
+    }
+
+    for (String targetName in jsonData.keys) {
+      if (targetName.startsWith("comment:")) {
+        continue;
+      }
+      await resolveTargetData(targetName);
+    }
+    return new LibrariesSpecification(specUri, targets);
   }
 
   static Never _reportError(String error) =>
@@ -264,3 +362,67 @@
   @override
   String toString() => '$error';
 }
+
+String messageMissingTarget(String targetName, Uri specUri) =>
+    'No library specification for target "$targetName" in ${specUri}.';
+
+String messageCyclicSpec(Uri specUri) => 'Cyclic dependency in ${specUri}.';
+
+String messageCyclicInternalInclude(String targetName, Uri specUri) =>
+    'Cyclic dependency of target "$targetName" in ${specUri}.';
+
+String messageTopLevelIsNotAMap(Uri specUri) =>
+    'Top-level specification is not a map in ${specUri}.';
+
+String messageTargetIsNotAMap(String targetName, Uri specUri) =>
+    'Target specification for "$targetName" is not a map in $specUri.';
+
+String messageIncludeIsNotAList(String targetName, Uri specUri) =>
+    '"include" specification for "$targetName" is not a list in $specUri.';
+
+String messageIncludeEntryIsNotAMap(String targetName, Uri specUri) =>
+    '"include" entry in "$targetName" is not a map in $specUri.';
+
+String messageIncludePathIsNotAString(String targetName, Uri specUri) =>
+    '"include" path in "$targetName" is not a string in  $specUri.';
+
+String messageIncludePathCouldNotBeRead(Uri includeUri, Object error) =>
+    '"include" path \'$includeUri\' could not be read: $error';
+
+String messageIncludeTargetMissing(String targetName, Uri specUri) =>
+    '"include" target in "$targetName" is missing in $specUri.';
+
+String messageIncludeTargetIsNotAString(String targetName, Uri specUri) =>
+    '"include" target in "$targetName" is not a string in $specUri.';
+
+String messageTargetLibrariesMissing(String targetName, Uri specUri) =>
+    'Target specification '
+    'for "$targetName" doesn\'t have a libraries entry in $specUri.';
+
+String messageLibrariesEntryIsNotAMap(String targetName, Uri specUri) =>
+    '"libraries" entry for "$targetName" is not a map in $specUri.';
+
+String messageLibraryDataIsNotAMap(
+        String libraryName, String targetName, Uri specUri) =>
+    'Library data for \'$libraryName\' in target "$targetName" is not a map '
+    'in $specUri.';
+
+String messageLibraryUriMissing(
+        String libraryName, String targetName, Uri specUri) =>
+    '"uri" is missing '
+    'from library \'$libraryName\' in target "$targetName" in $specUri.';
+
+String messageLibraryUriIsNotAString(
+        Object? uriValue, String libraryName, String targetName, Uri specUri) =>
+    'Uri value `$uriValue` is not a string '
+    '(from library \'$libraryName\' in target "$targetName" in $specUri).';
+
+String messageUnsupportedUriScheme(String uriValue, Uri specUri) =>
+    "Uri scheme in '$uriValue' is not supported in $specUri.";
+
+String messagePatchesMustBeListOrString(String libraryName) =>
+    '"patches" entry for "$libraryName" is not a list or a string.';
+
+String messageSupportedIsNotABool(Object supportedValue) =>
+    '"supported" entry: expected a `bool` but '
+    'got a `${supportedValue.runtimeType}` ("$supportedValue").';
diff --git a/pkg/_fe_analyzer_shared/test/macros/isolate_mirror_executor/isolate_mirror_executor_test.dart b/pkg/_fe_analyzer_shared/test/macros/isolate_mirror_executor/isolate_mirror_executor_test.dart
index 48ca97b..ab7b057 100644
--- a/pkg/_fe_analyzer_shared/test/macros/isolate_mirror_executor/isolate_mirror_executor_test.dart
+++ b/pkg/_fe_analyzer_shared/test/macros/isolate_mirror_executor/isolate_mirror_executor_test.dart
@@ -6,7 +6,8 @@
 
 import 'package:_fe_analyzer_shared/src/macros/api.dart';
 import 'package:_fe_analyzer_shared/src/macros/executor.dart';
-import 'package:_fe_analyzer_shared/src/macros/isolate_mirrors_executor/isolate_mirrors_executor.dart';
+import 'package:_fe_analyzer_shared/src/macros/isolate_mirrors_executor/isolate_mirrors_executor.dart'
+    as mirrorExecutor;
 
 import 'package:test/fake.dart';
 import 'package:test/test.dart';
@@ -15,7 +16,7 @@
   late MacroExecutor executor;
 
   setUp(() async {
-    executor = await IsolateMirrorMacroExecutor.start();
+    executor = await mirrorExecutor.start();
   });
 
   tearDown(() {
diff --git a/pkg/_fe_analyzer_shared/test/util/libraries_specification_test.dart b/pkg/_fe_analyzer_shared/test/util/libraries_specification_test.dart
index 10f9717..990f989c 100644
--- a/pkg/_fe_analyzer_shared/test/util/libraries_specification_test.dart
+++ b/pkg/_fe_analyzer_shared/test/util/libraries_specification_test.dart
@@ -5,56 +5,102 @@
 import 'package:_fe_analyzer_shared/src/util/libraries_specification.dart';
 import 'package:test/test.dart';
 
+bool Function(dynamic) checkException(String expectedMessage) {
+  return (exception) {
+    print(exception);
+    if (exception is LibrariesSpecificationException) {
+      expect(exception.error, expectedMessage);
+      return true;
+    }
+    return false;
+  };
+}
+
 void main() {
+  String notFoundMessage = 'File not found';
+
+  Uri specUri = Uri.parse('org-dartlang-test:///f.json');
+
+  Future<String> Function(Uri) read(Map<Uri, String> map) {
+    return (Uri uri) async {
+      String? jsonString = map[uri];
+      if (jsonString == null) {
+        throw notFoundMessage;
+      }
+      return jsonString;
+    };
+  }
+
   group('parse', () {
     test('top-level must be a map', () async {
       var jsonString = '[]';
       expect(
-          () => LibrariesSpecification.parse(
-              Uri.parse('org-dartlang-test:///f.json'), jsonString),
-          throwsA((e) => e is LibrariesSpecificationException));
+          () =>
+              LibrariesSpecification.load(specUri, read({specUri: jsonString})),
+          throwsA(checkException(messageTopLevelIsNotAMap(specUri))));
       jsonString = '""';
       expect(
-          () => LibrariesSpecification.parse(
-              Uri.parse('org-dartlang-test:///f.json'), jsonString),
-          throwsA((e) => e is LibrariesSpecificationException));
+          () =>
+              LibrariesSpecification.load(specUri, read({specUri: jsonString})),
+          throwsA(checkException(messageTopLevelIsNotAMap(specUri))));
     });
 
     test('target entry must be a map', () async {
       var jsonString = '{"vm" : []}';
       expect(
-          () => LibrariesSpecification.parse(
-              Uri.parse('org-dartlang-test:///f.json'), jsonString),
-          throwsA((e) => e is LibrariesSpecificationException));
+          () =>
+              LibrariesSpecification.load(specUri, read({specUri: jsonString})),
+          throwsA(checkException(messageTargetIsNotAMap('vm', specUri))));
       jsonString = '{"vm" : ""}';
       expect(
-          () => LibrariesSpecification.parse(
-              Uri.parse('org-dartlang-test:///f.json'), jsonString),
-          throwsA((e) => e is LibrariesSpecificationException));
+          () =>
+              LibrariesSpecification.load(specUri, read({specUri: jsonString})),
+          throwsA(checkException(messageTargetIsNotAMap('vm', specUri))));
     });
 
     test('library entry must exist', () async {
       var jsonString = '{"vm" : {}}';
       expect(
-          () => LibrariesSpecification.parse(
-              Uri.parse('org-dartlang-test:///f.json'), jsonString),
-          throwsA((e) => e is LibrariesSpecificationException));
+          () =>
+              LibrariesSpecification.load(specUri, read({specUri: jsonString})),
+          throwsA(
+              checkException(messageTargetLibrariesMissing('vm', specUri))));
     });
 
     test('library entry must be a map', () async {
       var jsonString = '{"vm" : {"libraries": []}}';
       expect(
-          () => LibrariesSpecification.parse(
-              Uri.parse('org-dartlang-test:///f.json'), jsonString),
-          throwsA((e) => e is LibrariesSpecificationException));
+          () =>
+              LibrariesSpecification.load(specUri, read({specUri: jsonString})),
+          throwsA(
+              checkException(messageLibrariesEntryIsNotAMap('vm', specUri))));
+    });
+
+    test('library data must be a map', () async {
+      var jsonString = '{"vm" : {"libraries": { "foo": [] }}}';
+      expect(
+          () =>
+              LibrariesSpecification.load(specUri, read({specUri: jsonString})),
+          throwsA(checkException(
+              messageLibraryDataIsNotAMap('foo', 'vm', specUri))));
+    });
+
+    test('library uri must be supplied', () async {
+      var jsonString = '{"vm" : {"libraries": {"core": {}}}}';
+      expect(
+          () =>
+              LibrariesSpecification.load(specUri, read({specUri: jsonString})),
+          throwsA(
+              checkException(messageLibraryUriMissing('core', 'vm', specUri))));
     });
 
     test('uri must be a string', () async {
-      var jsonString = '{"vm" : {"libraries": {"core": {"uri": 3}}}';
+      var jsonString = '{"vm" : {"libraries": {"core": {"uri": 3}}}}';
       expect(
-          () => LibrariesSpecification.parse(
-              Uri.parse('org-dartlang-test:///f.json'), jsonString),
-          throwsA((e) => e is LibrariesSpecificationException));
+          () =>
+              LibrariesSpecification.load(specUri, read({specUri: jsonString})),
+          throwsA(checkException(
+              messageLibraryUriIsNotAString(3, 'core', 'vm', specUri))));
     });
 
     test('patches must be a string or list of string', () async {
@@ -71,9 +117,9 @@
       }
       ''';
       expect(
-          () => LibrariesSpecification.parse(
-              Uri.parse('org-dartlang-test:///f.json'), jsonString),
-          throwsA((e) => e is LibrariesSpecificationException));
+          () =>
+              LibrariesSpecification.load(specUri, read({specUri: jsonString})),
+          throwsA(checkException(messagePatchesMustBeListOrString('c'))));
 
       jsonString = '''
       { 
@@ -87,8 +133,8 @@
         }
       }
       ''';
-      var spec = LibrariesSpecification.parse(
-          Uri.parse('org-dartlang-test:///f.json'), jsonString);
+      var spec = await LibrariesSpecification.load(
+          specUri, read({specUri: jsonString}));
       expect(spec.specificationFor("none").libraryInfoFor("c")!.patches.first,
           Uri.parse('org-dartlang-test:///a.dart'));
 
@@ -104,8 +150,8 @@
         }
       }
       ''';
-      spec = LibrariesSpecification.parse(
-          Uri.parse('org-dartlang-test:///f.json'), jsonString);
+      spec = await LibrariesSpecification.load(
+          specUri, read({specUri: jsonString}));
       expect(spec.specificationFor("none").libraryInfoFor("c")!.patches.first,
           Uri.parse('org-dartlang-test:///a.dart'));
     });
@@ -114,8 +160,9 @@
       var jsonString = '''
       { "none": { "libraries": {"c" : { "uri": "c/main.dart" }}}}
       ''';
-      var spec = LibrariesSpecification.parse(
-          Uri.parse('org-dartlang-test:///one/two/f.json'), jsonString);
+      var uri = Uri.parse('org-dartlang-test:///one/two/f.json');
+      var spec =
+          await LibrariesSpecification.load(uri, read({uri: jsonString}));
       expect(spec, isNotNull);
       expect(
           spec.specificationFor('none').libraryInfoFor('c')!.patches, isEmpty);
@@ -125,9 +172,9 @@
       var jsonString = '''
       { "none": { "libraries": {"c" : { "uri": "c/main.dart" }}}}
       ''';
-
-      var spec = LibrariesSpecification.parse(
-          Uri.parse('org-dartlang-test:///one/two/f.json'), jsonString);
+      var uri = Uri.parse('org-dartlang-test:///one/two/f.json');
+      var spec =
+          await LibrariesSpecification.load(uri, read({uri: jsonString}));
       expect(spec.specificationFor('none').libraryInfoFor('c')!.uri,
           Uri.parse('org-dartlang-test:///one/two/c/main.dart'));
     });
@@ -148,9 +195,9 @@
         }
       }
       ''';
-
-      var spec = LibrariesSpecification.parse(
-          Uri.parse('org-dartlang-test:///one/two/f.json'), jsonString);
+      var uri = Uri.parse('org-dartlang-test:///one/two/f.json');
+      var spec =
+          await LibrariesSpecification.load(uri, read({uri: jsonString}));
       expect(spec.specificationFor('none').libraryInfoFor('c')!.patches[0],
           Uri.parse('org-dartlang-test:///one/a/p1.dart'));
       expect(spec.specificationFor('none').libraryInfoFor('c')!.patches[1],
@@ -186,9 +233,9 @@
         }
       }
       ''';
-
-      var spec = LibrariesSpecification.parse(
-          Uri.parse('org-dartlang-test:///one/two/f.json'), jsonString);
+      var uri = Uri.parse('org-dartlang-test:///one/two/f.json');
+      var spec =
+          await LibrariesSpecification.load(uri, read({uri: jsonString}));
 
       expect(spec.specificationFor('vm').libraryInfoFor('foo')!.uri,
           Uri.parse('org-dartlang-test:///one/two/a/main.dart'));
@@ -199,12 +246,23 @@
     });
 
     test('supported entry must be bool', () async {
-      var jsonString = '{"vm" : {"libraries": {"core": '
-          '{"uri": "main.dart", "supported": 3}},';
+      var jsonString = '''
+      {
+        "vm": 
+        {
+          "libraries": 
+          {
+            "core": {
+              "uri": "main.dart", 
+              "supported": 3
+            }
+          }
+        }
+      }''';
       expect(
-          () => LibrariesSpecification.parse(
-              Uri.parse('org-dartlang-test:///f.json'), jsonString),
-          throwsA((e) => e is LibrariesSpecificationException));
+          () =>
+              LibrariesSpecification.load(specUri, read({specUri: jsonString})),
+          throwsA(checkException(messageSupportedIsNotABool(3))));
     });
 
     test('supported entry is copied correctly when parsing', () async {
@@ -238,8 +296,9 @@
         }
       }
       ''';
-      var spec = LibrariesSpecification.parse(
-          Uri.parse('org-dartlang-test:///one/two/f.json'), jsonString);
+      var uri = Uri.parse('org-dartlang-test:///one/two/f.json');
+      var spec =
+          await LibrariesSpecification.load(uri, read({uri: jsonString}));
       expect(spec.specificationFor('vm').libraryInfoFor('foo')!.isSupported,
           false);
       expect(
@@ -249,6 +308,399 @@
     });
   });
 
+  group('nested', () {
+    test('include must be a list', () async {
+      var jsonString = '''
+      {
+        "target": {
+          "include": "", 
+          "libraries": {}
+        }
+      }
+      ''';
+      expect(
+          () =>
+              LibrariesSpecification.load(specUri, read({specUri: jsonString})),
+          throwsA(checkException(messageIncludeIsNotAList('target', specUri))));
+    });
+
+    test('include entry must be a map', () async {
+      var jsonString = '''
+      {
+        "target": {
+          "include": [""], 
+          "libraries": {}
+        }
+      }
+      ''';
+      expect(
+          () =>
+              LibrariesSpecification.load(specUri, read({specUri: jsonString})),
+          throwsA(
+              checkException(messageIncludeEntryIsNotAMap('target', specUri))));
+    });
+
+    test('include entry must have a target string', () async {
+      var jsonString = '''
+      {
+        "target": {
+          "include": [{}], 
+          "libraries": {}
+        }
+      }
+      ''';
+      expect(
+          () =>
+              LibrariesSpecification.load(specUri, read({specUri: jsonString})),
+          throwsA(
+              checkException(messageIncludeTargetMissing('target', specUri))));
+
+      jsonString = '''
+      {
+        "target": {
+          "include": [{"path": "dummy"}], 
+          "libraries": {}
+        }
+      }
+      ''';
+      expect(
+          () =>
+              LibrariesSpecification.load(specUri, read({specUri: jsonString})),
+          throwsA(
+              checkException(messageIncludeTargetMissing('target', specUri))));
+
+      jsonString = '''
+      {
+        "target": {
+          "include": [{"path": 0, "target": 0}], 
+          "libraries": {}
+        }
+      }
+      ''';
+      expect(
+          () =>
+              LibrariesSpecification.load(specUri, read({specUri: jsonString})),
+          throwsA(checkException(
+              messageIncludeTargetIsNotAString('target', specUri))));
+    });
+
+    test('include entry path must be a string', () async {
+      var jsonString = '''
+      {
+        "target": {
+          "include": [{"path": 0, "target": "dummy"}], 
+          "libraries": {}
+        }
+      }
+      ''';
+      expect(
+          () =>
+              LibrariesSpecification.load(specUri, read({specUri: jsonString})),
+          throwsA(checkException(
+              messageIncludePathIsNotAString('target', specUri))));
+
+      jsonString = '''
+      {
+        "target": {
+          "include": [{"path": "dummy", "target": 0}], 
+          "libraries": {}
+        }
+      }
+      ''';
+      expect(
+          () =>
+              LibrariesSpecification.load(specUri, read({specUri: jsonString})),
+          throwsA(checkException(
+              messageIncludeTargetIsNotAString('target', specUri))));
+    });
+
+    test('include entry path scheme can only be file', () async {
+      var jsonString = '''
+      {
+        "target": {
+          "include": [{"path": "http://foo.dart", "target": "none"}], 
+          "libraries": {}
+        }
+      }
+      ''';
+      expect(
+          () =>
+              LibrariesSpecification.load(specUri, read({specUri: jsonString})),
+          throwsA(checkException(
+              messageUnsupportedUriScheme("http://foo.dart", specUri))));
+    });
+
+    test('include entry must be a existing path and target', () async {
+      var otherFile = 'g.json';
+      var otherUri = specUri.resolve(otherFile);
+      var jsonString = '''
+      {
+        "target": {
+          "include": [{"path": "$otherFile", "target": "none"}], 
+          "libraries": {}
+        }
+      }
+      ''';
+      expect(
+          () =>
+              LibrariesSpecification.load(specUri, read({specUri: jsonString})),
+          throwsA(checkException(
+              messageIncludePathCouldNotBeRead(otherUri, notFoundMessage))));
+
+      var otherJsonString = '''
+      {
+        "target": {
+          "libraries": {}
+        }
+      }''';
+      expect(
+          () => LibrariesSpecification.load(
+              specUri, read({specUri: jsonString, otherUri: otherJsonString})),
+          throwsA(checkException(messageMissingTarget('none', otherUri))));
+    });
+
+    test('internal include target must exist', () async {
+      var jsonString = '''
+      {
+        "target": {
+          "include": [{"target": "none"}], 
+          "libraries": {}
+        }
+      }
+      ''';
+      expect(
+          () =>
+              LibrariesSpecification.load(specUri, read({specUri: jsonString})),
+          throwsA(checkException(messageMissingTarget('none', specUri))));
+    });
+
+    test('include entry cannot be cyclic', () async {
+      var thisFile = 'f.json';
+      var thisUri = specUri.resolve(thisFile);
+      var otherFile = 'g.json';
+      var otherUri = thisUri.resolve(otherFile);
+      var thisJsonString = '''
+      {
+        "target": {
+          "include": [{"path": "$thisFile", "target": "target"}], 
+          "libraries": {}
+        }
+      }
+      ''';
+      expect(
+          () => LibrariesSpecification.load(
+              thisUri, read({thisUri: thisJsonString})),
+          throwsA(checkException(messageCyclicSpec(thisUri))));
+
+      thisJsonString = '''
+      {
+        "target": {
+          "include": [{"path": "$otherFile", "target": "none"}], 
+          "libraries": {}
+        }
+      }
+      ''';
+      var otherJsonString = '''
+      {
+        "none": {
+          "include": [{"path": "$thisFile", "target": "target"}],
+          "libraries": {}
+        }
+      }''';
+      expect(
+          () => LibrariesSpecification.load(thisUri,
+              read({thisUri: thisJsonString, otherUri: otherJsonString})),
+          throwsA(checkException(messageCyclicSpec(thisUri))));
+    });
+
+    test('include entry cannot be cyclic internally', () async {
+      var jsonString = '''
+      {
+        "target": {
+          "include": [{"target": "target"}], 
+          "libraries": {}
+        }
+      }
+      ''';
+      expect(
+          () =>
+              LibrariesSpecification.load(specUri, read({specUri: jsonString})),
+          throwsA(
+              checkException(messageCyclicInternalInclude('target', specUri))));
+
+      jsonString = '''
+      {
+        "a": {
+          "include": [{"target": "b"}], 
+          "libraries": {}
+        },
+        "b": {
+          "include": [{"target": "a"}], 
+          "libraries": {}
+        }
+      }
+      ''';
+      expect(
+          () =>
+              LibrariesSpecification.load(specUri, read({specUri: jsonString})),
+          throwsA(checkException(messageCyclicInternalInclude('a', specUri))));
+    });
+
+    test('include works transitively', () async {
+      var thisFile = 'f.json';
+      var thisUri = specUri.resolve(thisFile);
+      var otherFile1 = 'g.json';
+      var otherUri1 = thisUri.resolve(otherFile1);
+      var otherFile2 = 'subfolder/h.json';
+      var otherUri2 = thisUri.resolve(otherFile2);
+      var otherFile3 = '../i.json';
+      var otherUri3 = otherUri2.resolve(otherFile3);
+      var thisJsonString = '''
+      {
+        "foo": {
+          "include": [
+            {
+              "path": "$otherFile1", 
+              "target": "foo"
+            },
+            {
+              "path": "$otherFile2", 
+              "target": "foo"
+            }
+          ], 
+          "libraries": {}
+        },
+        "bar": {
+          "include": [{"path": "$otherFile2", "target": "bar"}], 
+          "libraries": {}
+        }
+      }
+      ''';
+      var otherJsonString1 = '''
+      {
+        "foo": {
+          "libraries": {
+            "foo": {
+              "uri": "foo.dart"
+            }
+          }
+        }
+      }''';
+      var otherJsonString2 = '''
+      {
+        "foo": {
+          "libraries": {
+            "foo_extra": {
+              "uri": "foo_extra.dart"
+            }
+          }
+        },
+        "bar": {
+          "include": [{"path": "$otherFile3", "target": "baz"}],
+          "libraries": {
+            "bar": {
+              "uri": "bar/baz.dart"
+            }
+          }
+        }
+      }''';
+      var otherJsonString3 = '''
+      {
+        "baz": {
+          "libraries": {
+            "baz": {
+              "uri": "bar/baz.dart"
+            }
+          }
+        }
+      }''';
+      var spec = await LibrariesSpecification.load(
+          thisUri,
+          read({
+            thisUri: thisJsonString,
+            otherUri1: otherJsonString1,
+            otherUri2: otherJsonString2,
+            otherUri3: otherJsonString3,
+          }));
+
+      expect(spec.specificationFor('foo').libraryInfoFor('foo')!.uri,
+          otherUri1.resolve('foo.dart'));
+      expect(spec.specificationFor('foo').libraryInfoFor('foo_extra')!.uri,
+          otherUri2.resolve('foo_extra.dart'));
+      expect(spec.specificationFor('bar').libraryInfoFor('bar')!.uri,
+          otherUri2.resolve('bar/baz.dart'));
+      expect(spec.specificationFor('bar').libraryInfoFor('baz')!.uri,
+          otherUri3.resolve('bar/baz.dart'));
+    });
+
+    test('internal include works transitively', () async {
+      var jsonString = '''
+      {
+        "foo": {
+          "include": [{"target": "common"}], 
+          "libraries": {
+            "foo": {
+              "uri": "foo.dart"
+            }
+          }
+        },
+        "bar": {
+          "include": [
+            {
+               "target": "common"
+            }, 
+            {
+               "target": "baz"
+            }
+          ], 
+          "libraries": {
+            "bar": {
+              "uri": "bar.dart"
+            }
+          }
+        },
+        "common": {
+          "libraries": {
+            "common": {
+              "uri": "common.dart"
+            }
+          }
+        },
+        "baz": {
+          "include": [{"target": "boz"}],
+          "libraries": {
+            "baz": {
+              "uri": "bar/baz.dart"
+            }
+          }
+        },
+        "boz": {
+          "libraries": {
+            "boz": {
+              "uri": "bar/boz.dart"
+            }
+          }
+        }        
+      }
+      ''';
+      var spec = await LibrariesSpecification.load(
+          specUri, read({specUri: jsonString}));
+
+      expect(spec.specificationFor('foo').libraryInfoFor('foo')!.uri,
+          specUri.resolve('foo.dart'));
+      expect(spec.specificationFor('foo').libraryInfoFor('common')!.uri,
+          specUri.resolve('common.dart'));
+      expect(spec.specificationFor('bar').libraryInfoFor('bar')!.uri,
+          specUri.resolve('bar.dart'));
+      expect(spec.specificationFor('bar').libraryInfoFor('common')!.uri,
+          specUri.resolve('common.dart'));
+      expect(spec.specificationFor('bar').libraryInfoFor('baz')!.uri,
+          specUri.resolve('bar/baz.dart'));
+      expect(spec.specificationFor('bar').libraryInfoFor('boz')!.uri,
+          specUri.resolve('bar/boz.dart'));
+    });
+  });
+
   group('toJson', () {
     test('serialization produces same data that was parsed', () async {
       var jsonString = '''
@@ -282,11 +734,12 @@
       }
       ''';
 
-      var spec = LibrariesSpecification.parse(
-          Uri.parse('org-dartlang-test:///one/two/f.json'), jsonString);
+      var uri = Uri.parse('org-dartlang-test:///one/two/f.json');
+      var spec =
+          await LibrariesSpecification.load(uri, read({uri: jsonString}));
       var newJson =
           spec.toJsonString(Uri.parse('org-dartlang-test:///one/two/g.json'));
-      expect(jsonString.replaceAll(new RegExp('\\s'), ''), newJson);
+      expect(newJson, jsonString.replaceAll(new RegExp('\\s'), ''));
     });
 
     test('serialization can adapt to new file location', () async {
@@ -319,8 +772,9 @@
       }
       ''';
 
-      var spec = LibrariesSpecification.parse(
-          Uri.parse('org-dartlang-test:///one/two/f.json'), jsonString);
+      var uri = Uri.parse('org-dartlang-test:///one/two/f.json');
+      var spec =
+          await LibrariesSpecification.load(uri, read({uri: jsonString}));
       var newJson =
           spec.toJsonString(Uri.parse('org-dartlang-test:///one/g.json'));
 
@@ -354,7 +808,71 @@
       }
       ''';
 
-      expect(expected.replaceAll(new RegExp('\\s'), ''), newJson);
+      expect(newJson, expected.replaceAll(new RegExp('\\s'), ''));
+    });
+
+    test('serialization of nested specs inlines data', () async {
+      var jsonString = '''
+      {
+        "vm": {
+          "include": [
+            {
+              "path": "g.json",
+              "target": "vm"
+            }
+          ],
+          "libraries": {
+            "foo" : {
+              "uri": "a/main.dart"
+            }
+          }
+        }
+      }
+      ''';
+      var otherJsonString = '''
+      {
+        "vm": {
+          "libraries": {
+            "bar" : {
+              "uri": "b/main.dart"
+            }
+          }
+        },
+        "unused": {
+          "libraries": {
+            "foo" : {
+              "uri": "c/main.dart"
+            }
+          }
+        }
+      }
+      ''';
+
+      var uri = Uri.parse('org-dartlang-test:///one/two/f.json');
+      var otherUri = Uri.parse('org-dartlang-test:///one/two/g.json');
+      var spec = await LibrariesSpecification.load(
+          uri, read({uri: jsonString, otherUri: otherJsonString}));
+      var newJson =
+          spec.toJsonString(Uri.parse('org-dartlang-test:///one/two/h.json'));
+      expect(
+          newJson,
+          '''
+      {
+        "vm": {
+          "libraries": {
+            "bar" : {
+              "uri": "b/main.dart",
+              "patches": []
+            },
+            "foo" : {
+              "uri": "a/main.dart",
+              "patches": []
+            }
+          }
+        }
+      }      
+      '''
+              .replaceAll(new RegExp('\\s'), ''));
     });
   });
 }
diff --git a/pkg/analysis_server/doc/api.html b/pkg/analysis_server/doc/api.html
index 1bb0ba8..ea924c5 100644
--- a/pkg/analysis_server/doc/api.html
+++ b/pkg/analysis_server/doc/api.html
@@ -3117,6 +3117,7 @@
   
   
   
+  
 <dl><dt class="typeDefinition"><a name="type_AddContentOverlay">AddContentOverlay: object</a></dt><dd>
     <p>
       A directive to begin overlaying the contents of a file. The supplied
@@ -3484,7 +3485,23 @@
       An identifier used to associate completion results with a
       completion request.
     </p>
-  </dd><dt class="typeDefinition"><a name="type_CompletionService">CompletionService: String</a></dt><dd>
+  </dd><dt class="typeDefinition"><a name="type_CompletionMode">CompletionMode: String</a></dt><dd>
+    <p>
+      An enumeration of the kinds of code completion that users can invoke.
+    </p>
+    
+  <dl><dt class="value">BASIC</dt><dd>
+        
+        <p>
+          Basic code completion invocation type, and the default for this
+          enumeration.
+        </p>
+      </dd><dt class="value">SMART</dt><dd>
+        
+        <p>
+          Smart code completion, currently not implemented.
+        </p>
+      </dd></dl></dd><dt class="typeDefinition"><a name="type_CompletionService">CompletionService: String</a></dt><dd>
     <p>
       An enumeration of the completion services to which a client can subscribe.
     </p>
@@ -6098,7 +6115,7 @@
   TODO: TBD
 </p>
 <h2 class="domain"><a name="index">Index</a></h2>
-<h3>Domains</h3><h4>server (<a href="#domain_server">↑</a>)</h4><div class="subindex"><h5>Requests</h5><ul><li><a href="#request_server.getVersion">getVersion</a></li><li><a href="#request_server.shutdown">shutdown</a></li><li><a href="#request_server.setSubscriptions">setSubscriptions</a></li><li><a href="#request_server.cancelRequest">cancelRequest</a></li></ul><h5>Notifications</h5><div class="subindex"><ul><li><a href="#notification_server.connected">connected</a></li><li><a href="#notification_server.error">error</a></li><li><a href="#notification_server.log">log</a></li><li><a href="#notification_server.status">status</a></li></ul></div></div><h4>analysis (<a href="#domain_analysis">↑</a>)</h4><div class="subindex"><h5>Requests</h5><ul><li><a href="#request_analysis.getErrors">getErrors</a></li><li><a href="#request_analysis.getHover">getHover</a></li><li><a href="#request_analysis.getLibraryDependencies">getLibraryDependencies</a></li><li><a href="#request_analysis.getNavigation">getNavigation</a></li><li><a href="#request_analysis.getReachableSources">getReachableSources</a></li><li><a href="#request_analysis.reanalyze">reanalyze</a></li><li><a href="#request_analysis.setAnalysisRoots">setAnalysisRoots</a></li><li><a href="#request_analysis.setGeneralSubscriptions">setGeneralSubscriptions</a></li><li><a href="#request_analysis.setPriorityFiles">setPriorityFiles</a></li><li><a href="#request_analysis.setSubscriptions">setSubscriptions</a></li><li><a href="#request_analysis.updateContent">updateContent</a></li><li><a href="#request_analysis.updateOptions">updateOptions</a></li></ul><h5>Notifications</h5><div class="subindex"><ul><li><a href="#notification_analysis.analyzedFiles">analyzedFiles</a></li><li><a href="#notification_analysis.closingLabels">closingLabels</a></li><li><a href="#notification_analysis.errors">errors</a></li><li><a href="#notification_analysis.flushResults">flushResults</a></li><li><a href="#notification_analysis.folding">folding</a></li><li><a href="#notification_analysis.highlights">highlights</a></li><li><a href="#notification_analysis.implemented">implemented</a></li><li><a href="#notification_analysis.invalidate">invalidate</a></li><li><a href="#notification_analysis.navigation">navigation</a></li><li><a href="#notification_analysis.occurrences">occurrences</a></li><li><a href="#notification_analysis.outline">outline</a></li><li><a href="#notification_analysis.overrides">overrides</a></li></ul></div></div><h4>completion (<a href="#domain_completion">↑</a>)</h4><div class="subindex"><h5>Requests</h5><ul><li><a href="#request_completion.getSuggestions">getSuggestions</a></li><li><a href="#request_completion.setSubscriptions">setSubscriptions</a></li><li><a href="#request_completion.registerLibraryPaths">registerLibraryPaths</a></li><li><a href="#request_completion.getSuggestionDetails">getSuggestionDetails</a></li></ul><h5>Notifications</h5><div class="subindex"><ul><li><a href="#notification_completion.results">results</a></li><li><a href="#notification_completion.availableSuggestions">availableSuggestions</a></li><li><a href="#notification_completion.existingImports">existingImports</a></li></ul></div></div><h4>search (<a href="#domain_search">↑</a>)</h4><div class="subindex"><h5>Requests</h5><ul><li><a href="#request_search.findElementReferences">findElementReferences</a></li><li><a href="#request_search.findMemberDeclarations">findMemberDeclarations</a></li><li><a href="#request_search.findMemberReferences">findMemberReferences</a></li><li><a href="#request_search.findTopLevelDeclarations">findTopLevelDeclarations</a></li><li><a href="#request_search.getTypeHierarchy">getTypeHierarchy</a></li></ul><h5>Notifications</h5><div class="subindex"><ul><li><a href="#notification_search.results">results</a></li></ul></div></div><h4>edit (<a href="#domain_edit">↑</a>)</h4><div class="subindex"><h5>Requests</h5><ul><li><a href="#request_edit.format">format</a></li><li><a href="#request_edit.getAssists">getAssists</a></li><li><a href="#request_edit.getAvailableRefactorings">getAvailableRefactorings</a></li><li><a href="#request_edit.getFixes">getFixes</a></li><li><a href="#request_edit.getPostfixCompletion">getPostfixCompletion</a></li><li><a href="#request_edit.getRefactoring">getRefactoring</a></li><li><a href="#request_edit.sortMembers">sortMembers</a></li><li><a href="#request_edit.organizeDirectives">organizeDirectives</a></li></ul></div><h4>execution (<a href="#domain_execution">↑</a>)</h4><div class="subindex"><h5>Requests</h5><ul><li><a href="#request_execution.createContext">createContext</a></li><li><a href="#request_execution.deleteContext">deleteContext</a></li><li><a href="#request_execution.getSuggestions">getSuggestions</a></li><li><a href="#request_execution.mapUri">mapUri</a></li><li><a href="#request_execution.setSubscriptions">setSubscriptions</a></li></ul><h5>Notifications</h5><div class="subindex"><ul><li><a href="#notification_execution.launchData">launchData</a></li></ul></div></div><h4>diagnostic (<a href="#domain_diagnostic">↑</a>)</h4><div class="subindex"><h5>Requests</h5><ul><li><a href="#request_diagnostic.getDiagnostics">getDiagnostics</a></li><li><a href="#request_diagnostic.getServerPort">getServerPort</a></li></ul></div><h4>flutter (<a href="#domain_flutter">↑</a>)</h4><div class="subindex"><h5>Requests</h5><ul><li><a href="#request_flutter.setSubscriptions">setSubscriptions</a></li></ul><h5>Notifications</h5><div class="subindex"><ul><li><a href="#notification_flutter.outline">outline</a></li></ul></div></div><h3>Types (<a href="#types">↑</a>)</h3><div class="subindex"><ul><li><a href="#type_AddContentOverlay">AddContentOverlay</a></li><li><a href="#type_AnalysisError">AnalysisError</a></li><li><a href="#type_AnalysisErrorFixes">AnalysisErrorFixes</a></li><li><a href="#type_AnalysisErrorSeverity">AnalysisErrorSeverity</a></li><li><a href="#type_AnalysisErrorType">AnalysisErrorType</a></li><li><a href="#type_AnalysisOptions">AnalysisOptions</a></li><li><a href="#type_AnalysisService">AnalysisService</a></li><li><a href="#type_AnalysisStatus">AnalysisStatus</a></li><li><a href="#type_AvailableSuggestion">AvailableSuggestion</a></li><li><a href="#type_AvailableSuggestionRelevanceTag">AvailableSuggestionRelevanceTag</a></li><li><a href="#type_AvailableSuggestionSet">AvailableSuggestionSet</a></li><li><a href="#type_BulkFix">BulkFix</a></li><li><a href="#type_BulkFixDetail">BulkFixDetail</a></li><li><a href="#type_ChangeContentOverlay">ChangeContentOverlay</a></li><li><a href="#type_ClosingLabel">ClosingLabel</a></li><li><a href="#type_CompletionId">CompletionId</a></li><li><a href="#type_CompletionService">CompletionService</a></li><li><a href="#type_CompletionSuggestion">CompletionSuggestion</a></li><li><a href="#type_CompletionSuggestionKind">CompletionSuggestionKind</a></li><li><a href="#type_ContextData">ContextData</a></li><li><a href="#type_DiagnosticMessage">DiagnosticMessage</a></li><li><a href="#type_Element">Element</a></li><li><a href="#type_ElementDeclaration">ElementDeclaration</a></li><li><a href="#type_ElementKind">ElementKind</a></li><li><a href="#type_ExecutableFile">ExecutableFile</a></li><li><a href="#type_ExecutableKind">ExecutableKind</a></li><li><a href="#type_ExecutionContextId">ExecutionContextId</a></li><li><a href="#type_ExecutionService">ExecutionService</a></li><li><a href="#type_ExistingImport">ExistingImport</a></li><li><a href="#type_ExistingImports">ExistingImports</a></li><li><a href="#type_FileKind">FileKind</a></li><li><a href="#type_FilePath">FilePath</a></li><li><a href="#type_FlutterOutline">FlutterOutline</a></li><li><a href="#type_FlutterOutlineAttribute">FlutterOutlineAttribute</a></li><li><a href="#type_FlutterOutlineKind">FlutterOutlineKind</a></li><li><a href="#type_FlutterService">FlutterService</a></li><li><a href="#type_FlutterWidgetProperty">FlutterWidgetProperty</a></li><li><a href="#type_FlutterWidgetPropertyEditor">FlutterWidgetPropertyEditor</a></li><li><a href="#type_FlutterWidgetPropertyEditorKind">FlutterWidgetPropertyEditorKind</a></li><li><a href="#type_FlutterWidgetPropertyValue">FlutterWidgetPropertyValue</a></li><li><a href="#type_FlutterWidgetPropertyValueEnumItem">FlutterWidgetPropertyValueEnumItem</a></li><li><a href="#type_FoldingKind">FoldingKind</a></li><li><a href="#type_FoldingRegion">FoldingRegion</a></li><li><a href="#type_GeneralAnalysisService">GeneralAnalysisService</a></li><li><a href="#type_HighlightRegion">HighlightRegion</a></li><li><a href="#type_HighlightRegionType">HighlightRegionType</a></li><li><a href="#type_HoverInformation">HoverInformation</a></li><li><a href="#type_ImplementedClass">ImplementedClass</a></li><li><a href="#type_ImplementedMember">ImplementedMember</a></li><li><a href="#type_ImportedElementSet">ImportedElementSet</a></li><li><a href="#type_ImportedElements">ImportedElements</a></li><li><a href="#type_IncludedSuggestionRelevanceTag">IncludedSuggestionRelevanceTag</a></li><li><a href="#type_IncludedSuggestionSet">IncludedSuggestionSet</a></li><li><a href="#type_KytheEntry">KytheEntry</a></li><li><a href="#type_KytheVName">KytheVName</a></li><li><a href="#type_LibraryPathSet">LibraryPathSet</a></li><li><a href="#type_LinkedEditGroup">LinkedEditGroup</a></li><li><a href="#type_LinkedEditSuggestion">LinkedEditSuggestion</a></li><li><a href="#type_LinkedEditSuggestionKind">LinkedEditSuggestionKind</a></li><li><a href="#type_Location">Location</a></li><li><a href="#type_NavigationRegion">NavigationRegion</a></li><li><a href="#type_NavigationTarget">NavigationTarget</a></li><li><a href="#type_Occurrences">Occurrences</a></li><li><a href="#type_Outline">Outline</a></li><li><a href="#type_OverriddenMember">OverriddenMember</a></li><li><a href="#type_Override">Override</a></li><li><a href="#type_Position">Position</a></li><li><a href="#type_PostfixTemplateDescriptor">PostfixTemplateDescriptor</a></li><li><a href="#type_PubStatus">PubStatus</a></li><li><a href="#type_RefactoringFeedback">RefactoringFeedback</a></li><li><a href="#type_RefactoringKind">RefactoringKind</a></li><li><a href="#type_RefactoringMethodParameter">RefactoringMethodParameter</a></li><li><a href="#type_RefactoringMethodParameterKind">RefactoringMethodParameterKind</a></li><li><a href="#type_RefactoringOptions">RefactoringOptions</a></li><li><a href="#type_RefactoringProblem">RefactoringProblem</a></li><li><a href="#type_RefactoringProblemSeverity">RefactoringProblemSeverity</a></li><li><a href="#type_RemoveContentOverlay">RemoveContentOverlay</a></li><li><a href="#type_RequestError">RequestError</a></li><li><a href="#type_RequestErrorCode">RequestErrorCode</a></li><li><a href="#type_RuntimeCompletionExpression">RuntimeCompletionExpression</a></li><li><a href="#type_RuntimeCompletionExpressionType">RuntimeCompletionExpressionType</a></li><li><a href="#type_RuntimeCompletionExpressionTypeKind">RuntimeCompletionExpressionTypeKind</a></li><li><a href="#type_RuntimeCompletionVariable">RuntimeCompletionVariable</a></li><li><a href="#type_SearchId">SearchId</a></li><li><a href="#type_SearchResult">SearchResult</a></li><li><a href="#type_SearchResultKind">SearchResultKind</a></li><li><a href="#type_ServerService">ServerService</a></li><li><a href="#type_SourceChange">SourceChange</a></li><li><a href="#type_SourceEdit">SourceEdit</a></li><li><a href="#type_SourceFileEdit">SourceFileEdit</a></li><li><a href="#type_TypeHierarchyItem">TypeHierarchyItem</a></li></ul></div><h3>Refactorings (<a href="#refactorings">↑</a>)</h3><div class="subindex"><ul><li><a href="#refactoring_CONVERT_GETTER_TO_METHOD">CONVERT_GETTER_TO_METHOD</a></li><li><a href="#refactoring_CONVERT_METHOD_TO_GETTER">CONVERT_METHOD_TO_GETTER</a></li><li><a href="#refactoring_EXTRACT_LOCAL_VARIABLE">EXTRACT_LOCAL_VARIABLE</a></li><li><a href="#refactoring_EXTRACT_METHOD">EXTRACT_METHOD</a></li><li><a href="#refactoring_EXTRACT_WIDGET">EXTRACT_WIDGET</a></li><li><a href="#refactoring_INLINE_LOCAL_VARIABLE">INLINE_LOCAL_VARIABLE</a></li><li><a href="#refactoring_INLINE_METHOD">INLINE_METHOD</a></li><li><a href="#refactoring_MOVE_FILE">MOVE_FILE</a></li><li><a href="#refactoring_RENAME">RENAME</a></li></ul></div>
+<h3>Domains</h3><h4>server (<a href="#domain_server">↑</a>)</h4><div class="subindex"><h5>Requests</h5><ul><li><a href="#request_server.getVersion">getVersion</a></li><li><a href="#request_server.shutdown">shutdown</a></li><li><a href="#request_server.setSubscriptions">setSubscriptions</a></li><li><a href="#request_server.cancelRequest">cancelRequest</a></li></ul><h5>Notifications</h5><div class="subindex"><ul><li><a href="#notification_server.connected">connected</a></li><li><a href="#notification_server.error">error</a></li><li><a href="#notification_server.log">log</a></li><li><a href="#notification_server.status">status</a></li></ul></div></div><h4>analysis (<a href="#domain_analysis">↑</a>)</h4><div class="subindex"><h5>Requests</h5><ul><li><a href="#request_analysis.getErrors">getErrors</a></li><li><a href="#request_analysis.getHover">getHover</a></li><li><a href="#request_analysis.getLibraryDependencies">getLibraryDependencies</a></li><li><a href="#request_analysis.getNavigation">getNavigation</a></li><li><a href="#request_analysis.getReachableSources">getReachableSources</a></li><li><a href="#request_analysis.reanalyze">reanalyze</a></li><li><a href="#request_analysis.setAnalysisRoots">setAnalysisRoots</a></li><li><a href="#request_analysis.setGeneralSubscriptions">setGeneralSubscriptions</a></li><li><a href="#request_analysis.setPriorityFiles">setPriorityFiles</a></li><li><a href="#request_analysis.setSubscriptions">setSubscriptions</a></li><li><a href="#request_analysis.updateContent">updateContent</a></li><li><a href="#request_analysis.updateOptions">updateOptions</a></li></ul><h5>Notifications</h5><div class="subindex"><ul><li><a href="#notification_analysis.analyzedFiles">analyzedFiles</a></li><li><a href="#notification_analysis.closingLabels">closingLabels</a></li><li><a href="#notification_analysis.errors">errors</a></li><li><a href="#notification_analysis.flushResults">flushResults</a></li><li><a href="#notification_analysis.folding">folding</a></li><li><a href="#notification_analysis.highlights">highlights</a></li><li><a href="#notification_analysis.implemented">implemented</a></li><li><a href="#notification_analysis.invalidate">invalidate</a></li><li><a href="#notification_analysis.navigation">navigation</a></li><li><a href="#notification_analysis.occurrences">occurrences</a></li><li><a href="#notification_analysis.outline">outline</a></li><li><a href="#notification_analysis.overrides">overrides</a></li></ul></div></div><h4>completion (<a href="#domain_completion">↑</a>)</h4><div class="subindex"><h5>Requests</h5><ul><li><a href="#request_completion.getSuggestions">getSuggestions</a></li><li><a href="#request_completion.setSubscriptions">setSubscriptions</a></li><li><a href="#request_completion.registerLibraryPaths">registerLibraryPaths</a></li><li><a href="#request_completion.getSuggestionDetails">getSuggestionDetails</a></li></ul><h5>Notifications</h5><div class="subindex"><ul><li><a href="#notification_completion.results">results</a></li><li><a href="#notification_completion.availableSuggestions">availableSuggestions</a></li><li><a href="#notification_completion.existingImports">existingImports</a></li></ul></div></div><h4>search (<a href="#domain_search">↑</a>)</h4><div class="subindex"><h5>Requests</h5><ul><li><a href="#request_search.findElementReferences">findElementReferences</a></li><li><a href="#request_search.findMemberDeclarations">findMemberDeclarations</a></li><li><a href="#request_search.findMemberReferences">findMemberReferences</a></li><li><a href="#request_search.findTopLevelDeclarations">findTopLevelDeclarations</a></li><li><a href="#request_search.getTypeHierarchy">getTypeHierarchy</a></li></ul><h5>Notifications</h5><div class="subindex"><ul><li><a href="#notification_search.results">results</a></li></ul></div></div><h4>edit (<a href="#domain_edit">↑</a>)</h4><div class="subindex"><h5>Requests</h5><ul><li><a href="#request_edit.format">format</a></li><li><a href="#request_edit.getAssists">getAssists</a></li><li><a href="#request_edit.getAvailableRefactorings">getAvailableRefactorings</a></li><li><a href="#request_edit.getFixes">getFixes</a></li><li><a href="#request_edit.getPostfixCompletion">getPostfixCompletion</a></li><li><a href="#request_edit.getRefactoring">getRefactoring</a></li><li><a href="#request_edit.sortMembers">sortMembers</a></li><li><a href="#request_edit.organizeDirectives">organizeDirectives</a></li></ul></div><h4>execution (<a href="#domain_execution">↑</a>)</h4><div class="subindex"><h5>Requests</h5><ul><li><a href="#request_execution.createContext">createContext</a></li><li><a href="#request_execution.deleteContext">deleteContext</a></li><li><a href="#request_execution.getSuggestions">getSuggestions</a></li><li><a href="#request_execution.mapUri">mapUri</a></li><li><a href="#request_execution.setSubscriptions">setSubscriptions</a></li></ul><h5>Notifications</h5><div class="subindex"><ul><li><a href="#notification_execution.launchData">launchData</a></li></ul></div></div><h4>diagnostic (<a href="#domain_diagnostic">↑</a>)</h4><div class="subindex"><h5>Requests</h5><ul><li><a href="#request_diagnostic.getDiagnostics">getDiagnostics</a></li><li><a href="#request_diagnostic.getServerPort">getServerPort</a></li></ul></div><h4>flutter (<a href="#domain_flutter">↑</a>)</h4><div class="subindex"><h5>Requests</h5><ul><li><a href="#request_flutter.setSubscriptions">setSubscriptions</a></li></ul><h5>Notifications</h5><div class="subindex"><ul><li><a href="#notification_flutter.outline">outline</a></li></ul></div></div><h3>Types (<a href="#types">↑</a>)</h3><div class="subindex"><ul><li><a href="#type_AddContentOverlay">AddContentOverlay</a></li><li><a href="#type_AnalysisError">AnalysisError</a></li><li><a href="#type_AnalysisErrorFixes">AnalysisErrorFixes</a></li><li><a href="#type_AnalysisErrorSeverity">AnalysisErrorSeverity</a></li><li><a href="#type_AnalysisErrorType">AnalysisErrorType</a></li><li><a href="#type_AnalysisOptions">AnalysisOptions</a></li><li><a href="#type_AnalysisService">AnalysisService</a></li><li><a href="#type_AnalysisStatus">AnalysisStatus</a></li><li><a href="#type_AvailableSuggestion">AvailableSuggestion</a></li><li><a href="#type_AvailableSuggestionRelevanceTag">AvailableSuggestionRelevanceTag</a></li><li><a href="#type_AvailableSuggestionSet">AvailableSuggestionSet</a></li><li><a href="#type_BulkFix">BulkFix</a></li><li><a href="#type_BulkFixDetail">BulkFixDetail</a></li><li><a href="#type_ChangeContentOverlay">ChangeContentOverlay</a></li><li><a href="#type_ClosingLabel">ClosingLabel</a></li><li><a href="#type_CompletionId">CompletionId</a></li><li><a href="#type_CompletionMode">CompletionMode</a></li><li><a href="#type_CompletionService">CompletionService</a></li><li><a href="#type_CompletionSuggestion">CompletionSuggestion</a></li><li><a href="#type_CompletionSuggestionKind">CompletionSuggestionKind</a></li><li><a href="#type_ContextData">ContextData</a></li><li><a href="#type_DiagnosticMessage">DiagnosticMessage</a></li><li><a href="#type_Element">Element</a></li><li><a href="#type_ElementDeclaration">ElementDeclaration</a></li><li><a href="#type_ElementKind">ElementKind</a></li><li><a href="#type_ExecutableFile">ExecutableFile</a></li><li><a href="#type_ExecutableKind">ExecutableKind</a></li><li><a href="#type_ExecutionContextId">ExecutionContextId</a></li><li><a href="#type_ExecutionService">ExecutionService</a></li><li><a href="#type_ExistingImport">ExistingImport</a></li><li><a href="#type_ExistingImports">ExistingImports</a></li><li><a href="#type_FileKind">FileKind</a></li><li><a href="#type_FilePath">FilePath</a></li><li><a href="#type_FlutterOutline">FlutterOutline</a></li><li><a href="#type_FlutterOutlineAttribute">FlutterOutlineAttribute</a></li><li><a href="#type_FlutterOutlineKind">FlutterOutlineKind</a></li><li><a href="#type_FlutterService">FlutterService</a></li><li><a href="#type_FlutterWidgetProperty">FlutterWidgetProperty</a></li><li><a href="#type_FlutterWidgetPropertyEditor">FlutterWidgetPropertyEditor</a></li><li><a href="#type_FlutterWidgetPropertyEditorKind">FlutterWidgetPropertyEditorKind</a></li><li><a href="#type_FlutterWidgetPropertyValue">FlutterWidgetPropertyValue</a></li><li><a href="#type_FlutterWidgetPropertyValueEnumItem">FlutterWidgetPropertyValueEnumItem</a></li><li><a href="#type_FoldingKind">FoldingKind</a></li><li><a href="#type_FoldingRegion">FoldingRegion</a></li><li><a href="#type_GeneralAnalysisService">GeneralAnalysisService</a></li><li><a href="#type_HighlightRegion">HighlightRegion</a></li><li><a href="#type_HighlightRegionType">HighlightRegionType</a></li><li><a href="#type_HoverInformation">HoverInformation</a></li><li><a href="#type_ImplementedClass">ImplementedClass</a></li><li><a href="#type_ImplementedMember">ImplementedMember</a></li><li><a href="#type_ImportedElementSet">ImportedElementSet</a></li><li><a href="#type_ImportedElements">ImportedElements</a></li><li><a href="#type_IncludedSuggestionRelevanceTag">IncludedSuggestionRelevanceTag</a></li><li><a href="#type_IncludedSuggestionSet">IncludedSuggestionSet</a></li><li><a href="#type_KytheEntry">KytheEntry</a></li><li><a href="#type_KytheVName">KytheVName</a></li><li><a href="#type_LibraryPathSet">LibraryPathSet</a></li><li><a href="#type_LinkedEditGroup">LinkedEditGroup</a></li><li><a href="#type_LinkedEditSuggestion">LinkedEditSuggestion</a></li><li><a href="#type_LinkedEditSuggestionKind">LinkedEditSuggestionKind</a></li><li><a href="#type_Location">Location</a></li><li><a href="#type_NavigationRegion">NavigationRegion</a></li><li><a href="#type_NavigationTarget">NavigationTarget</a></li><li><a href="#type_Occurrences">Occurrences</a></li><li><a href="#type_Outline">Outline</a></li><li><a href="#type_OverriddenMember">OverriddenMember</a></li><li><a href="#type_Override">Override</a></li><li><a href="#type_Position">Position</a></li><li><a href="#type_PostfixTemplateDescriptor">PostfixTemplateDescriptor</a></li><li><a href="#type_PubStatus">PubStatus</a></li><li><a href="#type_RefactoringFeedback">RefactoringFeedback</a></li><li><a href="#type_RefactoringKind">RefactoringKind</a></li><li><a href="#type_RefactoringMethodParameter">RefactoringMethodParameter</a></li><li><a href="#type_RefactoringMethodParameterKind">RefactoringMethodParameterKind</a></li><li><a href="#type_RefactoringOptions">RefactoringOptions</a></li><li><a href="#type_RefactoringProblem">RefactoringProblem</a></li><li><a href="#type_RefactoringProblemSeverity">RefactoringProblemSeverity</a></li><li><a href="#type_RemoveContentOverlay">RemoveContentOverlay</a></li><li><a href="#type_RequestError">RequestError</a></li><li><a href="#type_RequestErrorCode">RequestErrorCode</a></li><li><a href="#type_RuntimeCompletionExpression">RuntimeCompletionExpression</a></li><li><a href="#type_RuntimeCompletionExpressionType">RuntimeCompletionExpressionType</a></li><li><a href="#type_RuntimeCompletionExpressionTypeKind">RuntimeCompletionExpressionTypeKind</a></li><li><a href="#type_RuntimeCompletionVariable">RuntimeCompletionVariable</a></li><li><a href="#type_SearchId">SearchId</a></li><li><a href="#type_SearchResult">SearchResult</a></li><li><a href="#type_SearchResultKind">SearchResultKind</a></li><li><a href="#type_ServerService">ServerService</a></li><li><a href="#type_SourceChange">SourceChange</a></li><li><a href="#type_SourceEdit">SourceEdit</a></li><li><a href="#type_SourceFileEdit">SourceFileEdit</a></li><li><a href="#type_TypeHierarchyItem">TypeHierarchyItem</a></li></ul></div><h3>Refactorings (<a href="#refactorings">↑</a>)</h3><div class="subindex"><ul><li><a href="#refactoring_CONVERT_GETTER_TO_METHOD">CONVERT_GETTER_TO_METHOD</a></li><li><a href="#refactoring_CONVERT_METHOD_TO_GETTER">CONVERT_METHOD_TO_GETTER</a></li><li><a href="#refactoring_EXTRACT_LOCAL_VARIABLE">EXTRACT_LOCAL_VARIABLE</a></li><li><a href="#refactoring_EXTRACT_METHOD">EXTRACT_METHOD</a></li><li><a href="#refactoring_EXTRACT_WIDGET">EXTRACT_WIDGET</a></li><li><a href="#refactoring_INLINE_LOCAL_VARIABLE">INLINE_LOCAL_VARIABLE</a></li><li><a href="#refactoring_INLINE_METHOD">INLINE_METHOD</a></li><li><a href="#refactoring_MOVE_FILE">MOVE_FILE</a></li><li><a href="#refactoring_RENAME">RENAME</a></li></ul></div>
 
 
 </body></html>
\ No newline at end of file
diff --git a/pkg/analysis_server/lib/protocol/protocol_constants.dart b/pkg/analysis_server/lib/protocol/protocol_constants.dart
index 00b690a..ad20782 100644
--- a/pkg/analysis_server/lib/protocol/protocol_constants.dart
+++ b/pkg/analysis_server/lib/protocol/protocol_constants.dart
@@ -138,7 +138,11 @@
 const String COMPLETION_NOTIFICATION_RESULTS_RESULTS = 'results';
 const String COMPLETION_REQUEST_GET_SUGGESTIONS = 'completion.getSuggestions';
 const String COMPLETION_REQUEST_GET_SUGGESTIONS2 = 'completion.getSuggestions2';
+const String COMPLETION_REQUEST_GET_SUGGESTIONS2_COMPLETION_MODE =
+    'completionMode';
 const String COMPLETION_REQUEST_GET_SUGGESTIONS2_FILE = 'file';
+const String COMPLETION_REQUEST_GET_SUGGESTIONS2_INVOCATION_COUNT =
+    'invocationCount';
 const String COMPLETION_REQUEST_GET_SUGGESTIONS2_MAX_RESULTS = 'maxResults';
 const String COMPLETION_REQUEST_GET_SUGGESTIONS2_OFFSET = 'offset';
 const String COMPLETION_REQUEST_GET_SUGGESTIONS2_TIMEOUT = 'timeout';
diff --git a/pkg/analysis_server/lib/protocol/protocol_generated.dart b/pkg/analysis_server/lib/protocol/protocol_generated.dart
index 8d9f921..19f187f 100644
--- a/pkg/analysis_server/lib/protocol/protocol_generated.dart
+++ b/pkg/analysis_server/lib/protocol/protocol_generated.dart
@@ -4698,6 +4698,15 @@
   /// to true.
   int maxResults;
 
+  /// The mode of code completion being invoked. If no value is provided, BASIC
+  /// will be assumed. BASIC is also the only currently supported.
+  CompletionMode? completionMode;
+
+  /// The number of times that the user has invoked code completion at the same
+  /// code location, counting from 1. If no value is provided, 1 will be
+  /// assumed.
+  int? invocationCount;
+
   /// The approximate time in milliseconds that the server should spend. The
   /// server will perform some steps anyway, even if it takes longer than the
   /// specified timeout. This field is intended to be used for benchmarking,
@@ -4705,7 +4714,7 @@
   int? timeout;
 
   CompletionGetSuggestions2Params(this.file, this.offset, this.maxResults,
-      {this.timeout});
+      {this.completionMode, this.invocationCount, this.timeout});
 
   factory CompletionGetSuggestions2Params.fromJson(
       JsonDecoder jsonDecoder, String jsonPath, Object? json) {
@@ -4730,11 +4739,23 @@
       } else {
         throw jsonDecoder.mismatch(jsonPath, 'maxResults');
       }
+      CompletionMode? completionMode;
+      if (json.containsKey('completionMode')) {
+        completionMode = CompletionMode.fromJson(
+            jsonDecoder, jsonPath + '.completionMode', json['completionMode']);
+      }
+      int? invocationCount;
+      if (json.containsKey('invocationCount')) {
+        invocationCount = jsonDecoder.decodeInt(
+            jsonPath + '.invocationCount', json['invocationCount']);
+      }
       int? timeout;
       if (json.containsKey('timeout')) {
         timeout = jsonDecoder.decodeInt(jsonPath + '.timeout', json['timeout']);
       }
       return CompletionGetSuggestions2Params(file, offset, maxResults,
+          completionMode: completionMode,
+          invocationCount: invocationCount,
           timeout: timeout);
     } else {
       throw jsonDecoder.mismatch(
@@ -4753,6 +4774,14 @@
     result['file'] = file;
     result['offset'] = offset;
     result['maxResults'] = maxResults;
+    var completionMode = this.completionMode;
+    if (completionMode != null) {
+      result['completionMode'] = completionMode.toJson();
+    }
+    var invocationCount = this.invocationCount;
+    if (invocationCount != null) {
+      result['invocationCount'] = invocationCount;
+    }
     var timeout = this.timeout;
     if (timeout != null) {
       result['timeout'] = timeout;
@@ -4774,6 +4803,8 @@
       return file == other.file &&
           offset == other.offset &&
           maxResults == other.maxResults &&
+          completionMode == other.completionMode &&
+          invocationCount == other.invocationCount &&
           timeout == other.timeout;
     }
     return false;
@@ -4784,6 +4815,8 @@
         file,
         offset,
         maxResults,
+        completionMode,
+        invocationCount,
         timeout,
       );
 }
@@ -5090,6 +5123,58 @@
   int get hashCode => id.hashCode;
 }
 
+/// CompletionMode
+///
+/// enum {
+///   BASIC
+///   SMART
+/// }
+///
+/// Clients may not extend, implement or mix-in this class.
+class CompletionMode implements Enum {
+  /// Basic code completion invocation type, and the default for this
+  /// enumeration.
+  static const CompletionMode BASIC = CompletionMode._('BASIC');
+
+  /// Smart code completion, currently not implemented.
+  static const CompletionMode SMART = CompletionMode._('SMART');
+
+  /// A list containing all of the enum values that are defined.
+  static const List<CompletionMode> VALUES = <CompletionMode>[BASIC, SMART];
+
+  @override
+  final String name;
+
+  const CompletionMode._(this.name);
+
+  factory CompletionMode(String name) {
+    switch (name) {
+      case 'BASIC':
+        return BASIC;
+      case 'SMART':
+        return SMART;
+    }
+    throw Exception('Illegal enum value: $name');
+  }
+
+  factory CompletionMode.fromJson(
+      JsonDecoder jsonDecoder, String jsonPath, Object? json) {
+    if (json is String) {
+      try {
+        return CompletionMode(json);
+      } catch (_) {
+        // Fall through
+      }
+    }
+    throw jsonDecoder.mismatch(jsonPath, 'CompletionMode', json);
+  }
+
+  @override
+  String toString() => 'CompletionMode.$name';
+
+  String toJson() => name;
+}
+
 /// completion.registerLibraryPaths params
 ///
 /// {
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/extension_member_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/extension_member_contributor.dart
index 3b4f5f2..185cc30 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/extension_member_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/extension_member_contributor.dart
@@ -114,7 +114,7 @@
   }
 
   void _addExtensionMembers(List<ExtensionElement> extensions,
-      CompletionSuggestionKind? kind, DartType type) {
+      CompletionSuggestionKind kind, DartType type) {
     var applicableExtensions = extensions.applicableTo(
       targetLibrary: request.libraryElement,
       targetType: type,
@@ -134,7 +134,7 @@
   }
 
   void _addInstanceMembers(ExtensionElement extension,
-      CompletionSuggestionKind? kind, double inheritanceDistance) {
+      CompletionSuggestionKind kind, double inheritanceDistance) {
     for (var method in extension.methods) {
       if (!method.isStatic) {
         memberBuilder.addSuggestionForMethod(
@@ -151,7 +151,7 @@
     }
   }
 
-  void _addTypeMembers(InterfaceType type, CompletionSuggestionKind? kind,
+  void _addTypeMembers(InterfaceType type, CompletionSuggestionKind kind,
       double inheritanceDistance) {
     for (var method in type.methods) {
       memberBuilder.addSuggestionForMethod(
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/local_reference_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/local_reference_contributor.dart
index 1e16887..b3a1499 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/local_reference_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/local_reference_contributor.dart
@@ -25,7 +25,7 @@
   late MemberSuggestionBuilder memberBuilder;
 
   /// The kind of suggestion to make.
-  CompletionSuggestionKind? classMemberSuggestionKind;
+  late CompletionSuggestionKind classMemberSuggestionKind;
 
   /// The [_VisibilityTracker] tracks the set of elements already added in the
   /// completion list, this object helps prevents suggesting elements that have
@@ -314,8 +314,7 @@
       if (declaredElement is FunctionElement) {
         builder.suggestTopLevelFunction(declaredElement, kind: _defaultKind);
       } else if (declaredElement is PropertyAccessorElement) {
-        builder.suggestTopLevelPropertyAccessor(declaredElement,
-            kind: _defaultKind);
+        builder.suggestTopLevelPropertyAccessor(declaredElement);
       }
     }
   }
@@ -324,7 +323,7 @@
   void declaredFunctionTypeAlias(FunctionTypeAlias declaration) {
     var declaredElement = declaration.declaredElement;
     if (declaredElement != null && opType.includeTypeNameSuggestions) {
-      builder.suggestTypeAlias(declaredElement, kind: _defaultKind);
+      builder.suggestTypeAlias(declaredElement);
     }
   }
 
@@ -333,7 +332,7 @@
     var declaredElement = declaration.declaredElement;
     if (declaredElement is TypeAliasElement &&
         opType.includeTypeNameSuggestions) {
-      builder.suggestTypeAlias(declaredElement, kind: _defaultKind);
+      builder.suggestTypeAlias(declaredElement);
     }
   }
 
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 62adabb..d0f8af8 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
@@ -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: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/completion_manager.dart';
 import 'package:analysis_server/src/services/completion/dart/suggestion_builder.dart';
@@ -56,7 +57,11 @@
         }
         for (var method in element.methods) {
           if (method.isStatic && isVisible(method)) {
-            builder.suggestMethod(method, inheritanceDistance: 0.0);
+            builder.suggestMethod(
+              method,
+              kind: protocol.CompletionSuggestionKind.INVOCATION,
+              inheritanceDistance: 0.0,
+            );
           }
         }
       } else if (element is ExtensionElement) {
@@ -74,7 +79,11 @@
         }
         for (var method in element.methods) {
           if (method.isStatic && isVisible(method)) {
-            builder.suggestMethod(method, inheritanceDistance: 0.0);
+            builder.suggestMethod(
+              method,
+              kind: protocol.CompletionSuggestionKind.INVOCATION,
+              inheritanceDistance: 0.0,
+            );
           }
         }
       }
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 a606391..a441aa0 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
@@ -87,7 +87,7 @@
   /// Add a suggestion for the given [method].
   void addSuggestionForMethod(
       {required MethodElement method,
-      CompletionSuggestionKind? kind,
+      required CompletionSuggestionKind kind,
       required double inheritanceDistance}) {
     if (method.isAccessibleIn(request.libraryElement) &&
         _shouldAddSuggestion(method)) {
@@ -273,7 +273,13 @@
         superMatches: superMatches,
         inheritanceDistance: inheritanceDistance,
       );
-      _add(_createSuggestion(accessor, relevance: relevance));
+      _add(
+        _createSuggestion(
+          accessor,
+          kind: CompletionSuggestionKind.IDENTIFIER,
+          relevance: relevance,
+        ),
+      );
     }
   }
 
@@ -291,8 +297,14 @@
       elementKind: elementKind,
       isConstant: isConstant,
     );
-    _add(_createSuggestion(parameter,
-        elementKind: protocol.ElementKind.PARAMETER, relevance: relevance));
+    _add(
+      _createSuggestion(
+        parameter,
+        elementKind: protocol.ElementKind.PARAMETER,
+        kind: CompletionSuggestionKind.IDENTIFIER,
+        relevance: relevance,
+      ),
+    );
   }
 
   /// Add a suggestion for a [classElement]. If the class can only be
@@ -425,9 +437,9 @@
       suggestTopLevelFunction(element, kind: kind);
     } else if (element is PropertyAccessorElement &&
         element.enclosingElement is CompilationUnitElement) {
-      suggestTopLevelPropertyAccessor(element, kind: kind);
+      suggestTopLevelPropertyAccessor(element);
     } else if (element is TypeAliasElement) {
-      suggestTypeAlias(element, kind: kind);
+      suggestTypeAlias(element);
     } else {
       throw ArgumentError('Cannot suggest a ${element.runtimeType}');
     }
@@ -442,8 +454,15 @@
     var completion = '$enumName.$constantName';
     var relevance =
         _computeTopLevelRelevance(constant, elementType: constant.type);
-    _add(_createSuggestion(constant,
-        completion: completion, prefix: prefix, relevance: relevance));
+    _add(
+      _createSuggestion(
+        constant,
+        completion: completion,
+        kind: CompletionSuggestionKind.IDENTIFIER,
+        prefix: prefix,
+        relevance: relevance,
+      ),
+    );
   }
 
   /// Add a suggestion for an [extension]. If a [kind] is provided it will be
@@ -484,14 +503,26 @@
       superMatches: superMatches,
       inheritanceDistance: inheritanceDistance,
     );
-    _add(_createSuggestion(field, relevance: relevance));
+    _add(
+      _createSuggestion(
+        field,
+        kind: CompletionSuggestionKind.IDENTIFIER,
+        relevance: relevance,
+      ),
+    );
   }
 
   /// Add a suggestion to reference a [field] in a field formal parameter.
   void suggestFieldFormalParameter(FieldElement field) {
     // TODO(brianwilkerson) Add a parameter (`bool includePrefix`) indicating
     //  whether to include the `this.` prefix in the completion.
-    _add(_createSuggestion(field, relevance: Relevance.fieldFormalParameter));
+    _add(
+      _createSuggestion(
+        field,
+        kind: CompletionSuggestionKind.IDENTIFIER,
+        relevance: Relevance.fieldFormalParameter,
+      ),
+    );
   }
 
   /// Add a suggestion for the `call` method defined on functions.
@@ -561,7 +592,13 @@
     // TODO(brianwilkerson) This might want to use the context type rather than
     //  a fixed value.
     var relevance = Relevance.loadLibrary;
-    _add(_createSuggestion(function, relevance: relevance));
+    _add(
+      _createSuggestion(
+        function,
+        kind: CompletionSuggestionKind.INVOCATION,
+        relevance: relevance,
+      ),
+    );
   }
 
   /// Add a suggestion for a local [variable].
@@ -585,7 +622,13 @@
       isConstant: isConstant,
       localVariableDistance: localVariableDistance,
     );
-    _add(_createSuggestion(variable, relevance: relevance));
+    _add(
+      _createSuggestion(
+        variable,
+        kind: CompletionSuggestionKind.IDENTIFIER,
+        relevance: relevance,
+      ),
+    );
   }
 
   /// Add a suggestion for a [method]. If the method is being invoked with a
@@ -594,7 +637,8 @@
   /// used as the kind for the suggestion. The [inheritanceDistance] is the
   /// value of the inheritance distance feature computed for the method.
   void suggestMethod(MethodElement method,
-      {CompletionSuggestionKind? kind, required double inheritanceDistance}) {
+      {required CompletionSuggestionKind kind,
+      required double inheritanceDistance}) {
     // TODO(brianwilkerson) Refactor callers so that we're passing in the type
     //  of the target (assuming we don't already have that type available via
     //  the [request]) and compute the [inheritanceDistance] in this method.
@@ -809,7 +853,13 @@
       elementKind: elementKind,
       isConstant: isConstant,
     );
-    _add(_createSuggestion(parameter, relevance: relevance));
+    _add(
+      _createSuggestion(
+        parameter,
+        kind: CompletionSuggestionKind.IDENTIFIER,
+        relevance: relevance,
+      ),
+    );
   }
 
   /// Add a suggestion for a [prefix] associated with a [library].
@@ -844,8 +894,7 @@
   /// can only be referenced using a prefix, then the [prefix] should be
   /// provided.
   void suggestTopLevelPropertyAccessor(PropertyAccessorElement accessor,
-      {CompletionSuggestionKind kind = CompletionSuggestionKind.INVOCATION,
-      String? prefix}) {
+      {String? prefix}) {
     assert(
         accessor.enclosingElement is CompilationUnitElement,
         'Enclosing element of ${accessor.runtimeType} is '
@@ -857,7 +906,7 @@
       if (accessor.isGetter) {
         var variable = accessor.variable;
         if (variable is TopLevelVariableElement) {
-          suggestTopLevelVariable(variable, kind: kind);
+          suggestTopLevelVariable(variable);
         }
       }
     } else {
@@ -881,7 +930,14 @@
         startsWithDollar: startsWithDollar,
         superMatches: superMatches,
       );
-      _add(_createSuggestion(accessor, prefix: prefix, relevance: relevance));
+      _add(
+        _createSuggestion(
+          accessor,
+          kind: CompletionSuggestionKind.IDENTIFIER,
+          prefix: prefix,
+          relevance: relevance,
+        ),
+      );
     }
   }
 
@@ -889,25 +945,34 @@
   /// will be used as the kind for the suggestion. If the variable can only be
   /// referenced using a prefix, then the [prefix] should be provided.
   void suggestTopLevelVariable(TopLevelVariableElement variable,
-      {CompletionSuggestionKind kind = CompletionSuggestionKind.INVOCATION,
-      String? prefix}) {
+      {String? prefix}) {
     assert(variable.enclosingElement is CompilationUnitElement);
     var relevance =
         _computeTopLevelRelevance(variable, elementType: variable.type);
-    _add(_createSuggestion(variable,
-        kind: kind, prefix: prefix, relevance: relevance));
+    _add(
+      _createSuggestion(
+        variable,
+        kind: CompletionSuggestionKind.IDENTIFIER,
+        prefix: prefix,
+        relevance: relevance,
+      ),
+    );
   }
 
   /// Add a suggestion for a [typeAlias]. If a [kind] is provided it
   /// will be used as the kind for the suggestion. If the alias can only be
   /// referenced using a prefix, then the [prefix] should be provided.
-  void suggestTypeAlias(TypeAliasElement typeAlias,
-      {CompletionSuggestionKind kind = CompletionSuggestionKind.INVOCATION,
-      String? prefix}) {
+  void suggestTypeAlias(TypeAliasElement typeAlias, {String? prefix}) {
     var relevance = _computeTopLevelRelevance(typeAlias,
         elementType: _instantiateTypeAlias(typeAlias));
-    _add(_createSuggestion(typeAlias,
-        kind: kind, prefix: prefix, relevance: relevance));
+    _add(
+      _createSuggestion(
+        typeAlias,
+        kind: CompletionSuggestionKind.IDENTIFIER,
+        prefix: prefix,
+        relevance: relevance,
+      ),
+    );
   }
 
   /// Add a suggestion for a type [parameter].
@@ -1038,7 +1103,7 @@
   CompletionSuggestion? _createSuggestion(Element element,
       {String? completion,
       protocol.ElementKind? elementKind,
-      CompletionSuggestionKind? kind,
+      required CompletionSuggestionKind kind,
       String? prefix,
       required int relevance}) {
     var inputs = _CompletionSuggestionInputs(
@@ -1081,7 +1146,7 @@
     Element element, {
     required String? completion,
     required protocol.ElementKind? elementKind,
-    required CompletionSuggestionKind? kind,
+    required CompletionSuggestionKind kind,
     required String? prefix,
     required int relevance,
   }) {
@@ -1096,7 +1161,6 @@
     if (prefix != null && prefix.isNotEmpty) {
       completion = '$prefix.$completion';
     }
-    kind ??= CompletionSuggestionKind.INVOCATION;
     var suggestion = CompletionSuggestion(kind, relevance, completion,
         completion.length, 0, element.hasOrInheritsDeprecated, false);
 
@@ -1256,7 +1320,7 @@
 class _CompletionSuggestionInputs {
   final String? completion;
   final protocol.ElementKind? elementKind;
-  final CompletionSuggestionKind? kind;
+  final CompletionSuggestionKind kind;
   final String? prefix;
 
   _CompletionSuggestionInputs({
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/type_member_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/type_member_contributor.dart
index 589c793..3717b9c 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/type_member_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/type_member_contributor.dart
@@ -4,6 +4,7 @@
 
 import 'dart:collection';
 
+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/completion_manager.dart';
 import 'package:analysis_server/src/services/completion/dart/suggestion_builder.dart';
@@ -253,7 +254,10 @@
         // Exclude static methods when completion on an instance.
         if (!method.isStatic) {
           addSuggestionForMethod(
-              method: method, inheritanceDistance: inheritanceDistance);
+            method: method,
+            kind: protocol.CompletionSuggestionKind.INVOCATION,
+            inheritanceDistance: inheritanceDistance,
+          );
         }
       }
       for (var accessor in targetType.accessors) {
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/add_field_formal_parameters.dart b/pkg/analysis_server/lib/src/services/correction/dart/add_field_formal_parameters.dart
index 4a1c1e4..c392597 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/add_field_formal_parameters.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/add_field_formal_parameters.dart
@@ -4,6 +4,7 @@
 
 import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
 import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer/dart/analysis/features.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/src/generated/error_verifier.dart';
@@ -35,16 +36,23 @@
     // Compute uninitialized final fields.
     var fields = ErrorVerifier.computeNotInitializedFields(constructor);
     fields.retainWhere((FieldElement field) => field.isFinal);
-
-    // Prepare new parameters code.
     fields.sort((a, b) => a.nameOffset - b.nameOffset);
-    var fieldParametersCode =
-        fields.map((field) => 'this.${field.name}').join(', ');
 
     // Specialize for Flutter widgets.
     if (flutter.isExactlyStatelessWidgetType(superType) ||
         flutter.isExactlyStatefulWidgetType(superType)) {
       if (parameters.isNotEmpty && parameters.last.isNamed) {
+        var isNullSafe =
+            libraryElement.featureSet.isEnabled(Feature.non_nullable);
+        String parameterForField(FieldElement field) {
+          var prefix = '';
+          if (isNullSafe && typeSystem.isPotentiallyNonNullable(field.type)) {
+            prefix = 'required ';
+          }
+          return '${prefix}this.${field.name}';
+        }
+
+        var fieldParametersCode = fields.map(parameterForField).join(', ');
         await builder.addDartFileEdit(file, (builder) {
           builder.addSimpleInsertion(
             parameters.last.end,
@@ -63,6 +71,8 @@
       }
     }
 
+    var fieldParametersCode =
+        fields.map((field) => 'this.${field.name}').join(', ');
     await builder.addDartFileEdit(file, (builder) {
       if (lastRequiredParameter != null) {
         builder.addSimpleInsertion(
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/make_final.dart b/pkg/analysis_server/lib/src/services/correction/dart/make_final.dart
index 2a5b705..a9b1c89 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/make_final.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/make_final.dart
@@ -43,22 +43,30 @@
       return;
     }
 
-    if (node is SimpleFormalParameter) {
+    final AstNode normalParameter;
+    if (node is DefaultFormalParameter) {
+      normalParameter = node.parameter;
+    } else {
+      normalParameter = node;
+    }
+
+    if (normalParameter is SimpleFormalParameter) {
+      final simpleNode = normalParameter;
       await builder.addDartFileEdit(file, (builder) {
-        final keyword = node.keyword;
+        final keyword = simpleNode.keyword;
         if (keyword != null && keyword.keyword == Keyword.VAR) {
           builder.addSimpleReplacement(range.token(keyword), 'final');
         } else {
-          final type = node.type;
+          final type = simpleNode.type;
           if (type != null) {
             builder.addSimpleInsertion(type.offset, 'final ');
             return;
           }
-          final identifier = node.identifier;
+          final identifier = simpleNode.identifier;
           if (identifier != null) {
             builder.addSimpleInsertion(identifier.offset, 'final ');
           } else {
-            builder.addSimpleInsertion(node.offset, 'final ');
+            builder.addSimpleInsertion(simpleNode.offset, 'final ');
           }
         }
       });
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 0186ba9..1b58a84 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
@@ -889,6 +889,9 @@
       AddRequiredKeyword.newInstance,
       MakeVariableNullable.newInstance,
     ],
+    CompileTimeErrorCode.MISSING_DEFAULT_VALUE_FOR_PARAMETER_WITH_ANNOTATION: [
+      AddRequiredKeyword.newInstance,
+    ],
     CompileTimeErrorCode.MISSING_REQUIRED_ARGUMENT: [
       AddMissingRequiredArgument.newInstance,
     ],
diff --git a/pkg/analysis_server/test/domain_completion_test.dart b/pkg/analysis_server/test/domain_completion_test.dart
index b73ad91..c7b86d9 100644
--- a/pkg/analysis_server/test/domain_completion_test.dart
+++ b/pkg/analysis_server/test/domain_completion_test.dart
@@ -1779,42 +1779,42 @@
     addTestFile('class A {bool foo; A() : ^;}');
     await getSuggestions();
     assertHasResult(CompletionSuggestionKind.KEYWORD, 'super');
-    assertHasResult(CompletionSuggestionKind.INVOCATION, 'foo');
+    assertHasResult(CompletionSuggestionKind.IDENTIFIER, 'foo');
   }
 
   Future<void> test_constructor2() async {
     addTestFile('class A {bool foo; A() : s^;}');
     await getSuggestions();
     assertHasResult(CompletionSuggestionKind.KEYWORD, 'super');
-    assertHasResult(CompletionSuggestionKind.INVOCATION, 'foo');
+    assertHasResult(CompletionSuggestionKind.IDENTIFIER, 'foo');
   }
 
   Future<void> test_constructor3() async {
     addTestFile('class A {bool foo; A() : a=7,^;}');
     await getSuggestions();
     assertHasResult(CompletionSuggestionKind.KEYWORD, 'super');
-    assertHasResult(CompletionSuggestionKind.INVOCATION, 'foo');
+    assertHasResult(CompletionSuggestionKind.IDENTIFIER, 'foo');
   }
 
   Future<void> test_constructor4() async {
     addTestFile('class A {bool foo; A() : a=7,s^;}');
     await getSuggestions();
     assertHasResult(CompletionSuggestionKind.KEYWORD, 'super');
-    assertHasResult(CompletionSuggestionKind.INVOCATION, 'foo');
+    assertHasResult(CompletionSuggestionKind.IDENTIFIER, 'foo');
   }
 
   Future<void> test_constructor5() async {
     addTestFile('class A {bool foo; A() : a=7,s^}');
     await getSuggestions();
     assertHasResult(CompletionSuggestionKind.KEYWORD, 'super');
-    assertHasResult(CompletionSuggestionKind.INVOCATION, 'foo');
+    assertHasResult(CompletionSuggestionKind.IDENTIFIER, 'foo');
   }
 
   Future<void> test_constructor6() async {
     addTestFile('class A {bool foo; A() : a=7,^ void bar() {}}');
     await getSuggestions();
     assertHasResult(CompletionSuggestionKind.KEYWORD, 'super');
-    assertHasResult(CompletionSuggestionKind.INVOCATION, 'foo');
+    assertHasResult(CompletionSuggestionKind.IDENTIFIER, 'foo');
   }
 
   Future<void> test_extension() async {
@@ -2228,7 +2228,7 @@
 class A { var isVisible;}
 void f(A p) { var v1 = p.is^; }''');
     await getSuggestions();
-    assertHasResult(CompletionSuggestionKind.INVOCATION, 'isVisible');
+    assertHasResult(CompletionSuggestionKind.IDENTIFIER, 'isVisible');
   }
 
   Future<void> test_keyword() {
@@ -2311,7 +2311,7 @@
     expect(replacementLength, equals(0));
 
     // The class is suggested.
-    assertHasResult(CompletionSuggestionKind.INVOCATION, 'A');
+    assertHasResult(CompletionSuggestionKind.IDENTIFIER, 'A');
 
     // Class and all its constructors are shadowed by the local variable.
     assertNoResult('A', elementKind: ElementKind.CLASS);
@@ -2326,8 +2326,8 @@
       expect(replacementLength, equals(0));
       assertHasResult(CompletionSuggestionKind.IDENTIFIER, 'A',
           elementKind: ElementKind.CLASS);
-      assertHasResult(CompletionSuggestionKind.INVOCATION, 'a');
-      assertHasResult(CompletionSuggestionKind.INVOCATION, 'b');
+      assertHasResult(CompletionSuggestionKind.IDENTIFIER, 'a');
+      assertHasResult(CompletionSuggestionKind.IDENTIFIER, 'b');
       assertHasResult(CompletionSuggestionKind.INVOCATION, 'x');
       assertHasResult(CompletionSuggestionKind.IDENTIFIER, 'DateTime',
           elementKind: ElementKind.CLASS);
@@ -2459,7 +2459,7 @@
       expect(replacementLength, equals(4));
       // Suggestions based upon imported elements are partially filtered
       //assertHasResult(CompletionSuggestionKind.INVOCATION, 'Object');
-      assertHasResult(CompletionSuggestionKind.INVOCATION, 'test');
+      assertHasResult(CompletionSuggestionKind.IDENTIFIER, 'test');
       assertNoResult('HtmlElement');
     });
   }
@@ -2663,7 +2663,7 @@
   }
 
   void assertGetter() {
-    expect(suggestion.kind, CompletionSuggestionKind.INVOCATION);
+    expect(suggestion.kind, CompletionSuggestionKind.IDENTIFIER);
     expect(suggestion.element?.kind, ElementKind.GETTER);
   }
 
@@ -2682,12 +2682,12 @@
   }
 
   void assertSetter() {
-    expect(suggestion.kind, CompletionSuggestionKind.INVOCATION);
+    expect(suggestion.kind, CompletionSuggestionKind.IDENTIFIER);
     expect(suggestion.element?.kind, ElementKind.SETTER);
   }
 
   void assertTopLevelVariable() {
-    expect(suggestion.kind, CompletionSuggestionKind.INVOCATION);
+    expect(suggestion.kind, CompletionSuggestionKind.IDENTIFIER);
     expect(suggestion.element?.kind, ElementKind.TOP_LEVEL_VARIABLE);
   }
 }
diff --git a/pkg/analysis_server/test/integration/support/integration_test_methods.dart b/pkg/analysis_server/test/integration/support/integration_test_methods.dart
index b8704aa..23a7a61 100644
--- a/pkg/analysis_server/test/integration/support/integration_test_methods.dart
+++ b/pkg/analysis_server/test/integration/support/integration_test_methods.dart
@@ -1041,8 +1041,12 @@
   ///   requested maxResults.
   Future<CompletionGetSuggestions2Result> sendCompletionGetSuggestions2(
       String file, int offset, int maxResults,
-      {int? timeout}) async {
+      {CompletionMode? completionMode,
+      int? invocationCount,
+      int? timeout}) async {
     var params = CompletionGetSuggestions2Params(file, offset, maxResults,
+            completionMode: completionMode,
+            invocationCount: invocationCount,
             timeout: timeout)
         .toJson();
     var result = await server.send('completion.getSuggestions2', params);
diff --git a/pkg/analysis_server/test/integration/support/protocol_matchers.dart b/pkg/analysis_server/test/integration/support/protocol_matchers.dart
index a7e358db..4f35ccd 100644
--- a/pkg/analysis_server/test/integration/support/protocol_matchers.dart
+++ b/pkg/analysis_server/test/integration/support/protocol_matchers.dart
@@ -235,6 +235,15 @@
 /// String
 final Matcher isCompletionId = isString;
 
+/// CompletionMode
+///
+/// enum {
+///   BASIC
+///   SMART
+/// }
+final Matcher isCompletionMode =
+    MatchesEnum('CompletionMode', ['BASIC', 'SMART']);
+
 /// CompletionService
 ///
 /// enum {
@@ -2138,9 +2147,15 @@
 ///   "maxResults": int
 /// }
 final Matcher isCompletionGetSuggestions2Params = LazyMatcher(() =>
-    MatchesJsonObject('completion.getSuggestions2 params',
-        {'file': isFilePath, 'offset': isInt, 'maxResults': isInt},
-        optionalFields: {'timeout': isInt}));
+    MatchesJsonObject('completion.getSuggestions2 params', {
+      'file': isFilePath,
+      'offset': isInt,
+      'maxResults': isInt
+    }, optionalFields: {
+      'completionMode': isCompletionMode,
+      'invocationCount': isInt,
+      'timeout': isInt
+    }));
 
 /// completion.getSuggestions2 result
 ///
diff --git a/pkg/analysis_server/test/services/completion/dart/arglist_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/arglist_contributor_test.dart
index 6c4801c..8128659 100644
--- a/pkg/analysis_server/test/services/completion/dart/arglist_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/arglist_contributor_test.dart
@@ -2,14 +2,11 @@
 // 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';
 import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
 import 'package:analysis_server/src/services/completion/dart/arglist_contributor.dart';
 import 'package:analysis_server/src/services/completion/dart/completion_manager.dart';
 import 'package:analysis_server/src/services/completion/dart/suggestion_builder.dart';
-import 'package:analyzer_plugin/protocol/protocol_common.dart';
 import 'package:analyzer_utilities/check/check.dart';
-import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import 'completion_check.dart';
@@ -49,21 +46,22 @@
 }
 ''';
     addTestSource(content);
-    await computeSuggestions();
-    expect(suggestions, hasLength(1));
 
-    var suggestion = suggestions[0];
-    expect(suggestion.docSummary, 'aaa');
-    expect(suggestion.docComplete, 'aaa\n\nbbb\nccc');
-
-    var element = suggestion.element!;
-    expect(element.kind, ElementKind.PARAMETER);
-    expect(element.name, 'fff');
-    expect(element.location!.offset, content.indexOf('fff})'));
+    var response = await computeSuggestions2();
+    _checkNamedArguments(response).matchesInAnyOrder([
+      (suggestion) => suggestion
+        ..completion.isEqualTo('fff: ')
+        ..docComplete.isEqualTo('aaa\n\nbbb\nccc')
+        ..docSummary.isEqualTo('aaa')
+        ..hasSelection(offset: 5)
+        ..element.isNotNull.which((e) => e
+          ..isParameter
+          ..name.isEqualTo('fff'))
+    ]);
   }
 
   Future<void> test_fieldFormal_noDocumentation() async {
-    var content = '''
+    addTestSource('''
 class A {
   int fff;
   A({this.fff});
@@ -71,19 +69,19 @@
 main() {
   new A(^);
 }
-''';
-    addTestSource(content);
-    await computeSuggestions();
-    expect(suggestions, hasLength(1));
+''');
 
-    var suggestion = suggestions[0];
-    expect(suggestion.docSummary, isNull);
-    expect(suggestion.docComplete, isNull);
-
-    var element = suggestion.element!;
-    expect(element.kind, ElementKind.PARAMETER);
-    expect(element.name, 'fff');
-    expect(element.location!.offset, content.indexOf('fff})'));
+    var response = await computeSuggestions2();
+    _checkNamedArguments(response).matchesInAnyOrder([
+      (suggestion) => suggestion
+        ..completion.isEqualTo('fff: ')
+        ..docComplete.isNull
+        ..docSummary.isNull
+        ..hasSelection(offset: 5)
+        ..element.isNotNull.which((e) => e
+          ..isParameter
+          ..name.isEqualTo('fff'))
+    ]);
   }
 
   Future<void> test_flutter_InstanceCreationExpression_0() async {
@@ -97,13 +95,13 @@
   );
 ''');
 
-    await computeSuggestions();
-
-    assertSuggest('children: [],',
-        csKind: CompletionSuggestionKind.NAMED_ARGUMENT,
-        defaultArgListString: null,
-        selectionOffset: 11,
-        defaultArgumentListTextRanges: null);
+    var response = await computeSuggestions2();
+    _checkNamedArguments(response).containsMatch((suggestion) {
+      suggestion
+        ..completion.isEqualTo('children: [],')
+        ..defaultArgumentListString.isNull
+        ..hasSelection(offset: 11);
+    });
   }
 
   Future<void> test_flutter_InstanceCreationExpression_01() async {
@@ -119,12 +117,13 @@
   );
 ''');
 
-    await computeSuggestions();
-
-    assertSuggest('backgroundColor: ,',
-        csKind: CompletionSuggestionKind.NAMED_ARGUMENT,
-        defaultArgListString: null, // No default values.
-        selectionOffset: 17);
+    var response = await computeSuggestions2();
+    _checkNamedArguments(response).containsMatch((suggestion) {
+      suggestion
+        ..completion.isEqualTo('backgroundColor: ,')
+        ..defaultArgumentListString.isNull
+        ..hasSelection(offset: 17);
+    });
   }
 
   Future<void> test_flutter_InstanceCreationExpression_1() async {
@@ -139,13 +138,13 @@
   );
 ''');
 
-    await computeSuggestions();
-
-    assertSuggest('children: [],',
-        csKind: CompletionSuggestionKind.NAMED_ARGUMENT,
-        defaultArgListString: null,
-        selectionOffset: 11,
-        defaultArgumentListTextRanges: null);
+    var response = await computeSuggestions2();
+    _checkNamedArguments(response).containsMatch((suggestion) {
+      suggestion
+        ..completion.isEqualTo('children: [],')
+        ..defaultArgumentListString.isNull
+        ..hasSelection(offset: 11);
+    });
   }
 
   Future<void> test_flutter_InstanceCreationExpression_2() async {
@@ -160,13 +159,13 @@
   );
 ''');
 
-    await computeSuggestions();
-
-    assertSuggest('children: [],',
-        csKind: CompletionSuggestionKind.NAMED_ARGUMENT,
-        defaultArgListString: null,
-        selectionOffset: 11,
-        defaultArgumentListTextRanges: null);
+    var response = await computeSuggestions2();
+    _checkNamedArguments(response).containsMatch((suggestion) {
+      suggestion
+        ..completion.isEqualTo('children: [],')
+        ..defaultArgumentListString.isNull
+        ..hasSelection(offset: 11);
+    });
   }
 
   Future<void>
@@ -187,13 +186,13 @@
 }
 ''');
 
-    await computeSuggestions();
-
-    assertSuggest('children: [],',
-        csKind: CompletionSuggestionKind.NAMED_ARGUMENT,
-        defaultArgListString: null,
-        selectionOffset: 11,
-        defaultArgumentListTextRanges: null);
+    var response = await computeSuggestions2();
+    _checkNamedArguments(response).matchesInAnyOrder([
+      (suggestion) => suggestion
+        ..completion.isEqualTo('children: [],')
+        ..defaultArgumentListString.isNull
+        ..hasSelection(offset: 11),
+    ]);
   }
 
   Future<void> test_flutter_InstanceCreationExpression_children_Map() async {
@@ -212,12 +211,13 @@
 }
 ''');
 
-    await computeSuggestions();
-
-    assertSuggest('children: ,',
-        csKind: CompletionSuggestionKind.NAMED_ARGUMENT,
-        selectionOffset: 10,
-        defaultArgListString: null);
+    var response = await computeSuggestions2();
+    _checkNamedArguments(response).matchesInAnyOrder([
+      (suggestion) => suggestion
+        ..completion.isEqualTo('children: ,')
+        ..defaultArgumentListString.isNull
+        ..hasSelection(offset: 10),
+    ]);
   }
 
   Future<void> test_flutter_InstanceCreationExpression_slivers() async {
@@ -235,13 +235,13 @@
 }
 ''');
 
-    await computeSuggestions();
-
-    assertSuggest('slivers: [],',
-        csKind: CompletionSuggestionKind.NAMED_ARGUMENT,
-        defaultArgListString: null,
-        selectionOffset: 10,
-        defaultArgumentListTextRanges: null);
+    var response = await computeSuggestions2();
+    _checkNamedArguments(response).matchesInAnyOrder([
+      (suggestion) => suggestion
+        ..completion.isEqualTo('slivers: [],')
+        ..defaultArgumentListString.isNull
+        ..hasSelection(offset: 10),
+    ]);
   }
 
   Future<void> test_flutter_MethodExpression_children() async {
@@ -261,11 +261,13 @@
 foo({String children}) {}
 ''');
 
-    await computeSuggestions();
-
-    assertSuggest('children: ',
-        csKind: CompletionSuggestionKind.NAMED_ARGUMENT,
-        defaultArgListString: null);
+    var response = await computeSuggestions2();
+    _checkNamedArguments(response).matchesInAnyOrder([
+      (suggestion) => suggestion
+        ..completion.isEqualTo('children: ')
+        ..defaultArgumentListString.isNull
+        ..defaultArgumentListTextRanges.isNull,
+    ]);
   }
 
   Future<void> test_named_01() async {
@@ -273,7 +275,7 @@
       parameters: '({bool one, int two})',
       arguments: '(^)',
       check: (response) {
-        check(response).suggestions.namedArguments.matchesInAnyOrder([
+        _checkNamedArguments(response).matchesInAnyOrder([
           (suggestion) => suggestion
             ..completion.isEqualTo('one: ')
             ..parameterType.isEqualTo('bool')
@@ -294,7 +296,7 @@
       parameters: '({bool one, int two})',
       arguments: '(o^)',
       check: (response) {
-        check(response).suggestions.namedArguments.matchesInAnyOrder([
+        _checkNamedArguments(response).matchesInAnyOrder([
           (suggestion) => suggestion
             ..completion.isEqualTo('one: ')
             ..parameterType.isEqualTo('bool')
@@ -315,7 +317,7 @@
       parameters: '({bool one, int two})',
       arguments: '(o^ two: 2)',
       check: (response) {
-        check(response).suggestions.namedArguments.matchesInAnyOrder([
+        _checkNamedArguments(response).matchesInAnyOrder([
           (suggestion) => suggestion
             ..completion.isEqualTo('one: ,')
             ..parameterType.isEqualTo('bool')
@@ -331,7 +333,7 @@
       parameters: '({bool one, int two})',
       arguments: '(o^, two: 2)',
       check: (response) {
-        check(response).suggestions.namedArguments.matchesInAnyOrder([
+        _checkNamedArguments(response).matchesInAnyOrder([
           (suggestion) => suggestion
             ..completion.isEqualTo('one: ')
             ..parameterType.isEqualTo('bool')
@@ -347,7 +349,7 @@
       parameters: '({bool one, int two})',
       arguments: '(o^ , two: 2)',
       check: (response) {
-        check(response).suggestions.namedArguments.matchesInAnyOrder([
+        _checkNamedArguments(response).matchesInAnyOrder([
           (suggestion) => suggestion
             ..completion.isEqualTo('one: ')
             ..parameterType.isEqualTo('bool')
@@ -363,7 +365,7 @@
       parameters: '({bool one, int two})',
       arguments: '(^o,)',
       check: (response) {
-        check(response).suggestions.namedArguments.matchesInAnyOrder([
+        _checkNamedArguments(response).matchesInAnyOrder([
           (suggestion) => suggestion
             ..completion.isEqualTo('one: ')
             ..parameterType.isEqualTo('bool')
@@ -384,7 +386,7 @@
       parameters: '({bool one, int two})',
       arguments: '(^ two: 2)',
       check: (response) {
-        check(response).suggestions.namedArguments.matchesInAnyOrder([
+        _checkNamedArguments(response).matchesInAnyOrder([
           (suggestion) => suggestion
             ..completion.isEqualTo('one: ,')
             ..parameterType.isEqualTo('bool')
@@ -400,7 +402,7 @@
       parameters: '({bool one, int two})',
       arguments: '(^two: 2)',
       check: (response) {
-        check(response).suggestions.namedArguments.matchesInAnyOrder([
+        _checkNamedArguments(response).matchesInAnyOrder([
           (suggestion) => suggestion
             ..completion.isEqualTo('one: ,')
             ..parameterType.isEqualTo('bool')
@@ -416,7 +418,7 @@
       parameters: '({bool one, int two})',
       arguments: '(^, two: 2)',
       check: (response) {
-        check(response).suggestions.namedArguments.matchesInAnyOrder([
+        _checkNamedArguments(response).matchesInAnyOrder([
           (suggestion) => suggestion
             ..completion.isEqualTo('one: ')
             ..parameterType.isEqualTo('bool')
@@ -432,7 +434,7 @@
       parameters: '({bool one, int two})',
       arguments: '(^ , two: 2)',
       check: (response) {
-        check(response).suggestions.namedArguments.matchesInAnyOrder([
+        _checkNamedArguments(response).matchesInAnyOrder([
           (suggestion) => suggestion
             ..completion.isEqualTo('one: ')
             ..parameterType.isEqualTo('bool')
@@ -448,7 +450,7 @@
       parameters: '(int one, {bool two, int three})',
       arguments: '(1, ^, three: 3)',
       check: (response) {
-        check(response).suggestions.namedArguments.matchesInAnyOrder([
+        _checkNamedArguments(response).matchesInAnyOrder([
           (suggestion) => suggestion
             ..completion.isEqualTo('two: ')
             ..parameterType.isEqualTo('bool')
@@ -464,7 +466,7 @@
       parameters: '(int one, {bool two, int three})',
       arguments: '(1, ^ three: 3)',
       check: (response) {
-        check(response).suggestions.namedArguments.matchesInAnyOrder([
+        _checkNamedArguments(response).matchesInAnyOrder([
           (suggestion) => suggestion
             ..completion.isEqualTo('two: ,')
             ..parameterType.isEqualTo('bool')
@@ -480,7 +482,7 @@
       parameters: '(int one, {bool two, int three})',
       arguments: '(1, ^three: 3)',
       check: (response) {
-        check(response).suggestions.namedArguments.matchesInAnyOrder([
+        _checkNamedArguments(response).matchesInAnyOrder([
           (suggestion) => suggestion
             ..completion.isEqualTo('two: ,')
             ..parameterType.isEqualTo('bool')
@@ -497,7 +499,7 @@
       parameters: '({bool one, int two})',
       arguments: '(two: 2^)',
       check: (response) {
-        check(response).suggestions.namedArguments.isEmpty;
+        _checkNamedArguments(response).isEmpty;
       },
     );
   }
@@ -508,7 +510,7 @@
       parameters: '({bool one, int two})',
       arguments: '(two: 2 ^)',
       check: (response) {
-        check(response).suggestions.namedArguments.isEmpty;
+        _checkNamedArguments(response).isEmpty;
       },
     );
   }
@@ -518,7 +520,7 @@
       parameters: '({bool one, int two})',
       arguments: '(two: 2, ^)',
       check: (response) {
-        check(response).suggestions.namedArguments.matchesInAnyOrder([
+        _checkNamedArguments(response).matchesInAnyOrder([
           (suggestion) => suggestion
             ..completion.isEqualTo('one: ')
             ..parameterType.isEqualTo('bool')
@@ -534,7 +536,7 @@
       parameters: '({bool one, int two})',
       arguments: '(two: 2, o^)',
       check: (response) {
-        check(response).suggestions.namedArguments.matchesInAnyOrder([
+        _checkNamedArguments(response).matchesInAnyOrder([
           (suggestion) => suggestion
             ..completion.isEqualTo('one: ')
             ..parameterType.isEqualTo('bool')
@@ -550,7 +552,7 @@
       parameters: '({bool one, int two})',
       arguments: '(two: 2, o^,)',
       check: (response) {
-        check(response).suggestions.namedArguments.matchesInAnyOrder([
+        _checkNamedArguments(response).matchesInAnyOrder([
           (suggestion) => suggestion
             ..completion.isEqualTo('one: ')
             ..parameterType.isEqualTo('bool')
@@ -566,7 +568,7 @@
       parameters: '(int one, int two, int three, {int four, int five})',
       arguments: '(1, ^, 3)',
       check: (response) {
-        check(response).suggestions.namedArguments.matchesInAnyOrder([
+        _checkNamedArguments(response).matchesInAnyOrder([
           (suggestion) => suggestion
             ..completion.isEqualTo('four: ')
             ..parameterType.isEqualTo('int')
@@ -588,7 +590,7 @@
       parameters: '(int one, int two, int three, {int four, int five})',
       arguments: '(1, ^, 3)',
       check: (response) {
-        check(response).suggestions.namedArguments.isEmpty;
+        _checkNamedArguments(response).isEmpty;
       },
     );
   }
@@ -598,7 +600,7 @@
       parameters: '({bool one, int two})',
       arguments: '(o^: false)',
       check: (response) {
-        check(response).suggestions.namedArguments.matchesInAnyOrder([
+        _checkNamedArguments(response).matchesInAnyOrder([
           (suggestion) => suggestion
             ..completion.isEqualTo('one')
             ..parameterType.isEqualTo('bool')
@@ -619,7 +621,7 @@
       parameters: '(bool one, {int two, double three})',
       arguments: '(false, ^t: 2)',
       check: (response) {
-        check(response).suggestions.namedArguments.matchesInAnyOrder([
+        _checkNamedArguments(response).matchesInAnyOrder([
           (suggestion) => suggestion
             ..completion.isEqualTo('two: ,')
             ..parameterType.isEqualTo('int')
@@ -640,7 +642,7 @@
       parameters: '(bool one, {int two})',
       arguments: '(false, foo^ba: 2)',
       check: (response) {
-        check(response).suggestions.namedArguments.matchesInAnyOrder([
+        _checkNamedArguments(response).matchesInAnyOrder([
           (suggestion) => suggestion
             ..completion.isEqualTo('two')
             ..parameterType.isEqualTo('int')
@@ -656,7 +658,7 @@
       parameters: '(bool one, {int two, double three})',
       arguments: '(false, ^: 2)',
       check: (response) {
-        check(response).suggestions.namedArguments.matchesInAnyOrder([
+        _checkNamedArguments(response).matchesInAnyOrder([
           (suggestion) => suggestion
             // TODO(scheglov) This does not seem right.
             ..completion.isEqualTo('two: ')
@@ -679,7 +681,7 @@
       parameters: '({bool one, int two})',
       arguments: '(one: ^)',
       check: (response) {
-        check(response).suggestions.namedArguments.isEmpty;
+        _checkNamedArguments(response).isEmpty;
       },
     );
   }
@@ -695,15 +697,8 @@
         : '// no language version override';
 
     Future<void> computeAndCheck() async {
-      await computeSuggestions();
-      check(
-        CompletionResponseForTesting(
-          requestOffset: completionOffset,
-          replacementOffset: replacementOffset,
-          replacementLength: replacementLength,
-          suggestions: suggestions,
-        ),
-      );
+      var response = await computeSuggestions2();
+      check(response);
     }
 
     // Annotation, local class.
@@ -851,4 +846,9 @@
     await computeSuggestions();
     assertNoSuggestions();
   }
+
+  static CheckTarget<Iterable<CompletionSuggestionForTesting>>
+      _checkNamedArguments(CompletionResponseForTesting response) {
+    return check(response).suggestions.namedArguments;
+  }
 }
diff --git a/pkg/analysis_server/test/services/completion/dart/combinator_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/combinator_contributor_test.dart
index a04f0be..3b1df62 100644
--- a/pkg/analysis_server/test/services/completion/dart/combinator_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/combinator_contributor_test.dart
@@ -63,8 +63,7 @@
     assertSuggestClass('A', kind: CompletionSuggestionKind.IDENTIFIER);
     assertSuggestClass('B', kind: CompletionSuggestionKind.IDENTIFIER);
     assertSuggestClass('PB', kind: CompletionSuggestionKind.IDENTIFIER);
-    assertSuggestTopLevelVar('T1', null,
-        kind: CompletionSuggestionKind.IDENTIFIER);
+    assertSuggestTopLevelVar('T1', null);
     assertSuggestFunction('F1', 'PB',
         kind: CompletionSuggestionKind.IDENTIFIER);
     assertNotSuggested('C');
@@ -107,8 +106,7 @@
     assertSuggestClass('B', kind: CompletionSuggestionKind.IDENTIFIER);
     assertNotSuggested('_AB');
     assertSuggestClass('PB', kind: CompletionSuggestionKind.IDENTIFIER);
-    assertSuggestTopLevelVar('T1', null,
-        kind: CompletionSuggestionKind.IDENTIFIER);
+    assertSuggestTopLevelVar('T1', null);
     assertSuggestFunction('F1', 'PB',
         kind: CompletionSuggestionKind.IDENTIFIER);
     assertSuggestClass('Clz', kind: CompletionSuggestionKind.IDENTIFIER);
@@ -147,8 +145,7 @@
   Future<void> test_Combinator_show_pi() async {
     addTestSource('import "dart:math" show ^;');
     await computeSuggestions();
-    assertSuggestTopLevelVar('pi', 'double',
-        kind: CompletionSuggestionKind.IDENTIFIER);
+    assertSuggestTopLevelVar('pi', 'double');
   }
 
   Future<void> test_Combinator_show_recursive() async {
diff --git a/pkg/analysis_server/test/services/completion/dart/completion_check.dart b/pkg/analysis_server/test/services/completion/dart/completion_check.dart
index 669cf76..f9cdaf1 100644
--- a/pkg/analysis_server/test/services/completion/dart/completion_check.dart
+++ b/pkg/analysis_server/test/services/completion/dart/completion_check.dart
@@ -56,10 +56,12 @@
 extension CompletionResponseExtension
     on CheckTarget<CompletionResponseForTesting> {
   CheckTarget<List<CompletionSuggestionForTesting>> get suggestions {
-    var suggestions = value.suggestions
-        .map((e) =>
-            CompletionSuggestionForTesting(response: value, suggestion: e))
-        .toList();
+    var suggestions = value.suggestions.map((e) {
+      return CompletionSuggestionForTesting(
+        response: value,
+        suggestion: e,
+      );
+    }).toList();
     return nest(
       suggestions,
       (selected) => 'suggestions ${valueStr(selected)}',
@@ -76,6 +78,41 @@
     );
   }
 
+  CheckTarget<String?> get defaultArgumentListString {
+    return nest(
+      value.suggestion.defaultArgumentListString,
+      (selected) => 'has defaultArgumentListString ${valueStr(selected)}',
+    );
+  }
+
+  CheckTarget<List<int>?> get defaultArgumentListTextRanges {
+    return nest(
+      value.suggestion.defaultArgumentListTextRanges,
+      (selected) => 'has defaultArgumentListTextRanges ${valueStr(selected)}',
+    );
+  }
+
+  CheckTarget<String?> get docComplete {
+    return nest(
+      value.suggestion.docComplete,
+      (selected) => 'has docComplete ${valueStr(selected)}',
+    );
+  }
+
+  CheckTarget<String?> get docSummary {
+    return nest(
+      value.suggestion.docSummary,
+      (selected) => 'has docSummary ${valueStr(selected)}',
+    );
+  }
+
+  CheckTarget<Element?> get element {
+    return nest(
+      value.suggestion.element,
+      (selected) => 'has element ${valueStr(selected)}',
+    );
+  }
+
   CheckTarget<String?> get parameterType {
     return nest(
       value.suggestion.parameterType,
@@ -146,3 +183,23 @@
     );
   }
 }
+
+extension ElementExtension on CheckTarget<Element> {
+  void get isParameter {
+    kind.isEqualTo(ElementKind.PARAMETER);
+  }
+
+  CheckTarget<ElementKind> get kind {
+    return nest(
+      value.kind,
+      (selected) => 'has kind ${valueStr(selected)}',
+    );
+  }
+
+  CheckTarget<String> get name {
+    return nest(
+      value.name,
+      (selected) => 'has name ${valueStr(selected)}',
+    );
+  }
+}
diff --git a/pkg/analysis_server/test/services/completion/dart/completion_contributor_util.dart b/pkg/analysis_server/test/services/completion/dart/completion_contributor_util.dart
index 7b202bf..a750956 100644
--- a/pkg/analysis_server/test/services/completion/dart/completion_contributor_util.dart
+++ b/pkg/analysis_server/test/services/completion/dart/completion_contributor_util.dart
@@ -17,6 +17,7 @@
 import 'package:test/test.dart';
 
 import '../../../abstract_context.dart';
+import 'completion_check.dart';
 
 SuggestionMatcher suggestionHas(
         {required String completion,
@@ -267,7 +268,7 @@
   }
 
   CompletionSuggestion assertSuggestClassTypeAlias(String name,
-      {CompletionSuggestionKind kind = CompletionSuggestionKind.INVOCATION}) {
+      {CompletionSuggestionKind kind = CompletionSuggestionKind.IDENTIFIER}) {
     var cs = assertSuggest(name, csKind: kind);
     var element = cs.element!;
     expect(element.kind, equals(ElementKind.CLASS_TYPE_ALIAS));
@@ -309,7 +310,11 @@
 
   CompletionSuggestion assertSuggestEnumConst(String completion,
       {bool isDeprecated = false}) {
-    var suggestion = assertSuggest(completion, isDeprecated: isDeprecated);
+    var suggestion = assertSuggest(
+      completion,
+      csKind: CompletionSuggestionKind.IDENTIFIER,
+      isDeprecated: isDeprecated,
+    );
     expect(suggestion.completion, completion);
     expect(suggestion.isDeprecated, isDeprecated);
     expect(suggestion.element!.kind, ElementKind.ENUM_CONSTANT);
@@ -317,10 +322,11 @@
   }
 
   CompletionSuggestion assertSuggestField(String name, String? type,
-      {CompletionSuggestionKind kind = CompletionSuggestionKind.INVOCATION,
-      bool isDeprecated = false}) {
+      {bool isDeprecated = false}) {
     var cs = assertSuggest(name,
-        csKind: kind, elemKind: ElementKind.FIELD, isDeprecated: isDeprecated);
+        csKind: CompletionSuggestionKind.IDENTIFIER,
+        elemKind: ElementKind.FIELD,
+        isDeprecated: isDeprecated);
     // The returnType represents the type of a field
     expect(cs.returnType, type ?? 'dynamic');
     var element = cs.element!;
@@ -365,10 +371,13 @@
   }
 
   CompletionSuggestion assertSuggestGetter(String name, String? returnType,
-      {CompletionSuggestionKind kind = CompletionSuggestionKind.INVOCATION,
-      bool isDeprecated = false}) {
-    var cs = assertSuggest(name,
-        csKind: kind, elemKind: ElementKind.GETTER, isDeprecated: isDeprecated);
+      {bool isDeprecated = false}) {
+    var cs = assertSuggest(
+      name,
+      csKind: CompletionSuggestionKind.IDENTIFIER,
+      elemKind: ElementKind.GETTER,
+      isDeprecated: isDeprecated,
+    );
     expect(cs.returnType, returnType ?? 'dynamic');
     var element = cs.element!;
     expect(element.kind, equals(ElementKind.GETTER));
@@ -382,7 +391,7 @@
   CompletionSuggestion assertSuggestLocalVariable(
       String name, String? returnType) {
     // Local variables should only be suggested by LocalReferenceContributor
-    var cs = assertSuggest(name, csKind: CompletionSuggestionKind.INVOCATION);
+    var cs = assertSuggest(name, csKind: CompletionSuggestionKind.IDENTIFIER);
     expect(cs.returnType, returnType ?? 'dynamic');
     var element = cs.element!;
     expect(element.kind, equals(ElementKind.LOCAL_VARIABLE));
@@ -451,7 +460,7 @@
   }
 
   CompletionSuggestion assertSuggestParameter(String name, String? returnType) {
-    var cs = assertSuggest(name, csKind: CompletionSuggestionKind.INVOCATION);
+    var cs = assertSuggest(name, csKind: CompletionSuggestionKind.IDENTIFIER);
     expect(cs.returnType, returnType ?? 'dynamic');
     var element = cs.element!;
     expect(element.kind, equals(ElementKind.PARAMETER));
@@ -461,9 +470,12 @@
     return cs;
   }
 
-  CompletionSuggestion assertSuggestSetter(String name,
-      {CompletionSuggestionKind kind = CompletionSuggestionKind.INVOCATION}) {
-    var cs = assertSuggest(name, csKind: kind, elemKind: ElementKind.SETTER);
+  CompletionSuggestion assertSuggestSetter(String name) {
+    var cs = assertSuggest(
+      name,
+      csKind: CompletionSuggestionKind.IDENTIFIER,
+      elemKind: ElementKind.SETTER,
+    );
     var element = cs.element!;
     expect(element.kind, equals(ElementKind.SETTER));
     expect(element.name, equals(name));
@@ -478,11 +490,8 @@
   }
 
   CompletionSuggestion assertSuggestTopLevelVar(
-    String name,
-    String? returnType, {
-    CompletionSuggestionKind kind = CompletionSuggestionKind.INVOCATION,
-  }) {
-    var cs = assertSuggest(name, csKind: kind);
+      String name, String? returnType) {
+    var cs = assertSuggest(name, csKind: CompletionSuggestionKind.IDENTIFIER);
     if (returnType != null) {
       expect(cs.returnType, returnType);
     } else if (isNullExpectedReturnTypeConsideredDynamic) {
@@ -506,7 +515,7 @@
     String? aliasedType,
     String? returnType,
     bool isDeprecated = false,
-    CompletionSuggestionKind kind = CompletionSuggestionKind.INVOCATION,
+    CompletionSuggestionKind kind = CompletionSuggestionKind.IDENTIFIER,
   }) {
     var cs = assertSuggest(name, csKind: kind, isDeprecated: isDeprecated);
     if (returnType != null) {
@@ -567,6 +576,16 @@
     expect(suggestions, isNotNull, reason: 'expected suggestions');
   }
 
+  Future<CompletionResponseForTesting> computeSuggestions2() async {
+    await computeSuggestions();
+    return CompletionResponseForTesting(
+      requestOffset: completionOffset,
+      replacementOffset: replacementOffset,
+      replacementLength: replacementLength,
+      suggestions: suggestions,
+    );
+  }
+
   Never failedCompletion(String message,
       [Iterable<CompletionSuggestion>? completions]) {
     var sb = StringBuffer(message);
diff --git a/pkg/analysis_server/test/services/completion/dart/local_reference_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/local_reference_contributor_test.dart
index 1378b11..1e716a2 100644
--- a/pkg/analysis_server/test/services/completion/dart/local_reference_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/local_reference_contributor_test.dart
@@ -1307,12 +1307,12 @@
 
     expect(replacementOffset, completionOffset);
     expect(replacementLength, 0);
-    assertSuggest('e1', elemKind: ElementKind.FIELD);
-    assertSuggest('f1', elemKind: ElementKind.FIELD);
-    assertSuggest('i1', elemKind: ElementKind.FIELD);
-    assertSuggest('m1', elemKind: ElementKind.FIELD);
-    assertSuggest('f3', elemKind: ElementKind.GETTER);
-    assertSuggest('f4', elemKind: ElementKind.SETTER);
+    assertSuggestField('e1', null);
+    assertSuggestField('f1', null);
+    assertSuggestField('i1', 'int');
+    assertSuggestField('m1', null);
+    assertSuggestGetter('f3', null);
+    assertSuggestSetter('f4');
     assertSuggest('e2', elemKind: ElementKind.METHOD);
     assertSuggest('f2', elemKind: ElementKind.METHOD);
     assertSuggest('i2', elemKind: ElementKind.METHOD);
@@ -1386,12 +1386,12 @@
 
     expect(replacementOffset, completionOffset);
     expect(replacementLength, 0);
-    assertSuggest('e1', elemKind: ElementKind.FIELD);
-    assertSuggest('f1', elemKind: ElementKind.FIELD);
-    assertSuggest('i1', elemKind: ElementKind.FIELD);
-    assertSuggest('m1', elemKind: ElementKind.FIELD);
-    assertSuggest('f3', elemKind: ElementKind.GETTER);
-    assertSuggest('f4', elemKind: ElementKind.SETTER);
+    assertSuggestField('e1', null);
+    assertSuggestField('f1', null);
+    assertSuggestField('i1', 'int');
+    assertSuggestField('m1', null);
+    assertSuggestGetter('f3', null);
+    assertSuggestSetter('f4');
     assertSuggest('e2', elemKind: ElementKind.METHOD);
     assertSuggest('f2', elemKind: ElementKind.METHOD);
     assertSuggest('i2', elemKind: ElementKind.METHOD);
@@ -2446,7 +2446,7 @@
 ''');
     await computeSuggestions();
 
-    assertSuggest('E', elemKind: ElementKind.LOCAL_VARIABLE);
+    assertSuggestLocalVariable('E', 'int');
 
     // Enum and all its constants are shadowed by the local variable.
     assertNotSuggested('E', elemKind: ElementKind.ENUM);
@@ -2706,7 +2706,7 @@
     await computeSuggestions();
 
     assertNotSuggested('E', elemKind: ElementKind.EXTENSION);
-    assertSuggest('E', elemKind: ElementKind.LOCAL_VARIABLE);
+    assertSuggestLocalVariable('E', 'int');
   }
 
   Future<void> test_ExtensionDeclaration_unnamed() async {
@@ -2758,7 +2758,7 @@
     await computeSuggestions();
 
     assertNotSuggested('foo', elemKind: ElementKind.FIELD);
-    assertSuggest('foo', elemKind: ElementKind.LOCAL_VARIABLE);
+    assertSuggestLocalVariable('foo', 'int');
   }
 
   Future<void> test_FieldFormalParameter_in_non_constructor() async {
@@ -3335,7 +3335,7 @@
     await computeSuggestions();
 
     assertNotSuggested('bar', elemKind: ElementKind.FUNCTION);
-    assertSuggest('bar', elemKind: ElementKind.LOCAL_VARIABLE);
+    assertSuggestLocalVariable('bar', 'int');
   }
 
   Future<void> test_functionDeclaration_typeParameterBounds() async {
@@ -4196,7 +4196,7 @@
 ''');
     await computeSuggestions();
 
-    assertSuggest('A');
+    assertSuggestLocalVariable('A', 'int');
 
     // Class and all its constructors are shadowed by the local variable.
     assertNotSuggested('A', elemKind: ElementKind.CLASS);
@@ -4919,7 +4919,7 @@
     await computeSuggestions();
 
     assertNotSuggested('foo', elemKind: ElementKind.METHOD);
-    assertSuggest('foo', elemKind: ElementKind.LOCAL_VARIABLE);
+    assertSuggestLocalVariable('foo', 'dynamic');
   }
 
   Future<void> test_MethodDeclaration_shadowed2() async {
@@ -4940,7 +4940,7 @@
     await computeSuggestions();
 
     assertNotSuggested('foo', elemKind: ElementKind.METHOD);
-    assertSuggest('foo', elemKind: ElementKind.LOCAL_VARIABLE);
+    assertSuggestLocalVariable('foo', 'dynamic');
   }
 
   Future<void> test_methodDeclaration_typeParameterBounds() async {
@@ -5099,7 +5099,7 @@
     await computeSuggestions();
 
     assertNotSuggested('foo', elemKind: ElementKind.MIXIN);
-    assertSuggest('foo', elemKind: ElementKind.LOCAL_VARIABLE);
+    assertSuggestLocalVariable('foo', 'int');
   }
 
   Future<void> test_new_instance() async {
@@ -5248,7 +5248,7 @@
     await computeSuggestions();
 
     assertNotSuggested('bar', elemKind: ElementKind.PARAMETER);
-    assertSuggest('bar', elemKind: ElementKind.LOCAL_VARIABLE);
+    assertSuggestLocalVariable('bar', 'int');
   }
 
   Future<void> test_PrefixedIdentifier_class_const() async {
@@ -6049,7 +6049,7 @@
     await computeSuggestions();
 
     assertNotSuggested('foo', elemKind: ElementKind.TOP_LEVEL_VARIABLE);
-    assertSuggest('foo', elemKind: ElementKind.LOCAL_VARIABLE);
+    assertSuggestLocalVariable('foo', 'dynamic');
   }
 
   Future<void> test_TopLevelVariableDeclaration_typed_name() async {
@@ -6192,7 +6192,7 @@
 ''');
     await computeSuggestions();
     assertNotSuggested('T', elemKind: ElementKind.TYPE_PARAMETER);
-    assertSuggest('T', elemKind: ElementKind.LOCAL_VARIABLE);
+    assertSuggestLocalVariable('T', 'int');
   }
 
   Future<void> test_VariableDeclaration_name() async {
diff --git a/pkg/analysis_server/test/services/completion/dart/relevance/bool_assignment_test.dart b/pkg/analysis_server/test/services/completion/dart/relevance/bool_assignment_test.dart
index 039c915..13a02b0 100644
--- a/pkg/analysis_server/test/services/completion/dart/relevance/bool_assignment_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/relevance/bool_assignment_test.dart
@@ -54,7 +54,7 @@
     var bLocalVar = suggestionWith(
         completion: 'b',
         element: ElementKind.LOCAL_VARIABLE,
-        kind: CompletionSuggestionKind.INVOCATION);
+        kind: CompletionSuggestionKind.IDENTIFIER);
 
     assertOrder([bLocalVar, trueSuggestion, falseSuggestion]);
   }
diff --git a/pkg/analysis_server/test/services/completion/dart/relevance/local_variable_test.dart b/pkg/analysis_server/test/services/completion/dart/relevance/local_variable_test.dart
index c1481fb..8fe61ae 100644
--- a/pkg/analysis_server/test/services/completion/dart/relevance/local_variable_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/relevance/local_variable_test.dart
@@ -29,15 +29,15 @@
       suggestionWith(
           completion: 'c',
           element: ElementKind.LOCAL_VARIABLE,
-          kind: CompletionSuggestionKind.INVOCATION),
+          kind: CompletionSuggestionKind.IDENTIFIER),
       suggestionWith(
           completion: 'b',
           element: ElementKind.LOCAL_VARIABLE,
-          kind: CompletionSuggestionKind.INVOCATION),
+          kind: CompletionSuggestionKind.IDENTIFIER),
       suggestionWith(
           completion: 'a',
           element: ElementKind.LOCAL_VARIABLE,
-          kind: CompletionSuggestionKind.INVOCATION),
+          kind: CompletionSuggestionKind.IDENTIFIER),
     ]);
   }
 }
diff --git a/pkg/analysis_server/test/src/services/correction/fix/add_field_formal_parameters_test.dart b/pkg/analysis_server/test/src/services/correction/fix/add_field_formal_parameters_test.dart
index e9c868c..e4c955c 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/add_field_formal_parameters_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/add_field_formal_parameters_test.dart
@@ -19,7 +19,7 @@
   @override
   FixKind get kind => DartFixKind.ADD_FIELD_FORMAL_PARAMETERS;
 
-  Future<void> test_flutter() async {
+  Future<void> test_flutter_nullable() async {
     writeTestPackageConfig(
       flutter: true,
     );
@@ -30,22 +30,53 @@
 class MyWidget extends StatelessWidget {
   final int a;
   final int b;
-  final int c;
+  final int? c;
+  final int d;
 
   MyWidget({required Key key, required this.a}) : super(key: key);
 }
 ''');
-    // TODO(brianwilkerson) The result should include `required` for the new
-    //  parameters, but I'm omitting them to match the current behavior.
     await assertHasFix('''
 import 'package:flutter/widgets.dart';
 
 class MyWidget extends StatelessWidget {
   final int a;
   final int b;
-  final int c;
+  final int? c;
+  final int d;
 
-  MyWidget({required Key key, required this.a, this.b, this.c}) : super(key: key);
+  MyWidget({required Key key, required this.a, required this.b, this.c, required this.d}) : super(key: key);
+}
+''');
+  }
+
+  Future<void> test_flutter_potentiallyNullable() async {
+    writeTestPackageConfig(
+      flutter: true,
+    );
+
+    await resolveTestCode('''
+import 'package:flutter/widgets.dart';
+
+class MyWidget<T> extends StatelessWidget {
+  final int a;
+  final int b;
+  final T c;
+  final int d;
+
+  MyWidget({required Key key, required this.a}) : super(key: key);
+}
+''');
+    await assertHasFix('''
+import 'package:flutter/widgets.dart';
+
+class MyWidget<T> extends StatelessWidget {
+  final int a;
+  final int b;
+  final T c;
+  final int d;
+
+  MyWidget({required Key key, required this.a, required this.b, required this.c, required this.d}) : super(key: key);
 }
 ''');
   }
diff --git a/pkg/analysis_server/test/src/services/correction/fix/add_missing_enum_like_case_clauses_test.dart b/pkg/analysis_server/test/src/services/correction/fix/add_missing_enum_like_case_clauses_test.dart
index 87b75db..67f4e6c 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/add_missing_enum_like_case_clauses_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/add_missing_enum_like_case_clauses_test.dart
@@ -51,7 +51,8 @@
   static const E a = E._(0);
   static const E b = E._(1);
   static const E c = E._(2);
-  const E._(int x);
+  final int x;
+  const E._(this.x);
 }
 ''');
     await assertHasFixWithFilter('''
@@ -72,7 +73,8 @@
   static const E a = E._(0);
   static const E b = E._(1);
   static const E c = E._(2);
-  const E._(int x);
+  final int x;
+  const E._(this.x);
 }
 ''');
   }
@@ -86,7 +88,8 @@
   static const E a = E._(0);
   static const E b = E._(1);
   static const E c = E._(2);
-  const E._(int x);
+  final int x;
+  const E._(this.x);
 }
 ''');
     await assertHasFixWithFilter('''
@@ -107,7 +110,8 @@
   static const E a = E._(0);
   static const E b = E._(1);
   static const E c = E._(2);
-  const E._(int x);
+  final int x;
+  const E._(this.x);
 }
 ''');
   }
@@ -126,7 +130,8 @@
   static const E a = E._(0);
   static const E b = E._(1);
   static const E c = E._(2);
-  const E._(int x);
+  final int x;
+  const E._(this.x);
 }
 ''');
     await assertHasFix('''
@@ -145,7 +150,8 @@
   static const E a = E._(0);
   static const E b = E._(1);
   static const E c = E._(2);
-  const E._(int x);
+  final int x;
+  const E._(this.x);
 }
 ''');
   }
diff --git a/pkg/analysis_server/test/src/services/correction/fix/make_final_test.dart b/pkg/analysis_server/test/src/services/correction/fix/make_final_test.dart
index d7771af..16718c3 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/make_final_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/make_final_test.dart
@@ -304,6 +304,19 @@
 ''');
   }
 
+  Future<void> test_named_optional_withDefault() async {
+    await resolveTestCode('''
+void fn({String test = 'value'}) {
+  print(test);
+}
+''');
+    await assertHasFix('''
+void fn({final String test = 'value'}) {
+  print(test);
+}
+''');
+  }
+
   Future<void> test_named_required() async {
     await resolveTestCode('''
 void fn({required String test}) {
@@ -330,6 +343,19 @@
 ''');
   }
 
+  Future<void> test_positional_optional_withDefault() async {
+    await resolveTestCode('''
+void fn([String? test = 'value']) {
+  print(test);
+}
+''');
+    await assertHasFix('''
+void fn([final String? test = 'value']) {
+  print(test);
+}
+''');
+  }
+
   Future<void> test_simple_hasType() async {
     await resolveTestCode('''
 void fn(String test) {
@@ -356,6 +382,19 @@
 ''');
   }
 
+  Future<void> test_simple_nullable() async {
+    await resolveTestCode('''
+void fn(String? test) {
+  print(test);
+}
+''');
+    await assertHasFix('''
+void fn(final String? test) {
+  print(test);
+}
+''');
+  }
+
   Future<void> test_simple_second() async {
     await resolveTestCode('''
 void fn(final String test, String other) {
diff --git a/pkg/analysis_server/tool/spec/generated/java/AnalysisServer.java b/pkg/analysis_server/tool/spec/generated/java/AnalysisServer.java
index c5022ea..c5a5ed2 100644
--- a/pkg/analysis_server/tool/spec/generated/java/AnalysisServer.java
+++ b/pkg/analysis_server/tool/spec/generated/java/AnalysisServer.java
@@ -441,12 +441,16 @@
    * @param offset The offset within the file at which suggestions are to be made.
    * @param maxResults The maximum number of suggestions to return. If the number of suggestions
    *         after filtering is greater than the maxResults, then isIncomplete is set to true.
+   * @param completionMode The mode of code completion being invoked. If no value is provided, BASIC
+   *         will be assumed. BASIC is also the only currently supported.
+   * @param invocationCount The number of times that the user has invoked code completion at the same
+   *         code location, counting from 1. If no value is provided, 1 will be assumed.
    * @param timeout The approximate time in milliseconds that the server should spend. The server
    *         will perform some steps anyway, even if it takes longer than the specified timeout. This
    *         field is intended to be used for benchmarking, and usually should not be provided, so
    *         that the default timeout is used.
    */
-  public void completion_getSuggestions2(String file, int offset, int maxResults, int timeout, GetSuggestions2Consumer consumer);
+  public void completion_getSuggestions2(String file, int offset, int maxResults, String completionMode, int invocationCount, int timeout, GetSuggestions2Consumer consumer);
 
   /**
    * {@code completion.registerLibraryPaths}
diff --git a/pkg/analysis_server/tool/spec/generated/java/types/CompletionMode.java b/pkg/analysis_server/tool/spec/generated/java/types/CompletionMode.java
new file mode 100644
index 0000000..89f11dd
--- /dev/null
+++ b/pkg/analysis_server/tool/spec/generated/java/types/CompletionMode.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 2019, 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.
+ *
+ * This file has been automatically generated. Please do not edit it manually.
+ * To regenerate the file, use the script "pkg/analysis_server/tool/spec/generate_files".
+ */
+package org.dartlang.analysis.server.protocol;
+
+/**
+ * An enumeration of the kinds of code completion that users can invoke.
+ *
+ * @coverage dart.server.generated.types
+ */
+public class CompletionMode {
+
+  /**
+   * Basic code completion invocation type, and the default for this enumeration.
+   */
+  public static final String BASIC = "BASIC";
+
+  /**
+   * Smart code completion, currently not implemented.
+   */
+  public static final String SMART = "SMART";
+
+}
diff --git a/pkg/analysis_server/tool/spec/spec_input.html b/pkg/analysis_server/tool/spec/spec_input.html
index c634b46..76d97d58 100644
--- a/pkg/analysis_server/tool/spec/spec_input.html
+++ b/pkg/analysis_server/tool/spec/spec_input.html
@@ -1507,6 +1507,22 @@
           then <tt>isIncomplete</tt> is set to <tt>true</tt>.
         </p>
       </field>
+      <field name="completionMode" experimental="true" optional="true">
+        <ref>CompletionMode</ref>
+        <p>
+          The mode of code completion being invoked. If no value is provided,
+          <tt>BASIC</tt> will be assumed. <tt>BASIC</tt> is also the only
+          currently supported.
+        </p>
+      </field>
+      <field name="invocationCount" experimental="true" optional="true">
+        <ref>int</ref>
+        <p>
+          The number of times that the user has invoked code completion at
+          the same code location, counting from 1. If no value is provided,
+          1 will be assumed.
+        </p>
+      </field>
       <field name="timeout" experimental="true" optional="true">
         <ref>int</ref>
         <p>
@@ -4128,6 +4144,26 @@
       </field>
     </object>
   </type>
+  <type name="CompletionMode">
+    <p>
+      An enumeration of the kinds of code completion that users can invoke.
+    </p>
+    <enum>
+      <value>
+        <code>BASIC</code>
+        <p>
+          Basic code completion invocation type, and the default for this
+          enumeration.
+        </p>
+      </value>
+      <value>
+        <code>SMART</code>
+        <p>
+          Smart code completion, currently not implemented.
+        </p>
+      </value>
+    </enum>
+  </type>
   <type name="RuntimeCompletionExpression">
     <p>
       An expression for which we want to know its runtime type.
diff --git a/pkg/analysis_server_client/lib/server.dart b/pkg/analysis_server_client/lib/server.dart
index 3d9dbb4..169d25b 100644
--- a/pkg/analysis_server_client/lib/server.dart
+++ b/pkg/analysis_server_client/lib/server.dart
@@ -99,11 +99,12 @@
     bool suppressAnalytics = true,
     bool useAnalysisHighlight2 = false,
     bool enableAsserts = false,
+    String? dartBinary,
   }) async {
     if (_process != null) {
       throw Exception('Process already started');
     }
-    var dartBinary = Platform.executable;
+    dartBinary ??= Platform.executable;
 
     // The integration tests run 3x faster when run from snapshots
     // (you need to run test.py with --use-sdk).
diff --git a/pkg/analysis_server_client/lib/src/protocol/protocol_constants.dart b/pkg/analysis_server_client/lib/src/protocol/protocol_constants.dart
index 00b690a..ad20782 100644
--- a/pkg/analysis_server_client/lib/src/protocol/protocol_constants.dart
+++ b/pkg/analysis_server_client/lib/src/protocol/protocol_constants.dart
@@ -138,7 +138,11 @@
 const String COMPLETION_NOTIFICATION_RESULTS_RESULTS = 'results';
 const String COMPLETION_REQUEST_GET_SUGGESTIONS = 'completion.getSuggestions';
 const String COMPLETION_REQUEST_GET_SUGGESTIONS2 = 'completion.getSuggestions2';
+const String COMPLETION_REQUEST_GET_SUGGESTIONS2_COMPLETION_MODE =
+    'completionMode';
 const String COMPLETION_REQUEST_GET_SUGGESTIONS2_FILE = 'file';
+const String COMPLETION_REQUEST_GET_SUGGESTIONS2_INVOCATION_COUNT =
+    'invocationCount';
 const String COMPLETION_REQUEST_GET_SUGGESTIONS2_MAX_RESULTS = 'maxResults';
 const String COMPLETION_REQUEST_GET_SUGGESTIONS2_OFFSET = 'offset';
 const String COMPLETION_REQUEST_GET_SUGGESTIONS2_TIMEOUT = 'timeout';
diff --git a/pkg/analysis_server_client/lib/src/protocol/protocol_generated.dart b/pkg/analysis_server_client/lib/src/protocol/protocol_generated.dart
index c375b0c..d24faa1 100644
--- a/pkg/analysis_server_client/lib/src/protocol/protocol_generated.dart
+++ b/pkg/analysis_server_client/lib/src/protocol/protocol_generated.dart
@@ -4698,6 +4698,15 @@
   /// to true.
   int maxResults;
 
+  /// The mode of code completion being invoked. If no value is provided, BASIC
+  /// will be assumed. BASIC is also the only currently supported.
+  CompletionMode? completionMode;
+
+  /// The number of times that the user has invoked code completion at the same
+  /// code location, counting from 1. If no value is provided, 1 will be
+  /// assumed.
+  int? invocationCount;
+
   /// The approximate time in milliseconds that the server should spend. The
   /// server will perform some steps anyway, even if it takes longer than the
   /// specified timeout. This field is intended to be used for benchmarking,
@@ -4705,7 +4714,7 @@
   int? timeout;
 
   CompletionGetSuggestions2Params(this.file, this.offset, this.maxResults,
-      {this.timeout});
+      {this.completionMode, this.invocationCount, this.timeout});
 
   factory CompletionGetSuggestions2Params.fromJson(
       JsonDecoder jsonDecoder, String jsonPath, Object? json) {
@@ -4730,11 +4739,23 @@
       } else {
         throw jsonDecoder.mismatch(jsonPath, 'maxResults');
       }
+      CompletionMode? completionMode;
+      if (json.containsKey('completionMode')) {
+        completionMode = CompletionMode.fromJson(
+            jsonDecoder, jsonPath + '.completionMode', json['completionMode']);
+      }
+      int? invocationCount;
+      if (json.containsKey('invocationCount')) {
+        invocationCount = jsonDecoder.decodeInt(
+            jsonPath + '.invocationCount', json['invocationCount']);
+      }
       int? timeout;
       if (json.containsKey('timeout')) {
         timeout = jsonDecoder.decodeInt(jsonPath + '.timeout', json['timeout']);
       }
       return CompletionGetSuggestions2Params(file, offset, maxResults,
+          completionMode: completionMode,
+          invocationCount: invocationCount,
           timeout: timeout);
     } else {
       throw jsonDecoder.mismatch(
@@ -4753,6 +4774,14 @@
     result['file'] = file;
     result['offset'] = offset;
     result['maxResults'] = maxResults;
+    var completionMode = this.completionMode;
+    if (completionMode != null) {
+      result['completionMode'] = completionMode.toJson();
+    }
+    var invocationCount = this.invocationCount;
+    if (invocationCount != null) {
+      result['invocationCount'] = invocationCount;
+    }
     var timeout = this.timeout;
     if (timeout != null) {
       result['timeout'] = timeout;
@@ -4774,6 +4803,8 @@
       return file == other.file &&
           offset == other.offset &&
           maxResults == other.maxResults &&
+          completionMode == other.completionMode &&
+          invocationCount == other.invocationCount &&
           timeout == other.timeout;
     }
     return false;
@@ -4784,6 +4815,8 @@
         file,
         offset,
         maxResults,
+        completionMode,
+        invocationCount,
         timeout,
       );
 }
@@ -5090,6 +5123,58 @@
   int get hashCode => id.hashCode;
 }
 
+/// CompletionMode
+///
+/// enum {
+///   BASIC
+///   SMART
+/// }
+///
+/// Clients may not extend, implement or mix-in this class.
+class CompletionMode implements Enum {
+  /// Basic code completion invocation type, and the default for this
+  /// enumeration.
+  static const CompletionMode BASIC = CompletionMode._('BASIC');
+
+  /// Smart code completion, currently not implemented.
+  static const CompletionMode SMART = CompletionMode._('SMART');
+
+  /// A list containing all of the enum values that are defined.
+  static const List<CompletionMode> VALUES = <CompletionMode>[BASIC, SMART];
+
+  @override
+  final String name;
+
+  const CompletionMode._(this.name);
+
+  factory CompletionMode(String name) {
+    switch (name) {
+      case 'BASIC':
+        return BASIC;
+      case 'SMART':
+        return SMART;
+    }
+    throw Exception('Illegal enum value: $name');
+  }
+
+  factory CompletionMode.fromJson(
+      JsonDecoder jsonDecoder, String jsonPath, Object? json) {
+    if (json is String) {
+      try {
+        return CompletionMode(json);
+      } catch (_) {
+        // Fall through
+      }
+    }
+    throw jsonDecoder.mismatch(jsonPath, 'CompletionMode', json);
+  }
+
+  @override
+  String toString() => 'CompletionMode.$name';
+
+  String toJson() => name;
+}
+
 /// completion.registerLibraryPaths params
 ///
 /// {
diff --git a/pkg/analyzer/lib/error/error.dart b/pkg/analyzer/lib/error/error.dart
index 61dc1e9..441903a 100644
--- a/pkg/analyzer/lib/error/error.dart
+++ b/pkg/analyzer/lib/error/error.dart
@@ -216,6 +216,10 @@
   CompileTimeErrorCode.IMPLEMENTS_SUPER_CLASS,
   CompileTimeErrorCode.IMPLEMENTS_TYPE_ALIAS_EXPANDS_TO_TYPE_PARAMETER,
   CompileTimeErrorCode.IMPLICIT_THIS_REFERENCE_IN_INITIALIZER,
+  CompileTimeErrorCode
+      .IMPLICIT_UNNAMED_SUPER_CONSTRUCTOR_INVOCATION_MISSING_REQUIRED_ARGUMENT,
+  CompileTimeErrorCode
+      .IMPLICIT_UNNAMED_SUPER_CONSTRUCTOR_INVOCATION_NOT_ENOUGH_POSITIONAL_ARGUMENTS,
   CompileTimeErrorCode.IMPORT_INTERNAL_LIBRARY,
   CompileTimeErrorCode.IMPORT_OF_NON_LIBRARY,
   CompileTimeErrorCode.INCONSISTENT_CASE_EXPRESSION_TYPES,
@@ -282,12 +286,12 @@
   CompileTimeErrorCode.MISSING_CONST_IN_SET_LITERAL,
   CompileTimeErrorCode.MISSING_DART_LIBRARY,
   CompileTimeErrorCode.MISSING_DEFAULT_VALUE_FOR_PARAMETER,
+  CompileTimeErrorCode.MISSING_DEFAULT_VALUE_FOR_PARAMETER_WITH_ANNOTATION,
   CompileTimeErrorCode.MISSING_REQUIRED_ARGUMENT,
   CompileTimeErrorCode.MIXIN_APPLICATION_CONCRETE_SUPER_INVOKED_MEMBER_TYPE,
   CompileTimeErrorCode.MIXIN_APPLICATION_NO_CONCRETE_SUPER_INVOKED_MEMBER,
   CompileTimeErrorCode.MIXIN_APPLICATION_NOT_IMPLEMENTED_INTERFACE,
   CompileTimeErrorCode.MIXIN_CLASS_DECLARES_CONSTRUCTOR,
-  CompileTimeErrorCode.MIXIN_DECLARES_CONSTRUCTOR,
   CompileTimeErrorCode.MIXIN_DEFERRED_CLASS,
   CompileTimeErrorCode.MIXIN_INFERENCE_INCONSISTENT_MATCHING_CLASSES,
   CompileTimeErrorCode.MIXIN_INFERENCE_NO_MATCHING_CLASS,
@@ -404,6 +408,7 @@
   CompileTimeErrorCode.SHARED_DEFERRED_PREFIX,
   CompileTimeErrorCode.SPREAD_EXPRESSION_FROM_DEFERRED_LIBRARY,
   CompileTimeErrorCode.STATIC_ACCESS_TO_INSTANCE_MEMBER,
+  CompileTimeErrorCode.SUPER_FORMAL_PARAMETER_TYPE_IS_NOT_SUBTYPE_OF_ASSOCIATED,
   CompileTimeErrorCode.SUPER_FORMAL_PARAMETER_WITHOUT_ASSOCIATED_NAMED,
   CompileTimeErrorCode.SUPER_FORMAL_PARAMETER_WITHOUT_ASSOCIATED_POSITIONAL,
   CompileTimeErrorCode.SUPER_IN_EXTENSION,
diff --git a/pkg/analyzer/lib/src/dart/analysis/driver.dart b/pkg/analyzer/lib/src/dart/analysis/driver.dart
index 598631f..ebc5b48 100644
--- a/pkg/analyzer/lib/src/dart/analysis/driver.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/driver.dart
@@ -1328,17 +1328,15 @@
     var unitElement = libraryContext.computeUnitElement(library, file)
         as CompilationUnitElementImpl;
 
-    var analyzer = LibraryAnalyzer(
-        analysisOptions as AnalysisOptionsImpl,
-        declaredVariables,
-        sourceFactory,
-        libraryContext.analysisContext,
-        libraryContext.elementFactory.libraryOfUri2(library.uriStr),
-        libraryContext.analysisSession.inheritanceManager,
-        library,
-        testingData: testingData);
-
-    var analysisResult = analyzer.analyzeForCompletion(
+    var analysisResult = LibraryAnalyzer(
+      analysisOptions as AnalysisOptionsImpl,
+      declaredVariables,
+      sourceFactory,
+      libraryContext.elementFactory.libraryOfUri2(library.uriStr),
+      libraryContext.analysisSession.inheritanceManager,
+      library,
+      testingData: testingData,
+    ).analyzeForCompletion(
       file: file,
       offset: offset,
       unitElement: unitElement,
@@ -1443,27 +1441,26 @@
 
         libraryContext.load2(library!);
 
-        LibraryAnalyzer analyzer = LibraryAnalyzer(
-            analysisOptions as AnalysisOptionsImpl,
-            declaredVariables,
-            sourceFactory,
-            libraryContext.analysisContext,
-            libraryContext.elementFactory.libraryOfUri2(library.uriStr),
-            libraryContext.analysisSession.inheritanceManager,
-            library,
-            testingData: testingData);
-        Map<FileState, UnitAnalysisResult> results = analyzer.analyze();
+        var results = LibraryAnalyzer(
+          analysisOptions as AnalysisOptionsImpl,
+          declaredVariables,
+          sourceFactory,
+          libraryContext.elementFactory.libraryOfUri2(library.uriStr),
+          libraryContext.analysisSession.inheritanceManager,
+          library,
+          testingData: testingData,
+        ).analyze();
 
         late Uint8List bytes;
         late CompilationUnit resolvedUnit;
-        for (FileState unitFile in results.keys) {
-          UnitAnalysisResult unitResult = results[unitFile]!;
+        for (var unitResult in results) {
           var unitBytes =
               _serializeResolvedUnit(unitResult.unit, unitResult.errors);
-          String unitSignature = _getResolvedUnitSignature(library, unitFile);
+          String unitSignature =
+              _getResolvedUnitSignature(library, unitResult.file);
           String unitKey = _getResolvedUnitKey(unitSignature);
           _byteStore.put(unitKey, unitBytes);
-          if (unitFile == file) {
+          if (unitResult.file == file) {
             bytes = unitBytes;
             resolvedUnit = unitResult.unit;
           }
@@ -1515,21 +1512,19 @@
       _testView.numOfAnalyzedLibraries++;
       libraryContext.load2(library);
 
-      LibraryAnalyzer analyzer = LibraryAnalyzer(
-          analysisOptions as AnalysisOptionsImpl,
-          declaredVariables,
-          sourceFactory,
-          libraryContext.analysisContext,
-          libraryContext.elementFactory.libraryOfUri2(library.uriStr),
-          libraryContext.analysisSession.inheritanceManager,
-          library,
-          testingData: testingData);
-      Map<FileState, UnitAnalysisResult> unitResults = analyzer.analyze();
+      var unitResults = LibraryAnalyzer(
+              analysisOptions as AnalysisOptionsImpl,
+              declaredVariables,
+              sourceFactory,
+              libraryContext.elementFactory.libraryOfUri2(library.uriStr),
+              libraryContext.analysisSession.inheritanceManager,
+              library,
+              testingData: testingData)
+          .analyze();
       var resolvedUnits = <ResolvedUnitResult>[];
 
-      for (var entry in unitResults.entries) {
-        var unitFile = entry.key;
-        var unitResult = entry.value;
+      for (var unitResult in unitResults) {
+        var unitFile = unitResult.file;
         resolvedUnits.add(
           ResolvedUnitResultImpl(
             currentSession,
diff --git a/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart b/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
index 6d7e98d..347e551 100644
--- a/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
@@ -51,7 +51,6 @@
 import 'package:analyzer/src/task/strong/checker.dart';
 import 'package:analyzer/src/util/performance/operation_performance.dart';
 import 'package:analyzer/src/util/uri.dart';
-import 'package:pub_semver/pub_semver.dart';
 
 var timerLibraryAnalyzer = Stopwatch();
 var timerLibraryAnalyzerConst = Stopwatch();
@@ -72,17 +71,11 @@
 
 /// Analyzer of a single library.
 class LibraryAnalyzer {
-  /// A marker object used to prevent the initialization of
-  /// [_versionConstraintFromPubspec] when the previous initialization attempt
-  /// failed.
-  static final VersionRange noSpecifiedRange = VersionRange();
   final AnalysisOptionsImpl _analysisOptions;
   final DeclaredVariables _declaredVariables;
   final SourceFactory _sourceFactory;
   final FileState _library;
-
   final InheritanceManager3 _inheritance;
-  final AnalysisContext _context;
 
   final LibraryElementImpl _libraryElement;
 
@@ -92,16 +85,11 @@
   final Map<FileState, RecordingErrorListener> _errorListeners = {};
   final Map<FileState, ErrorReporter> _errorReporters = {};
   final TestingData? _testingData;
-  final List<UsedImportedElements> _usedImportedElementsList = [];
-  final List<UsedLocalElements> _usedLocalElementsList = [];
-
-  final Set<ConstantEvaluationTarget> _constants = {};
 
   LibraryAnalyzer(
       this._analysisOptions,
       this._declaredVariables,
       this._sourceFactory,
-      this._context,
       this._libraryElement,
       this._inheritance,
       this._library,
@@ -113,98 +101,25 @@
   TypeSystemImpl get _typeSystem => _libraryElement.typeSystem;
 
   /// Compute analysis results for all units of the library.
-  Map<FileState, UnitAnalysisResult> analyze() {
-    timerLibraryAnalyzer.start();
-    Map<FileState, CompilationUnitImpl> units = {};
-
-    // Parse all files.
-    timerLibraryAnalyzerFreshUnit.start();
-    for (FileState file in _library.libraryFiles) {
-      units[file] = _parse(file);
-    }
-    timerLibraryAnalyzerFreshUnit.stop();
-
-    // Resolve URIs in directives to corresponding sources.
-    FeatureSet featureSet = units[_library]!.featureSet;
-    units.forEach((file, unit) {
-      _validateFeatureSet(unit, featureSet);
-      _resolveUriBasedDirectives(file, unit);
-    });
-
-    timerLibraryAnalyzerResolve.start();
-    _resolveDirectives(units);
-
-    units.forEach((file, unit) {
-      _resolveFile(file, unit);
-    });
-    timerLibraryAnalyzerResolve.stop();
-
-    timerLibraryAnalyzerConst.start();
-    units.values.forEach(_findConstants);
-    _computeConstants();
-    timerLibraryAnalyzerConst.stop();
-
-    timerLibraryAnalyzerVerify.start();
-    units.forEach((file, unit) {
-      _computeVerifyErrors(file, unit);
-    });
-
-    if (_analysisOptions.hint) {
-      units.forEach((file, unit) {
-        {
-          var visitor = GatherUsedLocalElementsVisitor(_libraryElement);
-          unit.accept(visitor);
-          _usedLocalElementsList.add(visitor.usedElements);
-        }
-        {
-          var visitor = GatherUsedImportedElementsVisitor(_libraryElement);
-          unit.accept(visitor);
-          _usedImportedElementsList.add(visitor.usedElements);
-        }
-      });
-      units.forEach((file, unit) {
-        _computeHints(file, unit);
-      });
-    }
-
-    if (_analysisOptions.lint) {
-      var allUnits = _library.libraryFiles
-          .map((file) => LinterContextUnit(file.content, units[file]!))
-          .toList();
-      for (int i = 0; i < allUnits.length; i++) {
-        _computeLints(_library.libraryFiles[i], allUnits[i], allUnits);
-      }
-    }
-
-    assert(units.values.every(LegacyTypeAsserter.assertLegacyTypes));
-
-    _checkForInconsistentLanguageVersionOverride(units);
-
-    // This must happen after all other diagnostics have been computed but
-    // before the list of diagnostics has been filtered.
-    for (var file in _library.libraryFiles) {
-      IgnoreValidator(
-        _getErrorReporter(file),
-        _getErrorListener(file).errors,
-        _fileToIgnoreInfo[file]!,
-        _fileToLineInfo[file]!,
-        _analysisOptions.unignorableNames,
-      ).reportErrors();
-    }
-
-    timerLibraryAnalyzerVerify.stop();
+  List<UnitAnalysisResult> analyze() {
+    var units = _parseAndResolve();
+    _computeDiagnostics(units);
 
     // Return full results.
-    Map<FileState, UnitAnalysisResult> results = {};
+    var results = <UnitAnalysisResult>[];
     units.forEach((file, unit) {
       List<AnalysisError> errors = _getErrorListener(file).errors;
       errors = _filterIgnoredErrors(file, errors);
-      results[file] = UnitAnalysisResult(file, unit, errors);
+      results.add(UnitAnalysisResult(file, unit, errors));
     });
     timerLibraryAnalyzer.stop();
     return results;
   }
 
+  /// Analyze [file] for a completion result.
+  ///
+  /// This method aims to avoid work that [analyze] does which would be
+  /// unnecessary for a completion request.
   AnalysisForCompletionResult analyzeForCompletion({
     required FileState file,
     required int offset,
@@ -264,8 +179,8 @@
             e.parent is MixinDeclaration;
       });
       if (nodeToResolve != null) {
-        var can = resolverVisitor.prepareForResolving(nodeToResolve);
-        if (can) {
+        var canResolveNode = resolverVisitor.prepareForResolving(nodeToResolve);
+        if (canResolveNode) {
           nodeToResolve.accept(resolverVisitor);
           return AnalysisForCompletionResult(
             parsedUnit: parsedUnit,
@@ -274,11 +189,11 @@
         }
       }
 
-      var resolvedUnits = analyze();
-      var resolvedUnit = resolvedUnits[file]!;
+      var units = _parseAndResolve();
+      var unit = units[file]!;
       return AnalysisForCompletionResult(
-        parsedUnit: resolvedUnit.unit,
-        resolvedNodes: [resolvedUnit.unit],
+        parsedUnit: unit,
+        resolvedNodes: [unit],
       );
     });
   }
@@ -333,12 +248,80 @@
   }
 
   /// Compute [_constants] in all units.
-  void _computeConstants() {
-    computeConstants(
-        _declaredVariables, _constants.toList(), _libraryElement.featureSet);
+  void _computeConstants(Iterable<CompilationUnitImpl> units) {
+    var constants = [
+      for (var unit in units) ..._findConstants(unit),
+    ];
+    computeConstants(_declaredVariables, constants, _libraryElement.featureSet);
   }
 
-  void _computeHints(FileState file, CompilationUnit unit) {
+  /// Compute diagnostics in [units], including errors and warnings, hints,
+  /// lints, and a few other cases.
+  void _computeDiagnostics(Map<FileState, CompilationUnitImpl> units) {
+    timerLibraryAnalyzerVerify.start();
+    units.forEach((file, unit) {
+      _computeVerifyErrors(file, unit);
+    });
+
+    if (_analysisOptions.hint) {
+      var usedImportedElements = <UsedImportedElements>[];
+      var usedLocalElements = <UsedLocalElements>[];
+      for (var unit in units.values) {
+        {
+          var visitor = GatherUsedLocalElementsVisitor(_libraryElement);
+          unit.accept(visitor);
+          usedLocalElements.add(visitor.usedElements);
+        }
+        {
+          var visitor = GatherUsedImportedElementsVisitor(_libraryElement);
+          unit.accept(visitor);
+          usedImportedElements.add(visitor.usedElements);
+        }
+      }
+      units.forEach((file, unit) {
+        _computeHints(
+          file,
+          unit,
+          usedImportedElements: usedImportedElements,
+          usedLocalElements: usedLocalElements,
+        );
+      });
+    }
+
+    if (_analysisOptions.lint) {
+      var allUnits = _library.libraryFiles
+          .map((file) => LinterContextUnit(file.content, units[file]!))
+          .toList();
+      for (int i = 0; i < allUnits.length; i++) {
+        _computeLints(_library.libraryFiles[i], allUnits[i], allUnits,
+            analysisOptions: _analysisOptions);
+      }
+    }
+
+    assert(units.values.every(LegacyTypeAsserter.assertLegacyTypes));
+
+    _checkForInconsistentLanguageVersionOverride(units);
+
+    // This must happen after all other diagnostics have been computed but
+    // before the list of diagnostics has been filtered.
+    for (var file in _library.libraryFiles) {
+      IgnoreValidator(
+        _getErrorReporter(file),
+        _getErrorListener(file).errors,
+        _fileToIgnoreInfo[file]!,
+        _fileToLineInfo[file]!,
+        _analysisOptions.unignorableNames,
+      ).reportErrors();
+    }
+    timerLibraryAnalyzerVerify.stop();
+  }
+
+  void _computeHints(
+    FileState file,
+    CompilationUnit unit, {
+    required List<UsedImportedElements> usedImportedElements,
+    required List<UsedLocalElements> usedLocalElements,
+  }) {
     AnalysisErrorListener errorListener = _getErrorListener(file);
     ErrorReporter errorReporter = _getErrorReporter(file);
 
@@ -365,7 +348,7 @@
         declaredVariables: _declaredVariables,
         typeSystem: _typeSystem,
         inheritanceManager: _inheritance,
-        analysisOptions: _context.analysisOptions,
+        analysisOptions: _analysisOptions,
         workspacePackage: _library.workspacePackage,
       ),
     );
@@ -383,19 +366,19 @@
     {
       ImportsVerifier verifier = ImportsVerifier();
       verifier.addImports(unit);
-      _usedImportedElementsList.forEach(verifier.removeUsedElements);
+      usedImportedElements.forEach(verifier.removeUsedElements);
       verifier.generateDuplicateImportHints(errorReporter);
       verifier.generateDuplicateShownHiddenNameHints(errorReporter);
       verifier.generateUnusedImportHints(errorReporter);
       verifier.generateUnusedShownNameHints(errorReporter);
       verifier.generateUnnecessaryImportHints(
-          errorReporter, _usedImportedElementsList);
+          errorReporter, usedImportedElements);
     }
 
     // Unused local elements.
     {
       UsedLocalElements usedElements =
-          UsedLocalElements.merge(_usedLocalElementsList);
+          UsedLocalElements.merge(usedLocalElements);
       UnusedLocalElementsVerifier visitor = UnusedLocalElementsVerifier(
           errorListener, usedElements, _inheritance, _libraryElement);
       unit.accept(visitor);
@@ -413,12 +396,16 @@
     }
   }
 
-  void _computeLints(FileState file, LinterContextUnit currentUnit,
-      List<LinterContextUnit> allUnits) {
+  void _computeLints(
+    FileState file,
+    LinterContextUnit currentUnit,
+    List<LinterContextUnit> allUnits, {
+    required AnalysisOptionsImpl analysisOptions,
+  }) {
     var unit = currentUnit.unit;
     var errorReporter = _getErrorReporter(file);
 
-    var enableTiming = _analysisOptions.enableTiming;
+    var enableTiming = analysisOptions.enableTiming;
     var nodeRegistry = NodeLintRegistry(enableTiming);
 
     var context = LinterContextImpl(
@@ -428,10 +415,10 @@
       _typeProvider,
       _typeSystem,
       _inheritance,
-      _analysisOptions,
+      analysisOptions,
       file.workspacePackage,
     );
-    for (var linter in _analysisOptions.lintRules) {
+    for (var linter in analysisOptions.lintRules) {
       linter.reporter = errorReporter;
       var timer = enableTiming ? lintRegistry.getTimer(linter) : null;
       timer?.start();
@@ -444,7 +431,7 @@
       LinterVisitor(
         nodeRegistry,
         LinterExceptionHandler(
-          propagateExceptions: _analysisOptions.propagateLinterExceptions,
+          propagateExceptions: analysisOptions.propagateLinterExceptions,
         ).logException,
       ),
     );
@@ -522,17 +509,6 @@
     return errors.where((AnalysisError e) => !isIgnored(e)).toList();
   }
 
-  /// Find constants to compute.
-  void _findConstants(CompilationUnit unit) {
-    ConstantFinder constantFinder = ConstantFinder();
-    unit.accept(constantFinder);
-    _constants.addAll(constantFinder.constantsToCompute);
-
-    var dependenciesFinder = ConstantExpressionsDependenciesFinder();
-    unit.accept(dependenciesFinder);
-    _constants.addAll(dependenciesFinder.dependencies);
-  }
-
   RecordingErrorListener _getErrorListener(FileState file) =>
       _errorListeners.putIfAbsent(file, () => RecordingErrorListener());
 
@@ -589,13 +565,47 @@
     String content = file.content;
     var unit = file.parse(errorListener);
 
-    LineInfo lineInfo = unit.lineInfo!;
-    _fileToLineInfo[file] = lineInfo;
+    _fileToLineInfo[file] = unit.lineInfo!;
     _fileToIgnoreInfo[file] = IgnoreInfo.forDart(unit, content);
 
     return unit;
   }
 
+  /// Parse and resolve all files in [_library].
+  Map<FileState, CompilationUnitImpl> _parseAndResolve() {
+    timerLibraryAnalyzer.start();
+    var units = <FileState, CompilationUnitImpl>{};
+
+    // Parse all files.
+    timerLibraryAnalyzerFreshUnit.start();
+    for (FileState file in _library.libraryFiles) {
+      units[file] = _parse(file);
+    }
+    timerLibraryAnalyzerFreshUnit.stop();
+
+    // Resolve URIs in directives to corresponding sources.
+    FeatureSet featureSet = units[_library]!.featureSet;
+    units.forEach((file, unit) {
+      _validateFeatureSet(unit, featureSet);
+      _resolveUriBasedDirectives(file, unit);
+    });
+
+    timerLibraryAnalyzerResolve.start();
+    _resolveDirectives(units);
+
+    units.forEach((file, unit) {
+      _resolveFile(file, unit);
+    });
+    timerLibraryAnalyzerResolve.stop();
+
+    timerLibraryAnalyzerConst.start();
+
+    _computeConstants(units.values);
+    timerLibraryAnalyzerConst.stop();
+
+    return units;
+  }
+
   void _resolveDirectives(Map<FileState, CompilationUnitImpl> units) {
     var definingCompilationUnit = units[_library]!;
     definingCompilationUnit.element = _libraryElement.definingCompilationUnit;
@@ -917,6 +927,19 @@
     }
   }
 
+  /// Find constants in [unit] to compute.
+  static List<ConstantEvaluationTarget> _findConstants(CompilationUnit unit) {
+    ConstantFinder constantFinder = ConstantFinder();
+    unit.accept(constantFinder);
+
+    var dependenciesFinder = ConstantExpressionsDependenciesFinder();
+    unit.accept(dependenciesFinder);
+    return [
+      ...constantFinder.constantsToCompute,
+      ...dependenciesFinder.dependencies,
+    ];
+  }
+
   static bool _hasEmptyCompletionContext(AstNode? node) {
     if (node is DoubleLiteral || node is IntegerLiteral) {
       return true;
diff --git a/pkg/analyzer/lib/src/dart/element/subtype.dart b/pkg/analyzer/lib/src/dart/element/subtype.dart
index 85a9387..4c8850c 100644
--- a/pkg/analyzer/lib/src/dart/element/subtype.dart
+++ b/pkg/analyzer/lib/src/dart/element/subtype.dart
@@ -31,21 +31,21 @@
         _objectNone = typeSystem.objectNone,
         _objectQuestion = typeSystem.objectQuestion;
 
-  /// Return `true` if [_T0] is a subtype of [_T1].
-  bool isSubtypeOf(DartType _T0, DartType _T1) {
+  /// Return `true` if [T0_] is a subtype of [T1_].
+  bool isSubtypeOf(DartType T0_, DartType T1_) {
     // Reflexivity: if `T0` and `T1` are the same type then `T0 <: T1`.
-    if (identical(_T0, _T1)) {
+    if (identical(T0_, T1_)) {
       return true;
     }
 
     // `_` is treated as a top and a bottom type during inference.
-    if (identical(_T0, UnknownInferredType.instance) ||
-        identical(_T1, UnknownInferredType.instance)) {
+    if (identical(T0_, UnknownInferredType.instance) ||
+        identical(T1_, UnknownInferredType.instance)) {
       return true;
     }
 
-    var T0 = _T0 as TypeImpl;
-    var T1 = _T1 as TypeImpl;
+    var T0 = T0_ as TypeImpl;
+    var T1 = T1_ as TypeImpl;
 
     var T1_nullability = T1.nullabilitySuffix;
     var T0_nullability = T0.nullabilitySuffix;
diff --git a/pkg/analyzer/lib/src/dart/micro/library_analyzer.dart b/pkg/analyzer/lib/src/dart/micro/library_analyzer.dart
index 2caa7a1..f6a8e6a 100644
--- a/pkg/analyzer/lib/src/dart/micro/library_analyzer.dart
+++ b/pkg/analyzer/lib/src/dart/micro/library_analyzer.dart
@@ -47,14 +47,9 @@
 import 'package:analyzer/src/task/strong/checker.dart';
 import 'package:analyzer/src/util/performance/operation_performance.dart';
 import 'package:analyzer/src/workspace/workspace.dart';
-import 'package:pub_semver/pub_semver.dart';
 
 /// Analyzer of a single library.
 class LibraryAnalyzer {
-  /// A marker object used to prevent the initialization of
-  /// [_versionConstraintFromPubspec] when the previous initialization attempt
-  /// failed.
-  static final VersionRange noSpecifiedRange = VersionRange();
   final AnalysisOptionsImpl _analysisOptions;
   final DeclaredVariables _declaredVariables;
   final SourceFactory _sourceFactory;
diff --git a/pkg/analyzer/lib/src/error/codes.g.dart b/pkg/analyzer/lib/src/error/codes.g.dart
index 0c25625..6033cde 100644
--- a/pkg/analyzer/lib/src/error/codes.g.dart
+++ b/pkg/analyzer/lib/src/error/codes.g.dart
@@ -4521,27 +4521,30 @@
 
   static const CompileTimeErrorCode EXTERNAL_FIELD_CONSTRUCTOR_INITIALIZER =
       CompileTimeErrorCode(
-    'EXTERNAL_FIELD_CONSTRUCTOR_INITIALIZER',
-    "External fields cannot have initializers.",
+    'EXTERNAL_WITH_INITIALIZER',
+    "External fields can't have initializers.",
     correctionMessage:
         "Try removing the field initializer or the 'external' keyword from the "
         "field declaration.",
+    uniqueName: 'EXTERNAL_FIELD_CONSTRUCTOR_INITIALIZER',
   );
 
   static const CompileTimeErrorCode EXTERNAL_FIELD_INITIALIZER =
       CompileTimeErrorCode(
-    'EXTERNAL_FIELD_INITIALIZER',
-    "External fields cannot have initializers.",
+    'EXTERNAL_WITH_INITIALIZER',
+    "External fields can't have initializers.",
     correctionMessage:
         "Try removing the initializer or the 'external' keyword.",
+    uniqueName: 'EXTERNAL_FIELD_INITIALIZER',
   );
 
   static const CompileTimeErrorCode EXTERNAL_VARIABLE_INITIALIZER =
       CompileTimeErrorCode(
-    'EXTERNAL_VARIABLE_INITIALIZER',
-    "External variables cannot have initializers.",
+    'EXTERNAL_WITH_INITIALIZER',
+    "External variables can't have initializers.",
     correctionMessage:
         "Try removing the initializer or the 'external' keyword.",
+    uniqueName: 'EXTERNAL_VARIABLE_INITIALIZER',
   );
 
   /**
@@ -5952,6 +5955,28 @@
     hasPublishedDocs: true,
   );
 
+  static const CompileTimeErrorCode
+      IMPLICIT_UNNAMED_SUPER_CONSTRUCTOR_INVOCATION_MISSING_REQUIRED_ARGUMENT =
+      CompileTimeErrorCode(
+    'IMPLICIT_UNNAMED_SUPER_CONSTRUCTOR_INVOCATION_MISSING_REQUIRED_ARGUMENT',
+    "The named parameter '{0}' is required in the implicitly invoked unnamed "
+        "constructor of '{1}'.",
+    correctionMessage:
+        "Try declaring corresponding named super-parameter, or explicitly "
+        "invoking a different constructor.",
+  );
+
+  static const CompileTimeErrorCode
+      IMPLICIT_UNNAMED_SUPER_CONSTRUCTOR_INVOCATION_NOT_ENOUGH_POSITIONAL_ARGUMENTS =
+      CompileTimeErrorCode(
+    'IMPLICIT_UNNAMED_SUPER_CONSTRUCTOR_INVOCATION_NOT_ENOUGH_POSITIONAL_ARGUMENTS',
+    "The implicitly invoked unnamed constructor of '{0}' expects {1} "
+        "positional arguments, but {2} found.",
+    correctionMessage:
+        "Try declaring positional super-parameters, or explicitly invoking a "
+        "different constructor.",
+  );
+
   /**
    * Parameters:
    * 0: the uri pointing to a library
@@ -8514,6 +8539,20 @@
   );
 
   /**
+   * No parameters.
+   */
+  static const CompileTimeErrorCode
+      MISSING_DEFAULT_VALUE_FOR_PARAMETER_WITH_ANNOTATION =
+      CompileTimeErrorCode(
+    'MISSING_DEFAULT_VALUE_FOR_PARAMETER',
+    "With null safety, use the 'required' keyword, not the '@required' "
+        "annotation.",
+    correctionMessage: "Try removing the '@'.",
+    hasPublishedDocs: true,
+    uniqueName: 'MISSING_DEFAULT_VALUE_FOR_PARAMETER_WITH_ANNOTATION',
+  );
+
+  /**
    * Parameters:
    * 0: the name of the parameter
    */
@@ -8863,16 +8902,6 @@
   );
 
   /**
-   * The <i>mixinMember</i> production allows the same instance or static
-   * members that a class would allow, but no constructors (for now).
-   */
-  static const CompileTimeErrorCode MIXIN_DECLARES_CONSTRUCTOR =
-      CompileTimeErrorCode(
-    'MIXIN_DECLARES_CONSTRUCTOR',
-    "Mixins can't declare constructors.",
-  );
-
-  /**
    * No parameters.
    */
   static const CompileTimeErrorCode MIXIN_DEFERRED_CLASS = CompileTimeErrorCode(
@@ -13082,6 +13111,21 @@
   );
 
   /**
+   * Parameters:
+   * 0: the type of super-parameter
+   * 1: the type of associated super-constructor parameter
+   */
+  static const CompileTimeErrorCode
+      SUPER_FORMAL_PARAMETER_TYPE_IS_NOT_SUBTYPE_OF_ASSOCIATED =
+      CompileTimeErrorCode(
+    'SUPER_FORMAL_PARAMETER_TYPE_IS_NOT_SUBTYPE_OF_ASSOCIATED',
+    "The type '{0}' of this parameter is not a subtype of the type '{1}' of "
+        "the associated super-constructor parameter.",
+    correctionMessage:
+        "Try removing the explicit type annotation from the parameter.",
+  );
+
+  /**
    * No parameters.
    */
   static const CompileTimeErrorCode
diff --git a/pkg/analyzer/lib/src/error/super_formal_parameters_verifier.dart b/pkg/analyzer/lib/src/error/super_formal_parameters_verifier.dart
new file mode 100644
index 0000000..309ead0
--- /dev/null
+++ b/pkg/analyzer/lib/src/error/super_formal_parameters_verifier.dart
@@ -0,0 +1,45 @@
+// Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/error/listener.dart';
+import 'package:analyzer/src/dart/ast/extensions.dart';
+import 'package:analyzer/src/dart/element/element.dart';
+import 'package:analyzer/src/error/codes.dart';
+
+VerifySuperFormalParametersResult verifySuperFormalParameters({
+  required ConstructorDeclaration constructor,
+  ErrorReporter? errorReporter,
+  bool hasExplicitPositionalArguments = false,
+}) {
+  var result = VerifySuperFormalParametersResult();
+  for (var parameter in constructor.parameters.parameters) {
+    parameter = parameter.notDefault;
+    if (parameter is SuperFormalParameter) {
+      var parameterElement =
+          parameter.declaredElement as SuperFormalParameterElementImpl;
+      if (parameter.isNamed) {
+        result.namedArgumentNames.add(parameterElement.name);
+      } else {
+        result.positionalArgumentCount++;
+        if (hasExplicitPositionalArguments) {
+          errorReporter?.reportErrorForNode(
+            CompileTimeErrorCode
+                .POSITIONAL_SUPER_FORMAL_PARAMETER_WITH_POSITIONAL_ARGUMENT,
+            parameter.identifier,
+          );
+        }
+      }
+    }
+  }
+  return result;
+}
+
+class VerifySuperFormalParametersResult {
+  /// The count of positional arguments provided by the super-parameters.
+  int positionalArgumentCount = 0;
+
+  /// The names of named arguments provided by the super-parameters.
+  List<String> namedArgumentNames = [];
+}
diff --git a/pkg/analyzer/lib/src/generated/error_verifier.dart b/pkg/analyzer/lib/src/generated/error_verifier.dart
index 7d363ca..78bd179 100644
--- a/pkg/analyzer/lib/src/generated/error_verifier.dart
+++ b/pkg/analyzer/lib/src/generated/error_verifier.dart
@@ -37,6 +37,7 @@
 import 'package:analyzer/src/error/literal_element_verifier.dart';
 import 'package:analyzer/src/error/required_parameters_verifier.dart';
 import 'package:analyzer/src/error/return_type_verifier.dart';
+import 'package:analyzer/src/error/super_formal_parameters_verifier.dart';
 import 'package:analyzer/src/error/type_arguments_verifier.dart';
 import 'package:analyzer/src/error/use_result_verifier.dart';
 import 'package:analyzer/src/generated/element_resolver.dart';
@@ -1141,6 +1142,8 @@
 
   @override
   void visitSuperFormalParameter(SuperFormalParameter node) {
+    super.visitSuperFormalParameter(node);
+
     var constructor = node.parentFormalParameterList.parent;
     if (!(constructor is ConstructorDeclaration &&
         constructor.isNonRedirectingGenerative)) {
@@ -1148,9 +1151,33 @@
         CompileTimeErrorCode.INVALID_SUPER_FORMAL_PARAMETER_LOCATION,
         node.superKeyword,
       );
+      return;
     }
 
-    super.visitSuperFormalParameter(node);
+    var element = node.declaredElement as SuperFormalParameterElementImpl;
+    var superParameter = element.superConstructorParameter;
+
+    if (superParameter == null) {
+      errorReporter.reportErrorForNode(
+        node.isNamed
+            ? CompileTimeErrorCode
+                .SUPER_FORMAL_PARAMETER_WITHOUT_ASSOCIATED_NAMED
+            : CompileTimeErrorCode
+                .SUPER_FORMAL_PARAMETER_WITHOUT_ASSOCIATED_POSITIONAL,
+        node.identifier,
+      );
+      return;
+    }
+
+    if (!_currentLibrary.typeSystem
+        .isSubtypeOf(element.type, superParameter.type)) {
+      errorReporter.reportErrorForNode(
+        CompileTimeErrorCode
+            .SUPER_FORMAL_PARAMETER_TYPE_IS_NOT_SUBTYPE_OF_ASSOCIATED,
+        node.identifier,
+        [element.type, superParameter.type],
+      );
+    }
   }
 
   @override
@@ -1779,23 +1806,23 @@
   }
 
   /// Verify all conflicts between type variable and enclosing class.
-  /// TODO(scheglov)
   void _checkForConflictingClassTypeVariableErrorCodes() {
-    for (TypeParameterElement typeParameter
-        in _enclosingClass!.typeParameters) {
+    var enclosingClass = _enclosingClass!;
+    for (TypeParameterElement typeParameter in enclosingClass.typeParameters) {
       String name = typeParameter.name;
       // name is same as the name of the enclosing class
-      if (_enclosingClass!.name == name) {
-        var code = _enclosingClass!.isMixin
+      if (enclosingClass.name == name) {
+        var code = enclosingClass.isMixin
             ? CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_MIXIN
             : CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_CLASS;
         errorReporter.reportErrorForElement(code, typeParameter, [name]);
       }
       // check members
-      if (_enclosingClass!.getMethod(name) != null ||
-          _enclosingClass!.getGetter(name) != null ||
-          _enclosingClass!.getSetter(name) != null) {
-        var code = _enclosingClass!.isMixin
+      if (enclosingClass.getNamedConstructor(name) != null ||
+          enclosingClass.getMethod(name) != null ||
+          enclosingClass.getGetter(name) != null ||
+          enclosingClass.getSetter(name) != null) {
+        var code = enclosingClass.isMixin
             ? CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_MEMBER_MIXIN
             : CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_MEMBER_CLASS;
         errorReporter.reportErrorForElement(code, typeParameter, [name]);
@@ -4173,15 +4200,6 @@
       return;
     }
 
-    // TODO(scheglov) Restore when working on errors.
-    if (_currentLibrary.featureSet.isEnabled(Feature.super_parameters)) {
-      if (constructor.parameters.parameters.any((parameter) {
-        return parameter.notDefault is SuperFormalParameter;
-      })) {
-        return;
-      }
-    }
-
     // Ignore if the constructor has either an implicit super constructor
     // invocation or a redirecting constructor invocation.
     for (ConstructorInitializer constructorInitializer
@@ -4199,37 +4217,88 @@
       return;
     }
     ClassElement superElement = superType.element;
+
     if (superElement.constructors
         .every((constructor) => constructor.isFactory)) {
       // Already reported [NO_GENERATIVE_CONSTRUCTORS_IN_SUPERCLASS].
       return;
     }
+
     var superUnnamedConstructor = superElement.unnamedConstructor;
     superUnnamedConstructor = superUnnamedConstructor != null
         ? _currentLibrary.toLegacyElementIfOptOut(superUnnamedConstructor)
         : superUnnamedConstructor;
-    if (superUnnamedConstructor != null) {
-      if (superUnnamedConstructor.isFactory) {
-        errorReporter.reportErrorForNode(
-            CompileTimeErrorCode.NON_GENERATIVE_CONSTRUCTOR,
-            constructor.returnType,
-            [superUnnamedConstructor]);
-      } else if (!superUnnamedConstructor.isDefaultConstructor) {
-        Identifier returnType = constructor.returnType;
-        var name = constructor.name;
-        int offset = returnType.offset;
-        int length = (name != null ? name.end : returnType.end) - offset;
-        errorReporter.reportErrorForOffset(
-            CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_EXPLICIT,
-            offset,
-            length,
-            [superType]);
-      }
-    } else {
+    if (superUnnamedConstructor == null) {
       errorReporter.reportErrorForNode(
-          CompileTimeErrorCode.UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT,
-          constructor.returnType,
-          [superElement.name]);
+        CompileTimeErrorCode.UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT,
+        constructor.returnType,
+        [superElement.name],
+      );
+      return;
+    }
+
+    if (superUnnamedConstructor.isFactory) {
+      errorReporter.reportErrorForNode(
+        CompileTimeErrorCode.NON_GENERATIVE_CONSTRUCTOR,
+        constructor.returnType,
+        [superUnnamedConstructor],
+      );
+      return;
+    }
+
+    var requiredPositionalParameterCount = superUnnamedConstructor.parameters
+        .where((parameter) => parameter.isRequiredPositional)
+        .length;
+    var requiredNamedParameters = superUnnamedConstructor.parameters
+        .where((parameter) => parameter.isRequiredNamed)
+        .map((parameter) => parameter.name)
+        .toSet();
+
+    void reportError(ErrorCode errorCode, List<Object> arguments) {
+      Identifier returnType = constructor.returnType;
+      var name = constructor.name;
+      int offset = returnType.offset;
+      int length = (name != null ? name.end : returnType.end) - offset;
+      errorReporter.reportErrorForOffset(errorCode, offset, length, arguments);
+    }
+
+    if (!_currentLibrary.featureSet.isEnabled(Feature.super_parameters)) {
+      if (requiredPositionalParameterCount != 0 ||
+          requiredNamedParameters.isNotEmpty) {
+        reportError(
+          CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_EXPLICIT,
+          [superType],
+        );
+      }
+      return;
+    }
+
+    var superParametersResult = verifySuperFormalParameters(
+      constructor: constructor,
+      errorReporter: errorReporter,
+    );
+    requiredNamedParameters.removeAll(
+      superParametersResult.namedArgumentNames,
+    );
+
+    if (requiredPositionalParameterCount >
+        superParametersResult.positionalArgumentCount) {
+      reportError(
+        CompileTimeErrorCode
+            .IMPLICIT_UNNAMED_SUPER_CONSTRUCTOR_INVOCATION_NOT_ENOUGH_POSITIONAL_ARGUMENTS,
+        [
+          superType,
+          requiredPositionalParameterCount,
+          superParametersResult.positionalArgumentCount,
+        ],
+      );
+    }
+    for (var requiredNamedParameterName in requiredNamedParameters) {
+      reportError(
+        CompileTimeErrorCode
+            .IMPLICIT_UNNAMED_SUPER_CONSTRUCTOR_INVOCATION_MISSING_REQUIRED_ARGUMENT,
+        [requiredNamedParameterName, superType],
+      );
     }
   }
 
@@ -4871,14 +4940,23 @@
             );
           }
         } else if (defaultValuesAreExpected && parameter.defaultValue == null) {
-          var type = parameter.declaredElement!.type;
+          var parameterElement = parameter.declaredElement!;
+          var type = parameterElement.type;
           if (typeSystem.isPotentiallyNonNullable(type)) {
             var parameterName = _parameterName(parameter);
-            errorReporter.reportErrorForNode(
-              CompileTimeErrorCode.MISSING_DEFAULT_VALUE_FOR_PARAMETER,
-              parameterName ?? parameter,
-              [parameterName?.name ?? '?'],
-            );
+            if (parameterElement.hasRequired) {
+              errorReporter.reportErrorForNode(
+                CompileTimeErrorCode
+                    .MISSING_DEFAULT_VALUE_FOR_PARAMETER_WITH_ANNOTATION,
+                parameterName ?? parameter,
+              );
+            } else {
+              errorReporter.reportErrorForNode(
+                CompileTimeErrorCode.MISSING_DEFAULT_VALUE_FOR_PARAMETER,
+                parameterName ?? parameter,
+                [parameterName?.name ?? '?'],
+              );
+            }
           }
         }
       }
diff --git a/pkg/analyzer/lib/src/generated/java_core.dart b/pkg/analyzer/lib/src/generated/java_core.dart
index 75fa4d3..9891065 100644
--- a/pkg/analyzer/lib/src/generated/java_core.dart
+++ b/pkg/analyzer/lib/src/generated/java_core.dart
@@ -39,137 +39,3 @@
     return arguments[index].toString();
   });
 }
-
-/// Very limited printf implementation, supports only %s and %d.
-String _printf(String fmt, List args) {
-  StringBuffer sb = StringBuffer();
-  bool markFound = false;
-  int argIndex = 0;
-  for (int i = 0; i < fmt.length; i++) {
-    int c = fmt.codeUnitAt(i);
-    if (c == 0x25) {
-      if (markFound) {
-        sb.writeCharCode(c);
-        markFound = false;
-      } else {
-        markFound = true;
-      }
-      continue;
-    }
-    if (markFound) {
-      markFound = false;
-      // %d
-      if (c == 0x64) {
-        sb.write(args[argIndex++]);
-        continue;
-      }
-      // %s
-      if (c == 0x73) {
-        sb.write(args[argIndex++]);
-        continue;
-      }
-      // unknown
-      throw ArgumentError('[$fmt][$i] = 0x${c.toRadixString(16)}');
-    } else {
-      sb.writeCharCode(c);
-    }
-  }
-  return sb.toString();
-}
-
-class Character {
-  static const int MAX_VALUE = 0xffff;
-  static const int MAX_CODE_POINT = 0x10ffff;
-  static const int MIN_SUPPLEMENTARY_CODE_POINT = 0x010000;
-  static const int MIN_LOW_SURROGATE = 0xDC00;
-  static const int MIN_HIGH_SURROGATE = 0xD800;
-
-  static int digit(int codePoint, int radix) {
-    if (radix != 16) {
-      throw ArgumentError("only radix == 16 is supported");
-    }
-    if (0x30 <= codePoint && codePoint <= 0x39) {
-      return codePoint - 0x30;
-    }
-    if (0x41 <= codePoint && codePoint <= 0x46) {
-      return 0xA + (codePoint - 0x41);
-    }
-    if (0x61 <= codePoint && codePoint <= 0x66) {
-      return 0xA + (codePoint - 0x61);
-    }
-    return -1;
-  }
-
-  static bool isDigit(int c) => c >= 0x30 && c <= 0x39;
-
-  static bool isLetter(int c) =>
-      c >= 0x41 && c <= 0x5A || c >= 0x61 && c <= 0x7A;
-
-  static bool isLetterOrDigit(int c) => isLetter(c) || isDigit(c);
-
-  static bool isWhitespace(int c) =>
-      c == 0x09 || c == 0x20 || c == 0x0A || c == 0x0D;
-
-  static String toChars(int codePoint) {
-    if (codePoint < 0 || codePoint > MAX_CODE_POINT) {
-      throw ArgumentError();
-    }
-    if (codePoint < MIN_SUPPLEMENTARY_CODE_POINT) {
-      return String.fromCharCode(codePoint);
-    }
-    int offset = codePoint - MIN_SUPPLEMENTARY_CODE_POINT;
-    int c0 = ((offset & 0x7FFFFFFF) >> 10) + MIN_HIGH_SURROGATE;
-    int c1 = (offset & 0x3ff) + MIN_LOW_SURROGATE;
-    return String.fromCharCodes([c0, c1]);
-  }
-}
-
-@deprecated
-abstract class Enum<E extends Enum<E>> implements Comparable<E> {
-  /// The name of this enum constant, as declared in the enum declaration.
-  final String name;
-
-  /// The position in the enum declaration.
-  final int ordinal;
-
-  const Enum(this.name, this.ordinal);
-
-  @override
-  int get hashCode => ordinal;
-
-  @override
-  int compareTo(E other) => ordinal - other.ordinal;
-
-  @override
-  String toString() => name;
-}
-
-@deprecated
-class PrintStringWriter extends PrintWriter {
-  final StringBuffer _sb = StringBuffer();
-
-  @override
-  void print(Object x) {
-    _sb.write(x);
-  }
-
-  @override
-  String toString() => _sb.toString();
-}
-
-abstract class PrintWriter {
-  void newLine() {
-    print('\n');
-  }
-
-  void print(Object x);
-
-  void printf(String fmt, List args) {
-    print(_printf(fmt, args));
-  }
-
-  void println(String s) {
-    print(s);
-    newLine();
-  }
-}
diff --git a/pkg/analyzer/lib/src/generated/java_io.dart b/pkg/analyzer/lib/src/generated/java_io.dart
deleted file mode 100644
index 4751bc4..0000000
--- a/pkg/analyzer/lib/src/generated/java_io.dart
+++ /dev/null
@@ -1,110 +0,0 @@
-// Copyright (c) 2014, 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:path/path.dart' as path;
-
-@Deprecated('Use ResourceProvider and path context instead.')
-class JavaFile {
-  @deprecated
-  static path.Context pathContext = path.context;
-  static final String separator = Platform.pathSeparator;
-  static final int separatorChar = Platform.pathSeparator.codeUnitAt(0);
-  late final String _path;
-  JavaFile(String path) {
-    _path = path;
-  }
-  JavaFile.fromUri(Uri uri) : this(path.context.fromUri(uri));
-  JavaFile.relative(JavaFile base, String child) {
-    if (child.isEmpty) {
-      _path = base._path;
-    } else {
-      _path = path.context.join(base._path, child);
-    }
-  }
-  @override
-  int get hashCode => _path.hashCode;
-  @override
-  bool operator ==(Object other) {
-    return other is JavaFile && other._path == _path;
-  }
-
-  bool exists() {
-    if (_newFile().existsSync()) {
-      return true;
-    }
-    if (_newDirectory().existsSync()) {
-      return true;
-    }
-    return false;
-  }
-
-  JavaFile getAbsoluteFile() => JavaFile(getAbsolutePath());
-  String getAbsolutePath() {
-    String abolutePath = path.context.absolute(_path);
-    abolutePath = path.context.normalize(abolutePath);
-    return abolutePath;
-  }
-
-  JavaFile getCanonicalFile() => JavaFile(getCanonicalPath());
-  String getCanonicalPath() {
-    return _newFile().resolveSymbolicLinksSync();
-  }
-
-  String getName() => path.context.basename(_path);
-  String? getParent() {
-    var result = path.context.dirname(_path);
-    // "." or  "/" or  "C:\"
-    if (result.length < 4) return null;
-    return result;
-  }
-
-  JavaFile? getParentFile() {
-    var parent = getParent();
-    if (parent == null) return null;
-    return JavaFile(parent);
-  }
-
-  String getPath() => _path;
-  bool isDirectory() {
-    return _newDirectory().existsSync();
-  }
-
-  bool isExecutable() {
-    return _newFile().statSync().mode & 0x111 != 0;
-  }
-
-  bool isFile() {
-    return _newFile().existsSync();
-  }
-
-  int lastModified() {
-    try {
-      return _newFile().lastModifiedSync().millisecondsSinceEpoch;
-    } catch (exception) {
-      return -1;
-    }
-  }
-
-  List<JavaFile> listFiles() {
-    var files = <JavaFile>[];
-    var entities = _newDirectory().listSync();
-    for (FileSystemEntity entity in entities) {
-      files.add(JavaFile(entity.path));
-    }
-    return files;
-  }
-
-  String readAsStringSync() => _newFile().readAsStringSync();
-  @override
-  String toString() => _path.toString();
-  Uri toURI() {
-    String absolutePath = getAbsolutePath();
-    return path.context.toUri(absolutePath);
-  }
-
-  Directory _newDirectory() => Directory(_path);
-  File _newFile() => File(_path);
-}
diff --git a/pkg/analyzer/lib/src/generated/resolver.dart b/pkg/analyzer/lib/src/generated/resolver.dart
index aef17ef..dfeb521 100644
--- a/pkg/analyzer/lib/src/generated/resolver.dart
+++ b/pkg/analyzer/lib/src/generated/resolver.dart
@@ -60,6 +60,7 @@
 import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer/src/error/dead_code_verifier.dart';
 import 'package:analyzer/src/error/nullable_dereference_verifier.dart';
+import 'package:analyzer/src/error/super_formal_parameters_verifier.dart';
 import 'package:analyzer/src/generated/element_resolver.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/error_detection_helpers.dart';
@@ -2332,9 +2333,6 @@
     ErrorReporter? errorReporter,
     ConstructorDeclaration? enclosingConstructor,
   }) {
-    if (parameters.isEmpty && argumentList.arguments.isEmpty) {
-      return const <ParameterElement>[];
-    }
     int requiredParameterCount = 0;
     int unnamedParameterCount = 0;
     List<ParameterElement> unnamedParameters = <ParameterElement>[];
@@ -2360,11 +2358,38 @@
     List<ParameterElement?> resolvedParameters =
         List<ParameterElement?>.filled(argumentCount, null);
     int positionalArgumentCount = 0;
-    HashSet<String>? usedNames;
     bool noBlankArguments = true;
     Expression? firstUnresolvedArgument;
     for (int i = 0; i < argumentCount; i++) {
       Expression argument = arguments[i];
+      if (argument is! NamedExpressionImpl) {
+        if (argument is SimpleIdentifier && argument.name.isEmpty) {
+          noBlankArguments = false;
+        }
+        positionalArgumentCount++;
+        if (unnamedIndex < unnamedParameterCount) {
+          resolvedParameters[i] = unnamedParameters[unnamedIndex++];
+        } else {
+          firstUnresolvedArgument ??= argument;
+        }
+      }
+    }
+
+    Set<String>? usedNames;
+    if (enclosingConstructor != null) {
+      var result = verifySuperFormalParameters(
+        constructor: enclosingConstructor,
+        hasExplicitPositionalArguments: positionalArgumentCount != 0,
+        errorReporter: errorReporter,
+      );
+      positionalArgumentCount += result.positionalArgumentCount;
+      if (result.namedArgumentNames.isNotEmpty) {
+        usedNames = result.namedArgumentNames.toSet();
+      }
+    }
+
+    for (int i = 0; i < argumentCount; i++) {
+      Expression argument = arguments[i];
       if (argument is NamedExpressionImpl) {
         var nameNode = argument.name.label;
         String name = nameNode.name;
@@ -2376,57 +2401,11 @@
           resolvedParameters[i] = element;
           nameNode.staticElement = element;
         }
-        usedNames ??= HashSet<String>();
+        usedNames ??= <String>{};
         if (!usedNames.add(name)) {
           errorReporter?.reportErrorForNode(
               CompileTimeErrorCode.DUPLICATE_NAMED_ARGUMENT, nameNode, [name]);
         }
-      } else {
-        if (argument is SimpleIdentifier && argument.name.isEmpty) {
-          noBlankArguments = false;
-        }
-        positionalArgumentCount++;
-        if (unnamedIndex < unnamedParameterCount) {
-          resolvedParameters[i] = unnamedParameters[unnamedIndex++];
-        } else {
-          firstUnresolvedArgument ??= argument;
-        }
-      }
-    }
-
-    if (enclosingConstructor != null) {
-      var hasExplicitPositionalArguments = positionalArgumentCount != 0;
-      for (var formalParameter in enclosingConstructor.parameters.parameters) {
-        formalParameter = formalParameter.notDefault;
-        if (formalParameter is SuperFormalParameter) {
-          var element = formalParameter.declaredElement
-              as SuperFormalParameterElementImpl;
-          if (formalParameter.isNamed) {
-            if (element.superConstructorParameter == null) {
-              errorReporter?.reportErrorForNode(
-                CompileTimeErrorCode
-                    .SUPER_FORMAL_PARAMETER_WITHOUT_ASSOCIATED_NAMED,
-                formalParameter.identifier,
-              );
-            }
-          } else {
-            positionalArgumentCount++;
-            if (hasExplicitPositionalArguments) {
-              errorReporter?.reportErrorForNode(
-                CompileTimeErrorCode
-                    .POSITIONAL_SUPER_FORMAL_PARAMETER_WITH_POSITIONAL_ARGUMENT,
-                formalParameter.identifier,
-              );
-            }
-            if (element.superConstructorParameter == null) {
-              errorReporter?.reportErrorForNode(
-                CompileTimeErrorCode
-                    .SUPER_FORMAL_PARAMETER_WITHOUT_ASSOCIATED_POSITIONAL,
-                formalParameter.identifier,
-              );
-            }
-          }
-        }
       }
     }
 
diff --git a/pkg/analyzer/lib/src/generated/utilities_collection.dart b/pkg/analyzer/lib/src/generated/utilities_collection.dart
index 59758e4..c3c0036 100644
--- a/pkg/analyzer/lib/src/generated/utilities_collection.dart
+++ b/pkg/analyzer/lib/src/generated/utilities_collection.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/generated/java_core.dart';
-
 /// Returns `true` if a and b contain equal elements in the same order.
 bool listsEqual(List a, List b) {
   // TODO(rnystrom): package:collection also implements this, and analyzer
@@ -34,11 +32,6 @@
     return (array & (1 << index)) > 0;
   }
 
-  /// Return the value of the element at the given index.
-  @deprecated
-  static bool getEnum<E extends Enum<E>>(int array, Enum<E> index) =>
-      get(array, index.ordinal);
-
   /// Set the value of the element of the given [array] at the given [index] to
   /// the given [value].
   static int set(int array, int index, bool value) {
@@ -50,11 +43,6 @@
     }
   }
 
-  /// Set the value of the element at the given index to the given value.
-  @deprecated
-  static int setEnum<E extends Enum<E>>(int array, Enum<E> index, bool value) =>
-      set(array, index.ordinal, value);
-
   /// Throw an exception if the index is not within the bounds allowed for an
   /// integer-encoded array of boolean values.
   static void _checkIndex(int index) {
diff --git a/pkg/analyzer/lib/src/summary/flat_buffers.dart b/pkg/analyzer/lib/src/summary/flat_buffers.dart
index 49a7400..80ba07c 100644
--- a/pkg/analyzer/lib/src/summary/flat_buffers.dart
+++ b/pkg/analyzer/lib/src/summary/flat_buffers.dart
@@ -467,20 +467,20 @@
     _currentVTable!.addField(field, _tail);
   }
 
-  static void _setFloat64AtTail(ByteData _buf, int tail, double x) {
-    _buf.setFloat64(_buf.lengthInBytes - tail, x, Endian.little);
+  static void _setFloat64AtTail(ByteData buf, int tail, double x) {
+    buf.setFloat64(buf.lengthInBytes - tail, x, Endian.little);
   }
 
-  static void _setInt32AtTail(ByteData _buf, int tail, int x) {
-    _buf.setInt32(_buf.lengthInBytes - tail, x, Endian.little);
+  static void _setInt32AtTail(ByteData buf, int tail, int x) {
+    buf.setInt32(buf.lengthInBytes - tail, x, Endian.little);
   }
 
-  static void _setUint32AtTail(ByteData _buf, int tail, int x) {
-    _buf.setUint32(_buf.lengthInBytes - tail, x, Endian.little);
+  static void _setUint32AtTail(ByteData buf, int tail, int x) {
+    buf.setUint32(buf.lengthInBytes - tail, x, Endian.little);
   }
 
-  static void _setUint8AtTail(ByteData _buf, int tail, int x) {
-    _buf.setUint8(_buf.lengthInBytes - tail, x);
+  static void _setUint8AtTail(ByteData buf, int tail, int x) {
+    buf.setUint8(buf.lengthInBytes - tail, x);
   }
 }
 
diff --git a/pkg/analyzer/lib/src/summary/format.dart b/pkg/analyzer/lib/src/summary/format.dart
index e85a569..fcbf6a9 100644
--- a/pkg/analyzer/lib/src/summary/format.dart
+++ b/pkg/analyzer/lib/src/summary/format.dart
@@ -241,24 +241,24 @@
     implements idl.AnalysisDriverExceptionContext {
   @override
   Map<String, Object> toJson() {
-    Map<String, Object> _result = <String, Object>{};
+    Map<String, Object> result = <String, Object>{};
     var local_exception = exception;
     if (local_exception != '') {
-      _result["exception"] = local_exception;
+      result["exception"] = local_exception;
     }
     var local_files = files;
     if (local_files.isNotEmpty) {
-      _result["files"] = local_files.map((_value) => _value.toJson()).toList();
+      result["files"] = local_files.map((value) => value.toJson()).toList();
     }
     var local_path = path;
     if (local_path != '') {
-      _result["path"] = local_path;
+      result["path"] = local_path;
     }
     var local_stackTrace = stackTrace;
     if (local_stackTrace != '') {
-      _result["stackTrace"] = local_stackTrace;
+      result["stackTrace"] = local_stackTrace;
     }
-    return _result;
+    return result;
   }
 
   @override
@@ -367,16 +367,16 @@
     implements idl.AnalysisDriverExceptionFile {
   @override
   Map<String, Object> toJson() {
-    Map<String, Object> _result = <String, Object>{};
+    Map<String, Object> result = <String, Object>{};
     var local_content = content;
     if (local_content != '') {
-      _result["content"] = local_content;
+      result["content"] = local_content;
     }
     var local_path = path;
     if (local_path != '') {
-      _result["path"] = local_path;
+      result["path"] = local_path;
     }
-    return _result;
+    return result;
   }
 
   @override
@@ -512,17 +512,16 @@
     implements idl.AnalysisDriverResolvedUnit {
   @override
   Map<String, Object> toJson() {
-    Map<String, Object> _result = <String, Object>{};
+    Map<String, Object> result = <String, Object>{};
     var local_errors = errors;
     if (local_errors.isNotEmpty) {
-      _result["errors"] =
-          local_errors.map((_value) => _value.toJson()).toList();
+      result["errors"] = local_errors.map((value) => value.toJson()).toList();
     }
     var local_index = index;
     if (local_index != null) {
-      _result["index"] = local_index.toJson();
+      result["index"] = local_index.toJson();
     }
-    return _result;
+    return result;
   }
 
   @override
@@ -634,16 +633,16 @@
     implements idl.AnalysisDriverSubtype {
   @override
   Map<String, Object> toJson() {
-    Map<String, Object> _result = <String, Object>{};
+    Map<String, Object> result = <String, Object>{};
     var local_members = members;
     if (local_members.isNotEmpty) {
-      _result["members"] = local_members;
+      result["members"] = local_members;
     }
     var local_name = name;
     if (local_name != 0) {
-      _result["name"] = local_name;
+      result["name"] = local_name;
     }
-    return _result;
+    return result;
   }
 
   @override
@@ -859,33 +858,33 @@
     implements idl.AnalysisDriverUnitError {
   @override
   Map<String, Object> toJson() {
-    Map<String, Object> _result = <String, Object>{};
+    Map<String, Object> result = <String, Object>{};
     var local_contextMessages = contextMessages;
     if (local_contextMessages.isNotEmpty) {
-      _result["contextMessages"] =
-          local_contextMessages.map((_value) => _value.toJson()).toList();
+      result["contextMessages"] =
+          local_contextMessages.map((value) => value.toJson()).toList();
     }
     var local_correction = correction;
     if (local_correction != '') {
-      _result["correction"] = local_correction;
+      result["correction"] = local_correction;
     }
     var local_length = length;
     if (local_length != 0) {
-      _result["length"] = local_length;
+      result["length"] = local_length;
     }
     var local_message = message;
     if (local_message != '') {
-      _result["message"] = local_message;
+      result["message"] = local_message;
     }
     var local_offset = offset;
     if (local_offset != 0) {
-      _result["offset"] = local_offset;
+      result["offset"] = local_offset;
     }
     var local_uniqueName = uniqueName;
     if (local_uniqueName != '') {
-      _result["uniqueName"] = local_uniqueName;
+      result["uniqueName"] = local_uniqueName;
     }
-    return _result;
+    return result;
   }
 
   @override
@@ -1711,96 +1710,95 @@
     implements idl.AnalysisDriverUnitIndex {
   @override
   Map<String, Object> toJson() {
-    Map<String, Object> _result = <String, Object>{};
+    Map<String, Object> result = <String, Object>{};
     var local_elementKinds = elementKinds;
     if (local_elementKinds.isNotEmpty) {
-      _result["elementKinds"] = local_elementKinds
-          .map((_value) => _value.toString().split('.')[1])
+      result["elementKinds"] = local_elementKinds
+          .map((value) => value.toString().split('.')[1])
           .toList();
     }
     var local_elementNameClassMemberIds = elementNameClassMemberIds;
     if (local_elementNameClassMemberIds.isNotEmpty) {
-      _result["elementNameClassMemberIds"] = local_elementNameClassMemberIds;
+      result["elementNameClassMemberIds"] = local_elementNameClassMemberIds;
     }
     var local_elementNameParameterIds = elementNameParameterIds;
     if (local_elementNameParameterIds.isNotEmpty) {
-      _result["elementNameParameterIds"] = local_elementNameParameterIds;
+      result["elementNameParameterIds"] = local_elementNameParameterIds;
     }
     var local_elementNameUnitMemberIds = elementNameUnitMemberIds;
     if (local_elementNameUnitMemberIds.isNotEmpty) {
-      _result["elementNameUnitMemberIds"] = local_elementNameUnitMemberIds;
+      result["elementNameUnitMemberIds"] = local_elementNameUnitMemberIds;
     }
     var local_elementUnits = elementUnits;
     if (local_elementUnits.isNotEmpty) {
-      _result["elementUnits"] = local_elementUnits;
+      result["elementUnits"] = local_elementUnits;
     }
     var local_nullStringId = nullStringId;
     if (local_nullStringId != 0) {
-      _result["nullStringId"] = local_nullStringId;
+      result["nullStringId"] = local_nullStringId;
     }
     var local_strings = strings;
     if (local_strings.isNotEmpty) {
-      _result["strings"] = local_strings;
+      result["strings"] = local_strings;
     }
     var local_subtypes = subtypes;
     if (local_subtypes.isNotEmpty) {
-      _result["subtypes"] =
-          local_subtypes.map((_value) => _value.toJson()).toList();
+      result["subtypes"] =
+          local_subtypes.map((value) => value.toJson()).toList();
     }
     var local_supertypes = supertypes;
     if (local_supertypes.isNotEmpty) {
-      _result["supertypes"] = local_supertypes;
+      result["supertypes"] = local_supertypes;
     }
     var local_unitLibraryUris = unitLibraryUris;
     if (local_unitLibraryUris.isNotEmpty) {
-      _result["unitLibraryUris"] = local_unitLibraryUris;
+      result["unitLibraryUris"] = local_unitLibraryUris;
     }
     var local_unitUnitUris = unitUnitUris;
     if (local_unitUnitUris.isNotEmpty) {
-      _result["unitUnitUris"] = local_unitUnitUris;
+      result["unitUnitUris"] = local_unitUnitUris;
     }
     var local_usedElementIsQualifiedFlags = usedElementIsQualifiedFlags;
     if (local_usedElementIsQualifiedFlags.isNotEmpty) {
-      _result["usedElementIsQualifiedFlags"] =
-          local_usedElementIsQualifiedFlags;
+      result["usedElementIsQualifiedFlags"] = local_usedElementIsQualifiedFlags;
     }
     var local_usedElementKinds = usedElementKinds;
     if (local_usedElementKinds.isNotEmpty) {
-      _result["usedElementKinds"] = local_usedElementKinds
-          .map((_value) => _value.toString().split('.')[1])
+      result["usedElementKinds"] = local_usedElementKinds
+          .map((value) => value.toString().split('.')[1])
           .toList();
     }
     var local_usedElementLengths = usedElementLengths;
     if (local_usedElementLengths.isNotEmpty) {
-      _result["usedElementLengths"] = local_usedElementLengths;
+      result["usedElementLengths"] = local_usedElementLengths;
     }
     var local_usedElementOffsets = usedElementOffsets;
     if (local_usedElementOffsets.isNotEmpty) {
-      _result["usedElementOffsets"] = local_usedElementOffsets;
+      result["usedElementOffsets"] = local_usedElementOffsets;
     }
     var local_usedElements = usedElements;
     if (local_usedElements.isNotEmpty) {
-      _result["usedElements"] = local_usedElements;
+      result["usedElements"] = local_usedElements;
     }
     var local_usedNameIsQualifiedFlags = usedNameIsQualifiedFlags;
     if (local_usedNameIsQualifiedFlags.isNotEmpty) {
-      _result["usedNameIsQualifiedFlags"] = local_usedNameIsQualifiedFlags;
+      result["usedNameIsQualifiedFlags"] = local_usedNameIsQualifiedFlags;
     }
     var local_usedNameKinds = usedNameKinds;
     if (local_usedNameKinds.isNotEmpty) {
-      _result["usedNameKinds"] = local_usedNameKinds
-          .map((_value) => _value.toString().split('.')[1])
+      result["usedNameKinds"] = local_usedNameKinds
+          .map((value) => value.toString().split('.')[1])
           .toList();
     }
     var local_usedNameOffsets = usedNameOffsets;
     if (local_usedNameOffsets.isNotEmpty) {
-      _result["usedNameOffsets"] = local_usedNameOffsets;
+      result["usedNameOffsets"] = local_usedNameOffsets;
     }
     var local_usedNames = usedNames;
     if (local_usedNames.isNotEmpty) {
-      _result["usedNames"] = local_usedNames;
+      result["usedNames"] = local_usedNames;
     }
-    return _result;
+    return result;
   }
 
   @override
@@ -2499,110 +2497,110 @@
 abstract class _AvailableDeclarationMixin implements idl.AvailableDeclaration {
   @override
   Map<String, Object> toJson() {
-    Map<String, Object> _result = <String, Object>{};
+    Map<String, Object> result = <String, Object>{};
     var local_children = children;
     if (local_children.isNotEmpty) {
-      _result["children"] =
-          local_children.map((_value) => _value.toJson()).toList();
+      result["children"] =
+          local_children.map((value) => value.toJson()).toList();
     }
     var local_codeLength = codeLength;
     if (local_codeLength != 0) {
-      _result["codeLength"] = local_codeLength;
+      result["codeLength"] = local_codeLength;
     }
     var local_codeOffset = codeOffset;
     if (local_codeOffset != 0) {
-      _result["codeOffset"] = local_codeOffset;
+      result["codeOffset"] = local_codeOffset;
     }
     var local_defaultArgumentListString = defaultArgumentListString;
     if (local_defaultArgumentListString != '') {
-      _result["defaultArgumentListString"] = local_defaultArgumentListString;
+      result["defaultArgumentListString"] = local_defaultArgumentListString;
     }
     var local_defaultArgumentListTextRanges = defaultArgumentListTextRanges;
     if (local_defaultArgumentListTextRanges.isNotEmpty) {
-      _result["defaultArgumentListTextRanges"] =
+      result["defaultArgumentListTextRanges"] =
           local_defaultArgumentListTextRanges;
     }
     var local_docComplete = docComplete;
     if (local_docComplete != '') {
-      _result["docComplete"] = local_docComplete;
+      result["docComplete"] = local_docComplete;
     }
     var local_docSummary = docSummary;
     if (local_docSummary != '') {
-      _result["docSummary"] = local_docSummary;
+      result["docSummary"] = local_docSummary;
     }
     var local_fieldMask = fieldMask;
     if (local_fieldMask != 0) {
-      _result["fieldMask"] = local_fieldMask;
+      result["fieldMask"] = local_fieldMask;
     }
     var local_isAbstract = isAbstract;
     if (local_isAbstract != false) {
-      _result["isAbstract"] = local_isAbstract;
+      result["isAbstract"] = local_isAbstract;
     }
     var local_isConst = isConst;
     if (local_isConst != false) {
-      _result["isConst"] = local_isConst;
+      result["isConst"] = local_isConst;
     }
     var local_isDeprecated = isDeprecated;
     if (local_isDeprecated != false) {
-      _result["isDeprecated"] = local_isDeprecated;
+      result["isDeprecated"] = local_isDeprecated;
     }
     var local_isFinal = isFinal;
     if (local_isFinal != false) {
-      _result["isFinal"] = local_isFinal;
+      result["isFinal"] = local_isFinal;
     }
     var local_isStatic = isStatic;
     if (local_isStatic != false) {
-      _result["isStatic"] = local_isStatic;
+      result["isStatic"] = local_isStatic;
     }
     var local_kind = kind;
     if (local_kind != idl.AvailableDeclarationKind.CLASS) {
-      _result["kind"] = local_kind.toString().split('.')[1];
+      result["kind"] = local_kind.toString().split('.')[1];
     }
     var local_locationOffset = locationOffset;
     if (local_locationOffset != 0) {
-      _result["locationOffset"] = local_locationOffset;
+      result["locationOffset"] = local_locationOffset;
     }
     var local_locationStartColumn = locationStartColumn;
     if (local_locationStartColumn != 0) {
-      _result["locationStartColumn"] = local_locationStartColumn;
+      result["locationStartColumn"] = local_locationStartColumn;
     }
     var local_locationStartLine = locationStartLine;
     if (local_locationStartLine != 0) {
-      _result["locationStartLine"] = local_locationStartLine;
+      result["locationStartLine"] = local_locationStartLine;
     }
     var local_name = name;
     if (local_name != '') {
-      _result["name"] = local_name;
+      result["name"] = local_name;
     }
     var local_parameterNames = parameterNames;
     if (local_parameterNames.isNotEmpty) {
-      _result["parameterNames"] = local_parameterNames;
+      result["parameterNames"] = local_parameterNames;
     }
     var local_parameters = parameters;
     if (local_parameters != '') {
-      _result["parameters"] = local_parameters;
+      result["parameters"] = local_parameters;
     }
     var local_parameterTypes = parameterTypes;
     if (local_parameterTypes.isNotEmpty) {
-      _result["parameterTypes"] = local_parameterTypes;
+      result["parameterTypes"] = local_parameterTypes;
     }
     var local_relevanceTags = relevanceTags;
     if (local_relevanceTags.isNotEmpty) {
-      _result["relevanceTags"] = local_relevanceTags;
+      result["relevanceTags"] = local_relevanceTags;
     }
     var local_requiredParameterCount = requiredParameterCount;
     if (local_requiredParameterCount != 0) {
-      _result["requiredParameterCount"] = local_requiredParameterCount;
+      result["requiredParameterCount"] = local_requiredParameterCount;
     }
     var local_returnType = returnType;
     if (local_returnType != '') {
-      _result["returnType"] = local_returnType;
+      result["returnType"] = local_returnType;
     }
     var local_typeParameters = typeParameters;
     if (local_typeParameters != '') {
-      _result["typeParameters"] = local_typeParameters;
+      result["typeParameters"] = local_typeParameters;
     }
-    return _result;
+    return result;
   }
 
   @override
@@ -2900,38 +2898,37 @@
 abstract class _AvailableFileMixin implements idl.AvailableFile {
   @override
   Map<String, Object> toJson() {
-    Map<String, Object> _result = <String, Object>{};
+    Map<String, Object> result = <String, Object>{};
     var local_declarations = declarations;
     if (local_declarations.isNotEmpty) {
-      _result["declarations"] =
-          local_declarations.map((_value) => _value.toJson()).toList();
+      result["declarations"] =
+          local_declarations.map((value) => value.toJson()).toList();
     }
     var local_directiveInfo = directiveInfo;
     if (local_directiveInfo != null) {
-      _result["directiveInfo"] = local_directiveInfo.toJson();
+      result["directiveInfo"] = local_directiveInfo.toJson();
     }
     var local_exports = exports;
     if (local_exports.isNotEmpty) {
-      _result["exports"] =
-          local_exports.map((_value) => _value.toJson()).toList();
+      result["exports"] = local_exports.map((value) => value.toJson()).toList();
     }
     var local_isLibrary = isLibrary;
     if (local_isLibrary != false) {
-      _result["isLibrary"] = local_isLibrary;
+      result["isLibrary"] = local_isLibrary;
     }
     var local_isLibraryDeprecated = isLibraryDeprecated;
     if (local_isLibraryDeprecated != false) {
-      _result["isLibraryDeprecated"] = local_isLibraryDeprecated;
+      result["isLibraryDeprecated"] = local_isLibraryDeprecated;
     }
     var local_lineStarts = lineStarts;
     if (local_lineStarts.isNotEmpty) {
-      _result["lineStarts"] = local_lineStarts;
+      result["lineStarts"] = local_lineStarts;
     }
     var local_parts = parts;
     if (local_parts.isNotEmpty) {
-      _result["parts"] = local_parts;
+      result["parts"] = local_parts;
     }
-    return _result;
+    return result;
   }
 
   @override
@@ -3057,17 +3054,17 @@
 abstract class _AvailableFileExportMixin implements idl.AvailableFileExport {
   @override
   Map<String, Object> toJson() {
-    Map<String, Object> _result = <String, Object>{};
+    Map<String, Object> result = <String, Object>{};
     var local_combinators = combinators;
     if (local_combinators.isNotEmpty) {
-      _result["combinators"] =
-          local_combinators.map((_value) => _value.toJson()).toList();
+      result["combinators"] =
+          local_combinators.map((value) => value.toJson()).toList();
     }
     var local_uri = uri;
     if (local_uri != '') {
-      _result["uri"] = local_uri;
+      result["uri"] = local_uri;
     }
-    return _result;
+    return result;
   }
 
   @override
@@ -3194,16 +3191,16 @@
     implements idl.AvailableFileExportCombinator {
   @override
   Map<String, Object> toJson() {
-    Map<String, Object> _result = <String, Object>{};
+    Map<String, Object> result = <String, Object>{};
     var local_hides = hides;
     if (local_hides.isNotEmpty) {
-      _result["hides"] = local_hides;
+      result["hides"] = local_hides;
     }
     var local_shows = shows;
     if (local_shows.isNotEmpty) {
-      _result["shows"] = local_shows;
+      result["shows"] = local_shows;
     }
-    return _result;
+    return result;
   }
 
   @override
@@ -3340,17 +3337,16 @@
 abstract class _CiderUnitErrorsMixin implements idl.CiderUnitErrors {
   @override
   Map<String, Object> toJson() {
-    Map<String, Object> _result = <String, Object>{};
+    Map<String, Object> result = <String, Object>{};
     var local_errors = errors;
     if (local_errors.isNotEmpty) {
-      _result["errors"] =
-          local_errors.map((_value) => _value.toJson()).toList();
+      result["errors"] = local_errors.map((value) => value.toJson()).toList();
     }
     var local_signature = signature;
     if (local_signature.isNotEmpty) {
-      _result["signature"] = local_signature;
+      result["signature"] = local_signature;
     }
-    return _result;
+    return result;
   }
 
   @override
@@ -3524,28 +3520,28 @@
 abstract class _DiagnosticMessageMixin implements idl.DiagnosticMessage {
   @override
   Map<String, Object> toJson() {
-    Map<String, Object> _result = <String, Object>{};
+    Map<String, Object> result = <String, Object>{};
     var local_filePath = filePath;
     if (local_filePath != '') {
-      _result["filePath"] = local_filePath;
+      result["filePath"] = local_filePath;
     }
     var local_length = length;
     if (local_length != 0) {
-      _result["length"] = local_length;
+      result["length"] = local_length;
     }
     var local_message = message;
     if (local_message != '') {
-      _result["message"] = local_message;
+      result["message"] = local_message;
     }
     var local_offset = offset;
     if (local_offset != 0) {
-      _result["offset"] = local_offset;
+      result["offset"] = local_offset;
     }
     var local_url = url;
     if (local_url != '') {
-      _result["url"] = local_url;
+      result["url"] = local_url;
     }
-    return _result;
+    return result;
   }
 
   @override
@@ -3672,16 +3668,16 @@
 abstract class _DirectiveInfoMixin implements idl.DirectiveInfo {
   @override
   Map<String, Object> toJson() {
-    Map<String, Object> _result = <String, Object>{};
+    Map<String, Object> result = <String, Object>{};
     var local_templateNames = templateNames;
     if (local_templateNames.isNotEmpty) {
-      _result["templateNames"] = local_templateNames;
+      result["templateNames"] = local_templateNames;
     }
     var local_templateValues = templateValues;
     if (local_templateValues.isNotEmpty) {
-      _result["templateValues"] = local_templateValues;
+      result["templateValues"] = local_templateValues;
     }
-    return _result;
+    return result;
   }
 
   @override
@@ -3762,12 +3758,12 @@
 abstract class _PackageBundleMixin implements idl.PackageBundle {
   @override
   Map<String, Object> toJson() {
-    Map<String, Object> _result = <String, Object>{};
+    Map<String, Object> result = <String, Object>{};
     var local_fake = fake;
     if (local_fake != 0) {
-      _result["fake"] = local_fake;
+      result["fake"] = local_fake;
     }
-    return _result;
+    return result;
   }
 
   @override
diff --git a/pkg/analyzer/lib/src/summary2/data_reader.dart b/pkg/analyzer/lib/src/summary2/data_reader.dart
index e72e947..9c1988d 100644
--- a/pkg/analyzer/lib/src/summary2/data_reader.dart
+++ b/pkg/analyzer/lib/src/summary2/data_reader.dart
@@ -242,7 +242,7 @@
     }
   }
 
-  static String _decodeWtf8(Uint8List _bytes, int start, int end) {
+  static String _decodeWtf8(Uint8List bytes, int start, int end) {
     // WTF-8 decoder that trusts its input, meaning that the correctness of
     // the code depends on the bytes from start to end being valid and
     // complete WTF-8. Instead of masking off the control bits from every
@@ -252,28 +252,28 @@
     int i = start;
     int j = 0;
     while (i < end) {
-      int byte = _bytes[i++];
+      int byte = bytes[i++];
       if (byte < 0x80) {
         // ASCII.
         charCodes[j++] = byte;
       } else if (byte < 0xE0) {
         // Two-byte sequence (11-bit unicode value).
-        int byte2 = _bytes[i++];
+        int byte2 = bytes[i++];
         int value = (byte << 6) ^ byte2 ^ 0x3080;
         assert(value >= 0x80 && value < 0x800);
         charCodes[j++] = value;
       } else if (byte < 0xF0) {
         // Three-byte sequence (16-bit unicode value).
-        int byte2 = _bytes[i++];
-        int byte3 = _bytes[i++];
+        int byte2 = bytes[i++];
+        int byte3 = bytes[i++];
         int value = (byte << 12) ^ (byte2 << 6) ^ byte3 ^ 0xE2080;
         assert(value >= 0x800 && value < 0x10000);
         charCodes[j++] = value;
       } else {
         // Four-byte sequence (non-BMP unicode value).
-        int byte2 = _bytes[i++];
-        int byte3 = _bytes[i++];
-        int byte4 = _bytes[i++];
+        int byte2 = bytes[i++];
+        int byte3 = bytes[i++];
+        int byte4 = bytes[i++];
         int value =
             (byte << 18) ^ (byte2 << 12) ^ (byte3 << 6) ^ byte4 ^ 0x3C82080;
         assert(value >= 0x10000 && value < 0x110000);
diff --git a/pkg/analyzer/messages.yaml b/pkg/analyzer/messages.yaml
index 8e60369..3b2abaf 100644
--- a/pkg/analyzer/messages.yaml
+++ b/pkg/analyzer/messages.yaml
@@ -3971,13 +3971,16 @@
       If there are multiple cascaded accesses, you'll need to duplicate the
       extension override for each one.
   EXTERNAL_FIELD_CONSTRUCTOR_INITIALIZER:
-    problemMessage: External fields cannot have initializers.
+    sharedName: EXTERNAL_WITH_INITIALIZER
+    problemMessage: External fields can't have initializers.
     correctionMessage: "Try removing the field initializer or the 'external' keyword from the field declaration."
   EXTERNAL_FIELD_INITIALIZER:
-    problemMessage: External fields cannot have initializers.
+    sharedName: EXTERNAL_WITH_INITIALIZER
+    problemMessage: External fields can't have initializers.
     correctionMessage: "Try removing the initializer or the 'external' keyword."
   EXTERNAL_VARIABLE_INITIALIZER:
-    problemMessage: External variables cannot have initializers.
+    sharedName: EXTERNAL_WITH_INITIALIZER
+    problemMessage: External variables can't have initializers.
     correctionMessage: "Try removing the initializer or the 'external' keyword."
   EXTRA_POSITIONAL_ARGUMENTS:
     problemMessage: "Too many positional arguments: {0} expected, but {1} found."
@@ -5185,6 +5188,12 @@
         int get defaultX => 0;
       }
       ```
+  IMPLICIT_UNNAMED_SUPER_CONSTRUCTOR_INVOCATION_MISSING_REQUIRED_ARGUMENT:
+    problemMessage: The named parameter '{0}' is required in the implicitly invoked unnamed constructor of '{1}'.
+    correctionMessage: Try declaring corresponding named super-parameter, or explicitly invoking a different constructor.
+  IMPLICIT_UNNAMED_SUPER_CONSTRUCTOR_INVOCATION_NOT_ENOUGH_POSITIONAL_ARGUMENTS:
+    problemMessage: The implicitly invoked unnamed constructor of '{0}' expects {1} positional arguments, but {2} found.
+    correctionMessage: Try declaring positional super-parameters, or explicitly invoking a different constructor.
   IMPORT_INTERNAL_LIBRARY:
     problemMessage: "The library '{0}' is internal and can't be imported."
     hasPublishedDocs: true
@@ -7370,6 +7379,12 @@
       void f(int x) {}
       void g({required int x}) {}
       ```
+  MISSING_DEFAULT_VALUE_FOR_PARAMETER_WITH_ANNOTATION:
+    sharedName: MISSING_DEFAULT_VALUE_FOR_PARAMETER
+    problemMessage: "With null safety, use the 'required' keyword, not the '@required' annotation."
+    correctionMessage: "Try removing the '@'."
+    hasPublishedDocs: true
+    comment: No parameters.
   MISSING_REQUIRED_ARGUMENT:
     problemMessage: "The named parameter '{0}' is required, but there's no corresponding argument."
     correctionMessage: Try adding the required argument.
@@ -7690,11 +7705,6 @@
 
       class B extends A {}
       ```
-  MIXIN_DECLARES_CONSTRUCTOR:
-    problemMessage: "Mixins can't declare constructors."
-    comment: |-
-      The <i>mixinMember</i> production allows the same instance or static
-      members that a class would allow, but no constructors (for now).
   MIXIN_INFERENCE_INCONSISTENT_MATCHING_CLASSES:
     problemMessage: "Type parameters couldn't be inferred for the mixin '{0}' because the base class implements the mixin's supertype constraint '{1}' in multiple conflicting ways"
   MIXIN_INFERENCE_NO_MATCHING_CLASS:
@@ -11097,6 +11107,13 @@
 
       int f(C c) => c.b;
       ```
+  SUPER_FORMAL_PARAMETER_TYPE_IS_NOT_SUBTYPE_OF_ASSOCIATED:
+    problemMessage: The type '{0}' of this parameter is not a subtype of the type '{1}' of the associated super-constructor parameter.
+    comment: |-
+      Parameters:
+      0: the type of super-parameter
+      1: the type of associated super-constructor parameter
+    correctionMessage: Try removing the explicit type annotation from the parameter.
   SUPER_FORMAL_PARAMETER_WITHOUT_ASSOCIATED_NAMED:
     problemMessage: No associated named super-constructor parameter.
     comment: No parameters.
diff --git a/pkg/analyzer/test/generated/java_core_test.dart b/pkg/analyzer/test/generated/java_core_test.dart
index 9d8ccfe..1dd1ff2 100644
--- a/pkg/analyzer/test/generated/java_core_test.dart
+++ b/pkg/analyzer/test/generated/java_core_test.dart
@@ -6,53 +6,17 @@
 import 'package:test/test.dart';
 
 main() {
-  group('Character', () {
-    group('isLetter', () {
-      test('digits', () {
-        expect(Character.isLetter('0'.codeUnitAt(0)), isFalse);
-        expect(Character.isLetter('1'.codeUnitAt(0)), isFalse);
-        expect(Character.isLetter('9'.codeUnitAt(0)), isFalse);
-      });
+  test('formatList', () {
+    expect(
+      format('Hello, {0} {1}!', 'John', 'Doe'),
+      'Hello, John Doe!',
+    );
+  });
 
-      test('letters', () {
-        expect(Character.isLetter('a'.codeUnitAt(0)), isTrue);
-        expect(Character.isLetter('b'.codeUnitAt(0)), isTrue);
-        expect(Character.isLetter('z'.codeUnitAt(0)), isTrue);
-        expect(Character.isLetter('C'.codeUnitAt(0)), isTrue);
-        expect(Character.isLetter('D'.codeUnitAt(0)), isTrue);
-        expect(Character.isLetter('Y'.codeUnitAt(0)), isTrue);
-      });
-
-      test('other', () {
-        expect(Character.isLetter(' '.codeUnitAt(0)), isFalse);
-        expect(Character.isLetter('.'.codeUnitAt(0)), isFalse);
-        expect(Character.isLetter('-'.codeUnitAt(0)), isFalse);
-        expect(Character.isLetter('+'.codeUnitAt(0)), isFalse);
-      });
-    });
-
-    group('isLetterOrDigit', () {
-      test('digits', () {
-        expect(Character.isLetterOrDigit('0'.codeUnitAt(0)), isTrue);
-        expect(Character.isLetterOrDigit('1'.codeUnitAt(0)), isTrue);
-        expect(Character.isLetterOrDigit('9'.codeUnitAt(0)), isTrue);
-      });
-
-      test('letters', () {
-        expect(Character.isLetterOrDigit('a'.codeUnitAt(0)), isTrue);
-        expect(Character.isLetterOrDigit('b'.codeUnitAt(0)), isTrue);
-        expect(Character.isLetterOrDigit('z'.codeUnitAt(0)), isTrue);
-        expect(Character.isLetterOrDigit('C'.codeUnitAt(0)), isTrue);
-        expect(Character.isLetterOrDigit('D'.codeUnitAt(0)), isTrue);
-        expect(Character.isLetterOrDigit('Y'.codeUnitAt(0)), isTrue);
-      });
-
-      test('other', () {
-        expect(Character.isLetterOrDigit(' '.codeUnitAt(0)), isFalse);
-        expect(Character.isLetterOrDigit('.'.codeUnitAt(0)), isFalse);
-        expect(Character.isLetterOrDigit('-'.codeUnitAt(0)), isFalse);
-        expect(Character.isLetterOrDigit('+'.codeUnitAt(0)), isFalse);
-      });
-    });
+  test('formatList', () {
+    expect(
+      formatList('Hello, {0} {1}!', ['John', 'Doe']),
+      'Hello, John Doe!',
+    );
   });
 }
diff --git a/pkg/analyzer/test/generated/java_io_test.dart b/pkg/analyzer/test/generated/java_io_test.dart
deleted file mode 100644
index 35bfdeb..0000000
--- a/pkg/analyzer/test/generated/java_io_test.dart
+++ /dev/null
@@ -1,41 +0,0 @@
-// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'package:analyzer/src/generated/java_io.dart';
-import 'package:path/path.dart' as path;
-import 'package:test/test.dart';
-
-main() {
-  group('JavaFile', () {
-    group('toURI', () {
-      test('forAbsolute', () {
-        String tempPath = '/temp';
-        String absolutePath = path.context.join(tempPath, 'foo.dart');
-        // we use an absolute path
-        expect(path.context.isAbsolute(absolutePath), isTrue,
-            reason: '"$absolutePath" is not absolute');
-        // test that toURI() returns an absolute URI
-        // ignore: deprecated_member_use_from_same_package
-        Uri uri = JavaFile(absolutePath).toURI();
-        expect(uri.isAbsolute, isTrue);
-        expect(uri.scheme, 'file');
-      });
-      test('forRelative', () {
-        String tempPath = '/temp';
-        String absolutePath = path.context.join(tempPath, 'foo.dart');
-        expect(path.context.isAbsolute(absolutePath), isTrue,
-            reason: '"$absolutePath" is not absolute');
-        // prepare a relative path
-        // We should not check that "relPath" is actually relative -
-        // it may be not on Windows, if "temp" is on other disk.
-        String relPath = path.context.relative(absolutePath);
-        // test that toURI() returns an absolute URI
-        // ignore: deprecated_member_use_from_same_package
-        Uri uri = JavaFile(relPath).toURI();
-        expect(uri.isAbsolute, isTrue);
-        expect(uri.scheme, 'file');
-      });
-    });
-  });
-}
diff --git a/pkg/analyzer/test/generated/test_all.dart b/pkg/analyzer/test/generated/test_all.dart
index 2d48f18..065d67a 100644
--- a/pkg/analyzer/test/generated/test_all.dart
+++ b/pkg/analyzer/test/generated/test_all.dart
@@ -21,7 +21,6 @@
 import 'invalid_code_test.dart' as invalid_code;
 import 'issues_test.dart' as issues;
 import 'java_core_test.dart' as java_core_test;
-import 'java_io_test.dart' as java_io_test;
 import 'new_as_identifier_parser_test.dart' as new_as_identifier_parser;
 import 'nnbd_parser_test.dart' as nnbd_parser;
 import 'non_error_parser_test.dart' as non_error_parser;
@@ -63,7 +62,6 @@
     invalid_code.main();
     issues.main();
     java_core_test.main();
-    java_io_test.main();
     new_as_identifier_parser.main();
     nnbd_parser.main();
     non_error_parser.main();
diff --git a/pkg/analyzer/test/src/dart/analysis/context_locator_test.dart b/pkg/analyzer/test/src/dart/analysis/context_locator_test.dart
index 31462c1..efbf9533f 100644
--- a/pkg/analyzer/test/src/dart/analysis/context_locator_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/context_locator_test.dart
@@ -1507,14 +1507,14 @@
     _assertAnalyzedFiles(root, pathList);
   }
 
-  void _assertBasicWorkspace(Workspace _workspace, String posixRoot) {
-    var workspace = _workspace as BasicWorkspace;
+  void _assertBasicWorkspace(Workspace workspace, String posixRoot) {
+    workspace as BasicWorkspace;
     var root = convertPath(posixRoot);
     expect(workspace.root, root);
   }
 
-  void _assertBazelWorkspace(Workspace _workspace, String posixRoot) {
-    var workspace = _workspace as BazelWorkspace;
+  void _assertBazelWorkspace(Workspace workspace, String posixRoot) {
+    workspace as BazelWorkspace;
     var root = convertPath(posixRoot);
     expect(workspace.root, root);
   }
@@ -1526,8 +1526,8 @@
     }
   }
 
-  void _assertPubWorkspace(Workspace _workspace, String posixRoot) {
-    var workspace = _workspace as PubWorkspace;
+  void _assertPubWorkspace(Workspace workspace, String posixRoot) {
+    workspace as PubWorkspace;
     var root = convertPath(posixRoot);
     expect(workspace.root, root);
   }
diff --git a/pkg/analyzer/test/src/diagnostics/conflicting_type_variable_and_member_test.dart b/pkg/analyzer/test/src/diagnostics/conflicting_type_variable_and_member_test.dart
index ff439eb..efab14b 100644
--- a/pkg/analyzer/test/src/diagnostics/conflicting_type_variable_and_member_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/conflicting_type_variable_and_member_test.dart
@@ -18,6 +18,17 @@
 @reflectiveTest
 class ConflictingTypeVariableAndMemberClassTest
     extends PubPackageResolutionTest {
+  test_constructor() async {
+    await assertErrorsInCode(r'''
+class A<T> {
+  A.T();
+}
+''', [
+      error(CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_MEMBER_CLASS, 8,
+          1),
+    ]);
+  }
+
   test_field() async {
     await assertErrorsInCode(r'''
 class A<T> {
diff --git a/pkg/analyzer/test/src/diagnostics/duplicate_named_argument_test.dart b/pkg/analyzer/test/src/diagnostics/duplicate_named_argument_test.dart
index cb69a3a..74bca78 100644
--- a/pkg/analyzer/test/src/diagnostics/duplicate_named_argument_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/duplicate_named_argument_test.dart
@@ -42,6 +42,18 @@
     ]);
   }
 
+  test_constructor_superParameter() async {
+    await assertErrorsInCode(r'''
+class A {
+  A({required int a});
+}
+
+class B extends A {
+  B({required super.a}) : super(a: 0);
+}
+''', [error(CompileTimeErrorCode.DUPLICATE_NAMED_ARGUMENT, 88, 1)]);
+  }
+
   test_function() async {
     await assertErrorsInCode(r'''
 f({a, b}) {}
diff --git a/pkg/analyzer/test/src/diagnostics/missing_default_value_for_parameter_test.dart b/pkg/analyzer/test/src/diagnostics/missing_default_value_for_parameter_test.dart
index e292d65..0656a4b 100644
--- a/pkg/analyzer/test/src/diagnostics/missing_default_value_for_parameter_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/missing_default_value_for_parameter_test.dart
@@ -11,6 +11,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(MissingDefaultValueForParameterTest);
+    defineReflectiveTests(MissingDefaultValueForParameterWithAnnotationTest);
   });
 }
 
@@ -538,3 +539,24 @@
     ]);
   }
 }
+
+@reflectiveTest
+class MissingDefaultValueForParameterWithAnnotationTest
+    extends PubPackageResolutionTest {
+  test_method_withAnnotation() async {
+    writeTestPackageConfigWithMeta();
+    await assertErrorsInCode('''
+import 'package:meta/meta.dart';
+
+class C {
+  void foo({@required int a}) {}
+}
+''', [
+      error(
+          CompileTimeErrorCode
+              .MISSING_DEFAULT_VALUE_FOR_PARAMETER_WITH_ANNOTATION,
+          70,
+          1),
+    ]);
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/no_default_super_constructor_test.dart b/pkg/analyzer/test/src/diagnostics/no_default_super_constructor_test.dart
index a0e3db6..a94e1c1 100644
--- a/pkg/analyzer/test/src/diagnostics/no_default_super_constructor_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/no_default_super_constructor_test.dart
@@ -16,44 +16,64 @@
 
 @reflectiveTest
 class NoDefaultSuperConstructorTest extends PubPackageResolutionTest
-    with WithoutNullSafetyMixin, NoDefaultSuperConstructorTestCases {}
-
-mixin NoDefaultSuperConstructorTestCases on PubPackageResolutionTest {
-  test_explicitDefaultSuperConstructor() async {
-    await assertNoErrorsInCode(r'''
-class A {
-  A();
-}
-class B extends A {
-  B() {}
-}
-''');
-  }
-
-  test_implicitDefaultSuperConstructor() async {
-    await assertNoErrorsInCode(r'''
-class A {
-}
-class B extends A {
-  B() {}
-}
-''');
-  }
-
-  test_missingDefaultSuperConstructor_explicitConstructor() async {
+    with WithoutNullSafetyMixin, NoDefaultSuperConstructorTestCases {
+  test_super_requiredPositional_subclass_explicit() async {
     await assertErrorsInCode(r'''
 class A {
   A(p);
 }
 class B extends A {
-  B() {}
+  B();
 }
 ''', [
       error(CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_EXPLICIT, 42, 1),
     ]);
   }
+}
 
-  test_missingDefaultSuperConstructor_externalConstructor() async {
+mixin NoDefaultSuperConstructorTestCases on PubPackageResolutionTest {
+  test_super_implicit_subclass_explicit() async {
+    await assertNoErrorsInCode(r'''
+class A {}
+class B extends A {
+  B();
+}
+''');
+  }
+
+  test_super_implicit_subclass_implicit() async {
+    await assertNoErrorsInCode(r'''
+class A {}
+class B extends A {}
+''');
+  }
+
+  test_super_noParameters() async {
+    await assertNoErrorsInCode(r'''
+class A {
+  A();
+}
+class B extends A {
+  B();
+}
+''');
+  }
+
+  test_super_requiredPositional_subclass_explicit_language214() async {
+    await assertErrorsInCode(r'''
+// @dart = 2.14
+class A {
+  A(p);
+}
+class B extends A {
+  B();
+}
+''', [
+      error(CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_EXPLICIT, 58, 1),
+    ]);
+  }
+
+  test_super_requiredPositional_subclass_external() async {
     await assertNoErrorsInCode(r'''
 class A {
   A(p);
@@ -64,24 +84,14 @@
 ''');
   }
 
-  test_missingDefaultSuperConstructor_implicitConstructor() async {
+  test_super_requiredPositional_subclass_implicit() async {
     await assertErrorsInCode(r'''
 class A {
   A(p);
 }
-class B extends A {
-}
-''', [
-      error(CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT, 26, 1),
-    ]);
-  }
-
-  test_missingDefaultSuperConstructor_onlyNamedSuperConstructor() async {
-    await assertErrorsInCode(r'''
-class A { A.named() {} }
 class B extends A {}
 ''', [
-      error(CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT, 31, 1),
+      error(CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT, 26, 1),
     ]);
   }
 }
@@ -89,7 +99,69 @@
 @reflectiveTest
 class NoDefaultSuperConstructorWithNullSafetyTest
     extends PubPackageResolutionTest with NoDefaultSuperConstructorTestCases {
-  test_super_requiredParameter_legacySubclass_explicitConstructor() async {
+  test_super_optionalNamed_subclass_explicit() async {
+    await assertNoErrorsInCode(r'''
+class A {
+  A({int? a});
+}
+class B extends A {
+  B();
+}
+''');
+  }
+
+  test_super_optionalNamed_subclass_implicit() async {
+    await assertNoErrorsInCode(r'''
+class A {
+  A({int? a});
+}
+class B extends A {}
+''');
+  }
+
+  test_super_optionalNamed_subclass_superParameter() async {
+    await assertNoErrorsInCode(r'''
+class A {
+  A({int? a});
+}
+class B extends A {
+  B({super.a});
+}
+''');
+  }
+
+  test_super_optionalPositional_subclass_explicit() async {
+    await assertNoErrorsInCode(r'''
+class A {
+  A([int? a]);
+}
+class B extends A {
+  B();
+}
+''');
+  }
+
+  test_super_optionalPositional_subclass_implicit() async {
+    await assertNoErrorsInCode(r'''
+class A {
+  A([int? a]);
+}
+class B extends A {}
+''');
+  }
+
+  test_super_optionalPositional_subclass_superParameter() async {
+    await assertNoErrorsInCode(r'''
+class A {
+  A([int? a]);
+}
+class B extends A {
+  B(super.a);
+}
+''');
+  }
+
+  test_super_requiredNamed_legacySubclass_explicitConstructor() async {
     newFile('$testPackageLibPath/a.dart', content: r'''
 class A {
   A({required String s});
@@ -105,11 +177,11 @@
 ''');
   }
 
-  test_super_requiredParameter_legacySubclass_implicitConstructor() async {
+  test_super_requiredNamed_legacySubclass_implicitConstructor() async {
     newFile('$testPackageLibPath/a.dart', content: r'''
 class A {
   A({required String s});
-}
+}O
 ''');
     await assertNoErrorsInCode(r'''
 // @dart=2.8
@@ -118,4 +190,132 @@
 class B extends A {}
 ''');
   }
+
+  test_super_requiredNamed_subclass_explicit() async {
+    await assertErrorsInCode(r'''
+class A {
+  A({required int? a});
+}
+class B extends A {
+  B();
+}
+''', [
+      error(
+          CompileTimeErrorCode
+              .IMPLICIT_UNNAMED_SUPER_CONSTRUCTOR_INVOCATION_MISSING_REQUIRED_ARGUMENT,
+          58,
+          1),
+    ]);
+  }
+
+  test_super_requiredNamed_subclass_implicit() async {
+    await assertErrorsInCode(r'''
+class A {
+  A({required int? a});
+}
+class B extends A {}
+''', [
+      error(CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT, 42, 1),
+    ]);
+  }
+
+  test_super_requiredNamed_subclass_superParameter() async {
+    await assertNoErrorsInCode(r'''
+class A {
+  A({required int? a});
+}
+class B extends A {
+  B({required super.a});
+}
+''');
+  }
+
+  test_super_requiredNamed_subclass_superParameter_oneLeft() async {
+    await assertErrorsInCode(r'''
+class A {
+  A({required int? a, required int? b});
+}
+class B extends A {
+  B({required super.a});
+}
+''', [
+      error(
+          CompileTimeErrorCode
+              .IMPLICIT_UNNAMED_SUPER_CONSTRUCTOR_INVOCATION_MISSING_REQUIRED_ARGUMENT,
+          75,
+          1),
+    ]);
+  }
+
+  test_super_requiredNamed_subclass_superParameter_optionalNamed_hasDefault() async {
+    await assertNoErrorsInCode(r'''
+class A {
+  A({required int? a});
+}
+class B extends A {
+  B({super.a = 0});
+}
+''');
+  }
+
+  test_super_requiredNamed_subclass_superParameter_optionalNamed_noDefault() async {
+    await assertNoErrorsInCode(r'''
+class A {
+  A({required int? a});
+}
+class B extends A {
+  B({super.a});
+}
+''');
+  }
+
+  test_super_requiredPositional_subclass_explicit() async {
+    await assertErrorsInCode(r'''
+class A {
+  A(p);
+}
+class B extends A {
+  B();
+}
+''', [
+      error(
+          CompileTimeErrorCode
+              .IMPLICIT_UNNAMED_SUPER_CONSTRUCTOR_INVOCATION_NOT_ENOUGH_POSITIONAL_ARGUMENTS,
+          42,
+          1),
+    ]);
+  }
+
+  test_super_requiredPositional_subclass_superParameter_optionalPositional_withDefault() async {
+    await assertNoErrorsInCode(r'''
+class A {
+  A(int? a);
+}
+class B extends A {
+  B([super.a = 0]);
+}
+''');
+  }
+
+  test_super_requiredPositional_subclass_superParameter_optionalPositional_withoutDefault() async {
+    await assertNoErrorsInCode(r'''
+class A {
+  A(int? a);
+}
+class B extends A {
+  B([super.a]);
+}
+''');
+  }
+
+  test_super_requiredPositional_subclass_superParameter_requiredPositional() async {
+    await assertNoErrorsInCode(r'''
+class A {
+  A(int? a);
+}
+class B extends A {
+  B(super.a);
+}
+''');
+  }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/super_formal_parameter_type_is_not_subtype_of_associated_test.dart b/pkg/analyzer/test/src/diagnostics/super_formal_parameter_type_is_not_subtype_of_associated_test.dart
new file mode 100644
index 0000000..b7db53b
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/super_formal_parameter_type_is_not_subtype_of_associated_test.dart
@@ -0,0 +1,168 @@
+// Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/src/error/codes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/context_collection_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(SuperFormalParameterTypeIsNotSubtypeOfAssociatedTest);
+  });
+}
+
+@reflectiveTest
+class SuperFormalParameterTypeIsNotSubtypeOfAssociatedTest
+    extends PubPackageResolutionTest {
+  test_generic_requiredPositional_explicit_notSubtype() async {
+    await assertErrorsInCode(r'''
+class A<T> {
+  A(T a);
+}
+
+class B extends A<int> {
+  B(num super.a);
+}
+''', [
+      error(
+          CompileTimeErrorCode
+              .SUPER_FORMAL_PARAMETER_TYPE_IS_NOT_SUBTYPE_OF_ASSOCIATED,
+          65,
+          1),
+    ]);
+  }
+
+  test_generic_requiredPositional_explicit_same() async {
+    await assertNoErrorsInCode(r'''
+class A<T> {
+  A(T a);
+}
+
+class B extends A<num> {
+  B(num super.a);
+}
+''');
+  }
+
+  test_generic_requiredPositional_explicit_subtype() async {
+    await assertNoErrorsInCode(r'''
+class A<T> {
+  A(T a);
+}
+
+class B extends A<num> {
+  B(int super.a);
+}
+''');
+  }
+
+  test_requiredNamed_explicit_notSubtype() async {
+    await assertErrorsInCode(r'''
+class A {
+  A({required int a});
+}
+
+class B extends A {
+  B({required num super.a});
+}
+''', [
+      error(
+          CompileTimeErrorCode
+              .SUPER_FORMAL_PARAMETER_TYPE_IS_NOT_SUBTYPE_OF_ASSOCIATED,
+          80,
+          1),
+    ]);
+  }
+
+  test_requiredNamed_explicit_same() async {
+    await assertNoErrorsInCode(r'''
+class A {
+  A({required num a});
+}
+
+class B extends A {
+  B({required num super.a});
+}
+''');
+  }
+
+  test_requiredNamed_explicit_subtype() async {
+    await assertNoErrorsInCode(r'''
+class A {
+  A({required num a});
+}
+
+class B extends A {
+  B({required int super.a});
+}
+''');
+  }
+
+  test_requiredNamed_inherited() async {
+    await assertNoErrorsInCode(r'''
+class A {
+  A({required int a});
+}
+
+class B extends A {
+  B({required super.a});
+}
+''');
+  }
+
+  test_requiredPositional_explicit_notSubtype() async {
+    await assertErrorsInCode(r'''
+class A {
+  A(int a);
+}
+
+class B extends A {
+  B(num super.a);
+}
+''', [
+      error(
+          CompileTimeErrorCode
+              .SUPER_FORMAL_PARAMETER_TYPE_IS_NOT_SUBTYPE_OF_ASSOCIATED,
+          59,
+          1),
+    ]);
+  }
+
+  test_requiredPositional_explicit_same() async {
+    await assertNoErrorsInCode(r'''
+class A {
+  A(num a);
+}
+
+class B extends A {
+  B(num super.a);
+}
+''');
+  }
+
+  test_requiredPositional_explicit_subtype() async {
+    await assertNoErrorsInCode(r'''
+class A {
+  A(num a);
+}
+
+class B extends A {
+  B(int super.a);
+}
+''');
+  }
+
+  test_requiredPositional_inherited() async {
+    await assertNoErrorsInCode(r'''
+class A {
+  A(int a);
+}
+
+class B extends A {
+  B(super.a);
+}
+''');
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/super_formal_parameter_without_associated_named_test.dart b/pkg/analyzer/test/src/diagnostics/super_formal_parameter_without_associated_named_test.dart
index 049858a..80bb982 100644
--- a/pkg/analyzer/test/src/diagnostics/super_formal_parameter_without_associated_named_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/super_formal_parameter_without_associated_named_test.dart
@@ -16,11 +16,9 @@
 @reflectiveTest
 class SuperFormalParameterWithoutAssociatedNamedTest
     extends PubPackageResolutionTest {
-  test_optional() async {
+  test_explicit_optional() async {
     await assertErrorsInCode(r'''
-class A {
-  A([int? a]);
-}
+class A {}
 
 class B extends A {
   B({super.a}) : super();
@@ -28,16 +26,14 @@
 ''', [
       error(
           CompileTimeErrorCode.SUPER_FORMAL_PARAMETER_WITHOUT_ASSOCIATED_NAMED,
-          59,
+          43,
           1)
     ]);
   }
 
-  test_required() async {
+  test_explicit_required() async {
     await assertErrorsInCode(r'''
-class A {
-  A([int? a]);
-}
+class A {}
 
 class B extends A {
   B({required super.a}) : super();
@@ -45,7 +41,37 @@
 ''', [
       error(
           CompileTimeErrorCode.SUPER_FORMAL_PARAMETER_WITHOUT_ASSOCIATED_NAMED,
-          68,
+          52,
+          1)
+    ]);
+  }
+
+  test_implicit_optional() async {
+    await assertErrorsInCode(r'''
+class A {}
+
+class B extends A {
+  B({super.a});
+}
+''', [
+      error(
+          CompileTimeErrorCode.SUPER_FORMAL_PARAMETER_WITHOUT_ASSOCIATED_NAMED,
+          43,
+          1)
+    ]);
+  }
+
+  test_implicit_required() async {
+    await assertErrorsInCode(r'''
+class A {}
+
+class B extends A {
+  B({required super.a});
+}
+''', [
+      error(
+          CompileTimeErrorCode.SUPER_FORMAL_PARAMETER_WITHOUT_ASSOCIATED_NAMED,
+          52,
           1)
     ]);
   }
diff --git a/pkg/analyzer/test/src/diagnostics/super_formal_parameter_without_associated_positional_test.dart b/pkg/analyzer/test/src/diagnostics/super_formal_parameter_without_associated_positional_test.dart
index 47d5cde..c88f091 100644
--- a/pkg/analyzer/test/src/diagnostics/super_formal_parameter_without_associated_positional_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/super_formal_parameter_without_associated_positional_test.dart
@@ -16,11 +16,9 @@
 @reflectiveTest
 class SuperFormalParameterWithoutAssociatedPositionalTest
     extends PubPackageResolutionTest {
-  test_optional() async {
+  test_explicit_optional() async {
     await assertErrorsInCode(r'''
-class A {
-  A({int? a});
-}
+class A {}
 
 class B extends A {
   B([super.a]) : super();
@@ -29,16 +27,14 @@
       error(
           CompileTimeErrorCode
               .SUPER_FORMAL_PARAMETER_WITHOUT_ASSOCIATED_POSITIONAL,
-          59,
+          43,
           1)
     ]);
   }
 
-  test_required() async {
+  test_explicit_required() async {
     await assertErrorsInCode(r'''
-class A {
-  A({int? a});
-}
+class A {}
 
 class B extends A {
   B(super.a) : super();
@@ -47,7 +43,39 @@
       error(
           CompileTimeErrorCode
               .SUPER_FORMAL_PARAMETER_WITHOUT_ASSOCIATED_POSITIONAL,
-          58,
+          42,
+          1)
+    ]);
+  }
+
+  test_implicit_optional() async {
+    await assertErrorsInCode(r'''
+class A {}
+
+class B extends A {
+  B([super.a]);
+}
+''', [
+      error(
+          CompileTimeErrorCode
+              .SUPER_FORMAL_PARAMETER_WITHOUT_ASSOCIATED_POSITIONAL,
+          43,
+          1)
+    ]);
+  }
+
+  test_implicit_required() async {
+    await assertErrorsInCode(r'''
+class A {}
+
+class B extends A {
+  B(super.a);
+}
+''', [
+      error(
+          CompileTimeErrorCode
+              .SUPER_FORMAL_PARAMETER_WITHOUT_ASSOCIATED_POSITIONAL,
+          42,
           1)
     ]);
   }
diff --git a/pkg/analyzer/test/src/diagnostics/test_all.dart b/pkg/analyzer/test/src/diagnostics/test_all.dart
index 445a54b..2529d3a 100644
--- a/pkg/analyzer/test/src/diagnostics/test_all.dart
+++ b/pkg/analyzer/test/src/diagnostics/test_all.dart
@@ -628,6 +628,8 @@
 import 'subtype_of_ffi_class_test.dart' as subtype_of_ffi_class;
 import 'subtype_of_sealed_class_test.dart' as subtype_of_sealed_class;
 import 'subtype_of_struct_class_test.dart' as subtype_of_struct_class;
+import 'super_formal_parameter_type_is_not_subtype_of_associated_test.dart'
+    as super_formal_parameter_type_is_not_subtype_of_associated;
 import 'super_formal_parameter_without_associated_named_test.dart'
     as super_formal_parameter_without_associated_named;
 import 'super_formal_parameter_without_associated_positional_test.dart'
@@ -1146,6 +1148,7 @@
     subtype_of_ffi_class.main();
     subtype_of_sealed_class.main();
     subtype_of_struct_class.main();
+    super_formal_parameter_type_is_not_subtype_of_associated.main();
     super_formal_parameter_without_associated_named.main();
     super_formal_parameter_without_associated_positional.main();
     super_in_extension.main();
diff --git a/pkg/analyzer/tool/diagnostics/diagnostics.md b/pkg/analyzer/tool/diagnostics/diagnostics.md
index 8f8c3aa..0b6ebfb 100644
--- a/pkg/analyzer/tool/diagnostics/diagnostics.md
+++ b/pkg/analyzer/tool/diagnostics/diagnostics.md
@@ -8042,6 +8042,8 @@
 _The parameter '{0}' can't have a value of 'null' because of its type, but the
 implicit default value is 'null'._
 
+_With null safety, use the 'required' keyword, not the '@required' annotation._
+
 #### Description
 
 The analyzer produces this diagnostic when an optional parameter, whether
diff --git a/pkg/analyzer/tool/summary/generate.dart b/pkg/analyzer/tool/summary/generate.dart
index b18c095..981e0cf 100644
--- a/pkg/analyzer/tool/summary/generate.dart
+++ b/pkg/analyzer/tool/summary/generate.dart
@@ -1069,12 +1069,12 @@
         if (convertItem == null) {
           convertField = localName;
         } else if (type.isList) {
-          convertField = '$localName.map((_value) =>'
-              ' ${convertItem('_value')}).toList()';
+          convertField = '$localName.map((value) =>'
+              ' ${convertItem('value')}).toList()';
         } else {
           convertField = convertItem(localName);
         }
-        return '_result[${quoted(name)}] = $convertField';
+        return 'result[${quoted(name)}] = $convertField';
       }
 
       void writeConditionalStatement(String condition, String statement) {
@@ -1087,7 +1087,7 @@
       out('@override');
       out('Map<String, Object> toJson() {');
       indent(() {
-        out('Map<String, Object> _result = <String, Object>{};');
+        out('Map<String, Object> result = <String, Object>{};');
 
         indent(() {
           for (idl_model.FieldDeclaration field in cls.fields) {
@@ -1099,7 +1099,7 @@
           }
         });
 
-        out('return _result;');
+        out('return result;');
       });
       out('}');
       out();
diff --git a/pkg/analyzer_utilities/lib/check/iterable.dart b/pkg/analyzer_utilities/lib/check/iterable.dart
index e6415c3..5b43453 100644
--- a/pkg/analyzer_utilities/lib/check/iterable.dart
+++ b/pkg/analyzer_utilities/lib/check/iterable.dart
@@ -19,6 +19,28 @@
     }
   }
 
+  /// Succeeds if there is an element that matches the [matcher],
+  void containsMatch(void Function(CheckTarget<T> element) matcher) {
+    var elementList = value.toList();
+    for (var elementIndex = 0;
+        elementIndex < elementList.length;
+        elementIndex++) {
+      var element = elementList[elementIndex];
+      var elementTarget = nest(
+        element,
+        (element) =>
+            'element ${valueStr(element)} at ${valueStr(elementIndex)}',
+      );
+      try {
+        matcher(elementTarget);
+        return;
+      } on test_package.TestFailure {
+        continue;
+      }
+    }
+    fail('Does not contain at least one element that matches');
+  }
+
   @UseResult.unless(parameterDefined: 'expected')
   CheckTarget<int> hasLength([int? expected]) {
     var actual = value.length;
diff --git a/pkg/analyzer_utilities/test/check/check_test.dart b/pkg/analyzer_utilities/test/check/check_test.dart
index bab4572..20873c0 100644
--- a/pkg/analyzer_utilities/test/check/check_test.dart
+++ b/pkg/analyzer_utilities/test/check/check_test.dart
@@ -62,6 +62,12 @@
       });
     });
     group('Iterable', () {
+      test('containsMatch', () {
+        check(<int>[0]).containsMatch((e) => e.isZero);
+        check(<int>[1, 0, 2]).containsMatch((e) => e.isZero);
+        _fails(() => check(<int>[]).containsMatch((e) => e.isZero));
+        _fails(() => check(<int>[1]).containsMatch((e) => e.isZero));
+      });
       test('hasLength', () {
         check(<int>[]).hasLength().isZero;
         check(<int>[0]).hasLength().isEqualTo(1);
diff --git a/pkg/compiler/lib/src/apiimpl.dart b/pkg/compiler/lib/src/apiimpl.dart
index c8aba18..2b0ad7d 100644
--- a/pkg/compiler/lib/src/apiimpl.dart
+++ b/pkg/compiler/lib/src/apiimpl.dart
@@ -64,7 +64,9 @@
     if (env.supportedLibraries == null) {
       future = future.then((_) {
         Uri specificationUri = options.librariesSpecificationUri;
-        return provider.readFromUri(specificationUri).then((api.Input spec) {
+
+        Future<String> readJson(Uri uri) async {
+          api.Input spec = await provider.readFromUri(specificationUri);
           String json = null;
           // TODO(sigmund): simplify this, we have some API inconsistencies when
           // our internal input adds a terminating zero.
@@ -73,12 +75,16 @@
           } else if (spec is Binary) {
             json = utf8.decode(spec.data);
           }
+          return json;
+        }
 
-          // TODO(sigmund): would be nice to front-load some of the CFE option
-          // processing and parse this .json file only once.
-          env.supportedLibraries = getSupportedLibraryNames(specificationUri,
-                  json, options.compileForServer ? "dart2js_server" : "dart2js")
-              .toSet();
+        // TODO(sigmund): would be nice to front-load some of the CFE option
+        // processing and parse this .json file only once.
+        return getSupportedLibraryNames(specificationUri,
+                options.compileForServer ? "dart2js_server" : "dart2js",
+                readJson: readJson)
+            .then((libraries) {
+          env.supportedLibraries = libraries.toSet();
         });
       });
     }
diff --git a/pkg/compiler/lib/src/io/position_information.dart b/pkg/compiler/lib/src/io/position_information.dart
index 8d2c4b9..b3195a7 100644
--- a/pkg/compiler/lib/src/io/position_information.dart
+++ b/pkg/compiler/lib/src/io/position_information.dart
@@ -1111,7 +1111,7 @@
 
   @override
   visitVariableInitialization(js.VariableInitialization node) {
-    visit(node.leftHandSide);
+    visit(node.declaration);
     visit(node.value);
   }
 
diff --git a/pkg/compiler/lib/src/js/placeholder_safety.dart b/pkg/compiler/lib/src/js/placeholder_safety.dart
index 9f14b58..29fea71 100644
--- a/pkg/compiler/lib/src/js/placeholder_safety.dart
+++ b/pkg/compiler/lib/src/js/placeholder_safety.dart
@@ -192,6 +192,23 @@
   }
 
   @override
+  int visitVariableInitialization(js.VariableInitialization node) {
+    js.Expression left = node.declaration;
+    js.Expression right = node.value;
+
+    visit(left);
+    if (left is js.InterpolatedNode) {
+      // A bare interpolated expression should not be the LHS of an initialized
+      // variable declaration.
+      safe = false;
+    }
+    if (right != null) {
+      return visit(right);
+    }
+    return UNKNOWN_VALUE;
+  }
+
+  @override
   int visitCall(js.Call node) {
     // TODO(sra): Recognize JavaScript built-ins like
     // 'Object.prototype.hasOwnProperty.call'.
diff --git a/pkg/compiler/lib/src/js/rewrite_async.dart b/pkg/compiler/lib/src/js/rewrite_async.dart
index 803221c..0008046 100644
--- a/pkg/compiler/lib/src/js/rewrite_async.dart
+++ b/pkg/compiler/lib/src/js/rewrite_async.dart
@@ -2493,7 +2493,7 @@
   @override
   bool visitAssignment(js.Assignment node) {
     bool leftHandSide = visit(node.leftHandSide);
-    bool value = (node.value == null) ? false : visit(node.value);
+    bool value = visit(node.value);
     return leftHandSide || value;
   }
 
@@ -2877,7 +2877,9 @@
 
   @override
   bool visitVariableInitialization(js.VariableInitialization node) {
-    return visitAssignment(node);
+    bool leftHandSide = visit(node.declaration);
+    bool value = (node.value == null) ? false : visit(node.value);
+    return leftHandSide || value;
   }
 
   @override
diff --git a/pkg/compiler/lib/src/js/size_estimator.dart b/pkg/compiler/lib/src/js/size_estimator.dart
index 33a45ed..d081f4c0 100644
--- a/pkg/compiler/lib/src/js/size_estimator.dart
+++ b/pkg/compiler/lib/src/js/size_estimator.dart
@@ -556,7 +556,13 @@
 
   @override
   visitVariableInitialization(VariableInitialization initialization) {
-    visitAssignment(initialization);
+    visitNestedExpression(initialization.declaration, CALL,
+        newInForInit: inForInit, newAtStatementBegin: atStatementBegin);
+    if (initialization.value != null) {
+      out('=');
+      visitNestedExpression(initialization.value, ASSIGNMENT,
+          newInForInit: inForInit, newAtStatementBegin: false);
+    }
   }
 
   @override
diff --git a/pkg/compiler/lib/src/js_model/closure.dart b/pkg/compiler/lib/src/js_model/closure.dart
index f354388..7aa5677 100644
--- a/pkg/compiler/lib/src/js_model/closure.dart
+++ b/pkg/compiler/lib/src/js_model/closure.dart
@@ -170,6 +170,7 @@
 /// http://matt.might.net/articles/closure-conversion/.
 
 class ClosureDataBuilder {
+  final DiagnosticReporter _reporter;
   final JsToElementMap _elementMap;
   final AnnotationsData _annotationsData;
 
@@ -185,7 +186,7 @@
 
   final Map<MemberEntity, MemberEntity> _enclosingMembers = {};
 
-  ClosureDataBuilder(this._elementMap, this._annotationsData);
+  ClosureDataBuilder(this._reporter, this._elementMap, this._annotationsData);
 
   void _updateScopeBasedOnRtiNeed(KernelScopeInfo scope, ClosureRtiNeed rtiNeed,
       MemberEntity outermostEntity) {
@@ -323,7 +324,7 @@
       Map<MemberEntity, ClosureScopeModel> closureModels,
       ClosureRtiNeed rtiNeed,
       List<FunctionEntity> callMethods) {
-    closureModels.forEach((MemberEntity member, ClosureScopeModel model) {
+    void processModel(MemberEntity member, ClosureScopeModel model) {
       Map<ir.VariableDeclaration, JRecordField> allBoxedVariables =
           _elementMap.makeRecordContainer(model.scopeInfo, member);
       _scopeMap[member] = JsScopeInfo.from(
@@ -381,6 +382,12 @@
         }
         callMethods.add(closureClassInfo.callMethod);
       }
+    }
+
+    closureModels.forEach((MemberEntity member, ClosureScopeModel model) {
+      _reporter.withCurrentElement(member, () {
+        processModel(member, model);
+      });
     });
     return ClosureDataImpl(
         _elementMap,
diff --git a/pkg/compiler/lib/src/js_model/js_strategy.dart b/pkg/compiler/lib/src/js_model/js_strategy.dart
index c6f42f1..bfd0363 100644
--- a/pkg/compiler/lib/src/js_model/js_strategy.dart
+++ b/pkg/compiler/lib/src/js_model/js_strategy.dart
@@ -168,8 +168,8 @@
         strategy.elementMap,
         closedWorld.liveMemberUsage,
         closedWorld.annotationsData);
-    ClosureDataBuilder closureDataBuilder =
-        ClosureDataBuilder(_elementMap, closedWorld.annotationsData);
+    ClosureDataBuilder closureDataBuilder = ClosureDataBuilder(
+        _compiler.reporter, _elementMap, closedWorld.annotationsData);
     JsClosedWorldBuilder closedWorldBuilder = JsClosedWorldBuilder(_elementMap,
         closureDataBuilder, _compiler.options, _compiler.abstractValueStrategy);
     JClosedWorld jClosedWorld = closedWorldBuilder.convertClosedWorld(
diff --git a/pkg/compiler/lib/src/native/js.dart b/pkg/compiler/lib/src/native/js.dart
index 9c21348..295dd0b 100644
--- a/pkg/compiler/lib/src/native/js.dart
+++ b/pkg/compiler/lib/src/native/js.dart
@@ -213,6 +213,14 @@
   }
 
   @override
+  NativeThrowBehavior visitVariableInitialization(
+      js.VariableInitialization node) {
+    final value = node.value;
+    if (value == null) return NativeThrowBehavior.NEVER;
+    return visit(value);
+  }
+
+  @override
   NativeThrowBehavior visitCall(js.Call node) {
     js.Expression target = node.target;
     if (target is js.PropertyAccess && _isFirstInterpolatedProperty(target)) {
diff --git a/pkg/dartdev/lib/src/commands/run.dart b/pkg/dartdev/lib/src/commands/run.dart
index a74fa84..457f673 100644
--- a/pkg/dartdev/lib/src/commands/run.dart
+++ b/pkg/dartdev/lib/src/commands/run.dart
@@ -20,6 +20,7 @@
 import '../vm_interop_handler.dart';
 
 class RunCommand extends DartdevCommand {
+  static const bool isProductMode = bool.fromEnvironment("dart.vm.product");
   static const String cmdName = 'run';
 
   // kErrorExitCode, as defined in runtime/bin/error_exit.h
@@ -47,97 +48,103 @@
     // the list of flags in Options::ProcessVMDebuggingOptions in
     // runtime/bin/main_options.cc. Failure to do so will result in those VM
     // options being ignored.
-    argParser
-      ..addSeparator(
-        'Debugging options:',
-      )
-      ..addOption(
-        'observe',
-        help: 'The observe flag is a convenience flag used to run a program '
-            'with a set of common options useful for debugging.',
-        valueHelp: '[<port>[/<bind-address>]]',
-      )
-      ..addOption('launch-dds', hide: true, help: 'Launch DDS.')
-      ..addSeparator(
-        'Options implied by --observe are currently:',
-      )
-      ..addOption(
-        'enable-vm-service',
-        help: 'Enables the VM service and listens on the specified port for '
-            'connections (default port number is 8181, default bind address '
-            'is localhost).',
-        valueHelp: '[<port>[/<bind-address>]]',
-      )
-      ..addFlag(
-        'serve-devtools',
-        help: 'Serves an instance of the Dart DevTools debugger and profiler '
-            'via the VM service at <vm-service-uri>/devtools.',
-        defaultsTo: true,
-      )
-      ..addFlag(
-        'pause-isolates-on-exit',
-        help: 'Pause isolates on exit when '
-            'running with --enable-vm-service.',
-      )
-      ..addFlag(
-        'pause-isolates-on-unhandled-exceptions',
-        help: 'Pause isolates when an unhandled exception is encountered '
-            'when running with --enable-vm-service.',
-      )
-      ..addFlag(
-        'warn-on-pause-with-no-debugger',
-        help: 'Print a warning when an isolate pauses with no attached debugger'
-            ' when running with --enable-vm-service.',
-      )
-      ..addSeparator(
-        'Other debugging options:',
-      )
-      ..addFlag(
-        'pause-isolates-on-start',
-        help: 'Pause isolates on start when '
-            'running with --enable-vm-service.',
-      )
-      ..addFlag(
-        'enable-asserts',
-        help: 'Enable assert statements.',
-      )
-      ..addOption(
-        'verbosity',
-        help: 'Sets the verbosity level of the compilation.',
-        defaultsTo: Verbosity.defaultValue,
-        allowed: Verbosity.allowedValues,
-        allowedHelp: Verbosity.allowedValuesHelp,
-      );
+    argParser.addSeparator(
+      'Debugging options:',
+    );
+    if (!isProductMode) {
+      argParser
+        ..addOption(
+          'observe',
+          help: 'The observe flag is a convenience flag used to run a program '
+              'with a set of common options useful for debugging.',
+          valueHelp: '[<port>[/<bind-address>]]',
+        )
+        ..addOption('launch-dds', hide: true, help: 'Launch DDS.')
+        ..addSeparator(
+          'Options implied by --observe are currently:',
+        )
+        ..addOption(
+          'enable-vm-service',
+          help: 'Enables the VM service and listens on the specified port for '
+              'connections (default port number is 8181, default bind address '
+              'is localhost).',
+          valueHelp: '[<port>[/<bind-address>]]',
+        )
+        ..addFlag(
+          'serve-devtools',
+          help: 'Serves an instance of the Dart DevTools debugger and profiler '
+              'via the VM service at <vm-service-uri>/devtools.',
+          defaultsTo: true,
+        )
+        ..addFlag(
+          'pause-isolates-on-exit',
+          help: 'Pause isolates on exit when '
+              'running with --enable-vm-service.',
+        )
+        ..addFlag(
+          'pause-isolates-on-unhandled-exceptions',
+          help: 'Pause isolates when an unhandled exception is encountered '
+              'when running with --enable-vm-service.',
+        )
+        ..addFlag(
+          'warn-on-pause-with-no-debugger',
+          help:
+              'Print a warning when an isolate pauses with no attached debugger'
+              ' when running with --enable-vm-service.',
+        )
+        ..addSeparator(
+          'Other debugging options:',
+        )
+        ..addFlag(
+          'pause-isolates-on-start',
+          help: 'Pause isolates on start when '
+              'running with --enable-vm-service.',
+        )
+        ..addFlag(
+          'enable-asserts',
+          help: 'Enable assert statements.',
+        );
+    }
+    argParser.addOption(
+      'verbosity',
+      help: 'Sets the verbosity level of the compilation.',
+      defaultsTo: Verbosity.defaultValue,
+      allowed: Verbosity.allowedValues,
+      allowedHelp: Verbosity.allowedValuesHelp,
+    );
 
     if (verbose) {
       argParser.addSeparator(
         'Advanced options:',
       );
     }
+    argParser.addMultiOption(
+      'define',
+      abbr: 'D',
+      valueHelp: 'key=value',
+      help: 'Define an environment declaration.',
+    );
+    if (!isProductMode) {
+      argParser
+        ..addFlag(
+          'disable-service-auth-codes',
+          hide: !verbose,
+          negatable: false,
+          help: 'Disables the requirement for an authentication code to '
+              'communicate with the VM service. Authentication codes help '
+              'protect against CSRF attacks, so it is not recommended to '
+              'disable them unless behind a firewall on a secure device.',
+        )
+        ..addFlag(
+          'enable-service-port-fallback',
+          hide: !verbose,
+          negatable: false,
+          help: 'When the VM service is told to bind to a particular port, '
+              'fallback to 0 if it fails to bind instread of failing to '
+              'start.',
+        );
+    }
     argParser
-      ..addMultiOption(
-        'define',
-        abbr: 'D',
-        valueHelp: 'key=value',
-        help: 'Define an environment declaration.',
-      )
-      ..addFlag(
-        'disable-service-auth-codes',
-        hide: !verbose,
-        negatable: false,
-        help: 'Disables the requirement for an authentication code to '
-            'communicate with the VM service. Authentication codes help '
-            'protect against CSRF attacks, so it is not recommended to '
-            'disable them unless behind a firewall on a secure device.',
-      )
-      ..addFlag(
-        'enable-service-port-fallback',
-        hide: !verbose,
-        negatable: false,
-        help: 'When the VM service is told to bind to a particular port, '
-            'fallback to 0 if it fails to bind instread of failing to '
-            'start.',
-      )
       ..addOption(
         'namespace',
         hide: !verbose,
@@ -164,17 +171,22 @@
         hide: !verbose,
         negatable: false,
         help: 'Enables tracing of library and script loading.',
-      )
-      ..addFlag('dds',
-          hide: !verbose,
-          help: 'Use the Dart Development Service (DDS) for enhanced debugging '
-              'functionality. Note: Disabling DDS may break some functionality '
-              'in IDEs and other tooling.',
-          defaultsTo: true)
-      ..addFlag(
-        'debug-dds',
-        hide: true,
       );
+
+    if (!isProductMode) {
+      argParser
+        ..addFlag('dds',
+            hide: !verbose,
+            help:
+                'Use the Dart Development Service (DDS) for enhanced debugging '
+                'functionality. Note: Disabling DDS may break some functionality '
+                'in IDEs and other tooling.',
+            defaultsTo: true)
+        ..addFlag(
+          'debug-dds',
+          hide: true,
+        );
+    }
     addExperimentalFlags(argParser, verbose);
   }
 
@@ -191,40 +203,43 @@
       // The command line arguments after the command name.
       runArgs = argResults.rest.skip(1).toList();
     }
-    // --launch-dds is provided by the VM if the VM service is to be enabled. In
-    // that case, we need to launch DDS as well.
-    String launchDdsArg = argResults['launch-dds'];
-    String ddsHost = '';
-    String ddsPort = '';
 
-    bool launchDevTools = argResults['serve-devtools'];
-    bool launchDds = false;
-    if (launchDdsArg != null) {
-      launchDds = true;
-      final ddsUrl = launchDdsArg.split('\\:');
-      ddsHost = ddsUrl[0];
-      ddsPort = ddsUrl[1];
-    }
-    final bool debugDds = argResults['debug-dds'];
+    if (!isProductMode) {
+      // --launch-dds is provided by the VM if the VM service is to be enabled. In
+      // that case, we need to launch DDS as well.
+      String launchDdsArg = argResults['launch-dds'];
+      String ddsHost = '';
+      String ddsPort = '';
 
-    bool disableServiceAuthCodes = argResults['disable-service-auth-codes'];
+      bool launchDevTools = argResults['serve-devtools'];
+      bool launchDds = false;
+      if (launchDdsArg != null) {
+        launchDds = true;
+        final ddsUrl = launchDdsArg.split('\\:');
+        ddsHost = ddsUrl[0];
+        ddsPort = ddsUrl[1];
+      }
+      final bool debugDds = argResults['debug-dds'];
 
-    // If the user wants to start a debugging session we need to do some extra
-    // work and spawn a Dart Development Service (DDS) instance. DDS is a VM
-    // service intermediary which implements the VM service protocol and
-    // provides non-VM specific extensions (e.g., log caching, client
-    // synchronization).
-    _DebuggingSession debugSession;
-    if (launchDds) {
-      debugSession = _DebuggingSession();
-      if (!await debugSession.start(
-        ddsHost,
-        ddsPort,
-        disableServiceAuthCodes,
-        launchDevTools,
-        debugDds,
-      )) {
-        return errorExitCode;
+      bool disableServiceAuthCodes = argResults['disable-service-auth-codes'];
+
+      // If the user wants to start a debugging session we need to do some extra
+      // work and spawn a Dart Development Service (DDS) instance. DDS is a VM
+      // service intermediary which implements the VM service protocol and
+      // provides non-VM specific extensions (e.g., log caching, client
+      // synchronization).
+      _DebuggingSession debugSession;
+      if (launchDds) {
+        debugSession = _DebuggingSession();
+        if (!await debugSession.start(
+          ddsHost,
+          ddsPort,
+          disableServiceAuthCodes,
+          launchDevTools,
+          debugDds,
+        )) {
+          return errorExitCode;
+        }
       }
     }
 
diff --git a/pkg/dartdev/lib/src/templates/server_shelf.dart b/pkg/dartdev/lib/src/templates/server_shelf.dart
index 33dd442..ed6b730 100644
--- a/pkg/dartdev/lib/src/templates/server_shelf.dart
+++ b/pkg/dartdev/lib/src/templates/server_shelf.dart
@@ -125,7 +125,7 @@
 }
 
 Response _echoHandler(Request request) {
-  final message = request.params['message'];
+  final message = params(request, 'message');
   return Response.ok('$message\n');
 }
 
diff --git a/pkg/dartdev/test/commands/create_integration_test.dart b/pkg/dartdev/test/commands/create_integration_test.dart
index e6f2bf5..4856b47 100644
--- a/pkg/dartdev/test/commands/create_integration_test.dart
+++ b/pkg/dartdev/test/commands/create_integration_test.dart
@@ -2,13 +2,9 @@
 // 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:async';
-import 'dart:convert';
 import 'dart:io';
 
 import 'package:dartdev/src/commands/create.dart';
-import 'package:dartdev/src/templates.dart';
-import 'package:path/path.dart' as path;
 import 'package:test/test.dart';
 
 import '../utils.dart';
@@ -27,22 +23,21 @@
   // Create tests for each template.
   for (String templateId in CreateCommand.legalTemplateIds) {
     test(templateId, () async {
-      const projectName = 'template_project';
       p = project();
-      final templateGenerator = getGenerator(templateId);
 
       ProcessResult createResult = await p.run([
         'create',
         '--force',
         '--template',
         templateId,
-        projectName,
+        'template_project',
       ]);
       expect(createResult.exitCode, 0, reason: createResult.stderr);
 
       // Validate that the project analyzes cleanly.
+      // TODO: Should we use --fatal-infos here?
       ProcessResult analyzeResult =
-          await p.run(['analyze', '--fatal-infos', projectName]);
+          await p.run(['analyze'], workingDir: p.dir.path);
       expect(analyzeResult.exitCode, 0, reason: analyzeResult.stdout);
 
       // Validate that the code is well formatted.
@@ -51,86 +46,9 @@
         '--output',
         'none',
         '--set-exit-if-changed',
-        projectName,
+        'template_project',
       ]);
       expect(formatResult.exitCode, 0, reason: formatResult.stdout);
-
-      // Process the execution instructions provided by the template.
-      final runCommands = templateGenerator
-          .getInstallInstructions(
-            projectName,
-            projectName,
-          )
-          .split('\n')
-          // Remove directory change instructions.
-          .sublist(1)
-          .map((command) => command.trim())
-          .map((command) {
-        final commandParts = command.split(' ');
-        if (command.startsWith('dart ')) {
-          return commandParts.sublist(1);
-        }
-        return commandParts;
-      }).toList();
-
-      final isServerTemplate = templateGenerator.categories.contains('server');
-      final isWebTemplate = templateGenerator.categories.contains('web');
-      final workingDir = path.join(p.dirPath, projectName);
-
-      // Execute the templates run instructions.
-      for (int i = 0; i < runCommands.length; ++i) {
-        // The last command is always the command to execute the code generated
-        // by the template.
-        final isLastCommand = i == runCommands.length - 1;
-        final command = runCommands[i];
-        Process process;
-
-        if (isLastCommand && isWebTemplate) {
-          // The web template uses `webdev` to execute, not `dart`, so don't
-          // run the test through the project utility method.
-          process = await Process.start(
-            path.join(
-              p.pubCacheBinPath,
-              Platform.isWindows ? '${command.first}.bat' : command.first,
-            ),
-            command.sublist(1),
-            workingDirectory: workingDir,
-          );
-        } else {
-          process = await p.start(
-            command,
-            workingDir: workingDir,
-          );
-        }
-
-        if (isLastCommand && (isServerTemplate || isWebTemplate)) {
-          final completer = Completer<void>();
-          StreamSubscription sub;
-          // Listen for well-known output from specific templates to determine
-          // if they've executed correctly. These templates won't exit on their
-          // own, so we'll need to terminate the process once we've verified it
-          // runs correctly.
-          sub = process.stdout.transform(utf8.decoder).listen((e) {
-            if ((isServerTemplate && e.contains('Server listening on port')) ||
-                (isWebTemplate && e.contains('Succeeded after'))) {
-              sub.cancel();
-              process.kill();
-              completer.complete();
-            }
-          });
-          await completer.future;
-
-          // Since we had to terminate the process manually, we aren't certain
-          // as to what the exit code will be on all platforms (should be -15
-          // for POSIX systems), so we'll just wait for the process to exit
-          // here.
-          await process.exitCode;
-        } else {
-          // If the sample should exit on its own, it should always result in
-          // an exit code of 0.
-          expect(await process.exitCode, 0);
-        }
-      }
     });
   }
 }
diff --git a/pkg/dartdev/test/no_such_file_test.dart b/pkg/dartdev/test/no_such_file_test.dart
index bf4eaa3..549c059 100644
--- a/pkg/dartdev/test/no_such_file_test.dart
+++ b/pkg/dartdev/test/no_such_file_test.dart
@@ -32,7 +32,8 @@
     final result = await p.run(['--snapshot=abc', 'foo.dart']);
     expect(result.stderr, isNotEmpty);
     expect(result.stderr, contains("Error when reading 'foo.dart':"));
-    expect(result.stdout, isEmpty);
+    expect(result.stdout, isNotEmpty);
+    expect(result.stdout, contains("Info: Compiling with sound null safety\n"));
     expect(result.exitCode, 254);
   });
 }
diff --git a/pkg/dartdev/test/utils.dart b/pkg/dartdev/test/utils.dart
index 404b05e..8f8147a 100644
--- a/pkg/dartdev/test/utils.dart
+++ b/pkg/dartdev/test/utils.dart
@@ -39,10 +39,6 @@
 
   String get dirPath => dir.path;
 
-  String get pubCachePath => path.join(dirPath, 'pub_cache');
-
-  String get pubCacheBinPath => path.join(pubCachePath, 'bin');
-
   String get mainPath => path.join(dirPath, relativeFilePath);
 
   final String name;
@@ -117,10 +113,7 @@
           ...arguments,
         ],
         workingDirectory: workingDir ?? dir.path,
-        environment: {
-          if (logAnalytics) '_DARTDEV_LOG_ANALYTICS': 'true',
-          'PUB_CACHE': pubCachePath
-        });
+        environment: {if (logAnalytics) '_DARTDEV_LOG_ANALYTICS': 'true'});
     final stdoutContents = _process.stdout.transform(utf8.decoder).join();
     final stderrContents = _process.stderr.transform(utf8.decoder).join();
     final code = await _process.exitCode;
@@ -143,10 +136,7 @@
           ...arguments,
         ],
         workingDirectory: workingDir ?? dir.path,
-        environment: {
-          if (logAnalytics) '_DARTDEV_LOG_ANALYTICS': 'true',
-          'PUB_CACHE': pubCachePath,
-        })
+        environment: {if (logAnalytics) '_DARTDEV_LOG_ANALYTICS': 'true'})
       ..then((p) => _process = p);
   }
 
diff --git a/pkg/front_end/lib/src/api_unstable/dart2js.dart b/pkg/front_end/lib/src/api_unstable/dart2js.dart
index 18d185d..d008fd6 100644
--- a/pkg/front_end/lib/src/api_unstable/dart2js.dart
+++ b/pkg/front_end/lib/src/api_unstable/dart2js.dart
@@ -228,9 +228,11 @@
 // dart2js.
 // TODO(sigmund): delete after all constant evaluation is done in the CFE, as
 // this data will no longer be needed on the dart2js side.
-Iterable<String> getSupportedLibraryNames(
-    Uri librariesSpecificationUri, String json, String target) {
-  return LibrariesSpecification.parse(librariesSpecificationUri, json)
+Future<Iterable<String>> getSupportedLibraryNames(
+    Uri librariesSpecificationUri, String target,
+    {required Future<String> readJson(Uri uri)}) async {
+  return (await LibrariesSpecification.load(
+          librariesSpecificationUri, readJson))
       .specificationFor(target)
       .allLibraries
       .where((l) => l.isSupported)
diff --git a/pkg/front_end/lib/src/base/processed_options.dart b/pkg/front_end/lib/src/base/processed_options.dart
index 65088a1..db25cec 100644
--- a/pkg/front_end/lib/src/base/processed_options.dart
+++ b/pkg/front_end/lib/src/base/processed_options.dart
@@ -533,12 +533,10 @@
       return new TargetLibrariesSpecification(name);
     }
 
-    String json = await fileSystem
-        .entityForUri(librariesSpecificationUri!)
-        .readAsString();
     try {
-      LibrariesSpecification spec =
-          await LibrariesSpecification.parse(librariesSpecificationUri!, json);
+      LibrariesSpecification spec = await LibrariesSpecification.load(
+          librariesSpecificationUri!,
+          (Uri uri) => fileSystem.entityForUri(uri).readAsString());
       return spec.specificationFor(name);
     } on LibrariesSpecificationException catch (e) {
       reportWithoutLocation(
diff --git a/pkg/front_end/test/spell_checking_list_code.txt b/pkg/front_end/test/spell_checking_list_code.txt
index 8d0de2f..613e0b7 100644
--- a/pkg/front_end/test/spell_checking_list_code.txt
+++ b/pkg/front_end/test/spell_checking_list_code.txt
@@ -45,6 +45,7 @@
 ansi
 answering
 anyone
+aot
 ap
 api
 apis
@@ -374,6 +375,7 @@
 dmitryas
 doc
 docs
+doesn\'t
 dom
 dont
 doubles
diff --git a/pkg/front_end/testcases/general/nested_lib_spec/common_lib.dart b/pkg/front_end/testcases/general/nested_lib_spec/common_lib.dart
new file mode 100644
index 0000000..a4ce2de
--- /dev/null
+++ b/pkg/front_end/testcases/general/nested_lib_spec/common_lib.dart
@@ -0,0 +1,5 @@
+// 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.
+
+class Common {}
diff --git a/pkg/front_end/testcases/general/nested_lib_spec/extra_lib.dart b/pkg/front_end/testcases/general/nested_lib_spec/extra_lib.dart
new file mode 100644
index 0000000..77f761f
--- /dev/null
+++ b/pkg/front_end/testcases/general/nested_lib_spec/extra_lib.dart
@@ -0,0 +1,5 @@
+// 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.
+
+class Extra {}
diff --git a/pkg/front_end/testcases/general/nested_lib_spec/extra_libraries.json b/pkg/front_end/testcases/general/nested_lib_spec/extra_libraries.json
new file mode 100644
index 0000000..4ef762a
--- /dev/null
+++ b/pkg/front_end/testcases/general/nested_lib_spec/extra_libraries.json
@@ -0,0 +1,18 @@
+{
+  "_none": {
+    "include": [
+      {
+        "path": "subfolder/sub_libraries.json",
+        "target": "subtarget"
+      }
+    ],
+    "libraries": {
+      "extra": {
+        "patches": [
+          "extra_patch_lib.dart"
+        ],
+        "uri": "extra_lib.dart"
+      }
+    }
+  }
+}
diff --git a/pkg/front_end/testcases/general/nested_lib_spec/extra_patch_lib.dart b/pkg/front_end/testcases/general/nested_lib_spec/extra_patch_lib.dart
new file mode 100644
index 0000000..71d7fc2
--- /dev/null
+++ b/pkg/front_end/testcases/general/nested_lib_spec/extra_patch_lib.dart
@@ -0,0 +1,9 @@
+// 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.
+
+// ignore: import_internal_library
+import 'dart:_internal';
+
+@patch
+class Extra {}
diff --git a/pkg/front_end/testcases/general/nested_lib_spec/libraries.json b/pkg/front_end/testcases/general/nested_lib_spec/libraries.json
new file mode 100644
index 0000000..14705fe
--- /dev/null
+++ b/pkg/front_end/testcases/general/nested_lib_spec/libraries.json
@@ -0,0 +1,28 @@
+{
+  "none": {
+    "include": [
+      {
+        "path": "extra_libraries.json",
+        "target": "_none"
+      },
+      {
+        "target": "common"
+      }
+    ],
+    "libraries": {
+      "test": {
+        "patches": [
+          "patch_lib.dart"
+        ],
+        "uri": "origin_lib.dart"
+      }
+    }
+  },
+  "common": {
+    "libraries": {
+      "common": {
+        "uri": "common_lib.dart"
+      }
+    }
+  }
+}
diff --git a/pkg/front_end/testcases/general/nested_lib_spec/main.dart b/pkg/front_end/testcases/general/nested_lib_spec/main.dart
new file mode 100644
index 0000000..67e18ef
--- /dev/null
+++ b/pkg/front_end/testcases/general/nested_lib_spec/main.dart
@@ -0,0 +1,21 @@
+// 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:test';
+import 'dart:extra';
+import 'dart:sub';
+import 'dart:sub2';
+import 'dart:super1';
+import 'dart:super2';
+import 'dart:common';
+
+main() {
+  new Class();
+  new Extra();
+  new Sub();
+  new Sub2();
+  new Super1();
+  new Super2();
+  new Common();
+}
diff --git a/pkg/front_end/testcases/general/nested_lib_spec/main.dart.textual_outline.expect b/pkg/front_end/testcases/general/nested_lib_spec/main.dart.textual_outline.expect
new file mode 100644
index 0000000..c544d3d
--- /dev/null
+++ b/pkg/front_end/testcases/general/nested_lib_spec/main.dart.textual_outline.expect
@@ -0,0 +1,9 @@
+import 'dart:test';
+import 'dart:extra';
+import 'dart:sub';
+import 'dart:sub2';
+import 'dart:super1';
+import 'dart:super2';
+import 'dart:common';
+
+main() {}
diff --git a/pkg/front_end/testcases/general/nested_lib_spec/main.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/general/nested_lib_spec/main.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..033e3d1
--- /dev/null
+++ b/pkg/front_end/testcases/general/nested_lib_spec/main.dart.textual_outline_modelled.expect
@@ -0,0 +1,9 @@
+import 'dart:common';
+import 'dart:extra';
+import 'dart:sub';
+import 'dart:sub2';
+import 'dart:super1';
+import 'dart:super2';
+import 'dart:test';
+
+main() {}
diff --git a/pkg/front_end/testcases/general/nested_lib_spec/main.dart.weak.expect b/pkg/front_end/testcases/general/nested_lib_spec/main.dart.weak.expect
new file mode 100644
index 0000000..bbfc87a
--- /dev/null
+++ b/pkg/front_end/testcases/general/nested_lib_spec/main.dart.weak.expect
@@ -0,0 +1,109 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:test" as test;
+import "dart:extra" as ext;
+import "dart:sub" as sub;
+import "dart:sub2" as sub2;
+import "dart:super1" as sup;
+import "dart:super2" as sup2;
+import "dart:common" as com;
+
+import "dart:test";
+import "dart:extra";
+import "dart:sub";
+import "dart:sub2";
+import "dart:super1";
+import "dart:super2";
+import "dart:common";
+
+static method main() → dynamic {
+  new test::Class::•();
+  new ext::Extra::•();
+  new sub::Sub::•();
+  new sub2::Sub2::•();
+  new sup::Super1::•();
+  new sup2::Super2::•();
+  new com::Common::•();
+}
+
+library /*isNonNullableByDefault*/;
+import self as test;
+import "dart:_internal" as _in;
+import "dart:core" as core;
+
+import "dart:_internal";
+
+@#C1
+class Class extends core::Object {
+  synthetic constructor •() → test::Class
+    : super core::Object::•()
+    ;
+}
+
+library /*isNonNullableByDefault*/;
+import self as ext;
+import "dart:_internal" as _in;
+import "dart:core" as core;
+
+import "dart:_internal";
+
+@#C1
+class Extra extends core::Object {
+  synthetic constructor •() → ext::Extra
+    : super core::Object::•()
+    ;
+}
+
+library /*isNonNullableByDefault*/;
+import self as sub;
+import "dart:core" as core;
+
+class Sub extends core::Object {
+  synthetic constructor •() → sub::Sub
+    : super core::Object::•()
+    ;
+}
+
+library /*isNonNullableByDefault*/;
+import self as sub2;
+import "dart:core" as core;
+
+class Sub2 extends core::Object {
+  synthetic constructor •() → sub2::Sub2
+    : super core::Object::•()
+    ;
+}
+
+library /*isNonNullableByDefault*/;
+import self as sup;
+import "dart:core" as core;
+
+class Super1 extends core::Object {
+  synthetic constructor •() → sup::Super1
+    : super core::Object::•()
+    ;
+}
+
+library /*isNonNullableByDefault*/;
+import self as sup2;
+import "dart:core" as core;
+
+class Super2 extends core::Object {
+  synthetic constructor •() → sup2::Super2
+    : super core::Object::•()
+    ;
+}
+
+library /*isNonNullableByDefault*/;
+import self as com;
+import "dart:core" as core;
+
+class Common extends core::Object {
+  synthetic constructor •() → com::Common
+    : super core::Object::•()
+    ;
+}
+
+constants  {
+  #C1 = _in::_Patch {}
+}
diff --git a/pkg/front_end/testcases/general/nested_lib_spec/main.dart.weak.modular.expect b/pkg/front_end/testcases/general/nested_lib_spec/main.dart.weak.modular.expect
new file mode 100644
index 0000000..bbfc87a
--- /dev/null
+++ b/pkg/front_end/testcases/general/nested_lib_spec/main.dart.weak.modular.expect
@@ -0,0 +1,109 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:test" as test;
+import "dart:extra" as ext;
+import "dart:sub" as sub;
+import "dart:sub2" as sub2;
+import "dart:super1" as sup;
+import "dart:super2" as sup2;
+import "dart:common" as com;
+
+import "dart:test";
+import "dart:extra";
+import "dart:sub";
+import "dart:sub2";
+import "dart:super1";
+import "dart:super2";
+import "dart:common";
+
+static method main() → dynamic {
+  new test::Class::•();
+  new ext::Extra::•();
+  new sub::Sub::•();
+  new sub2::Sub2::•();
+  new sup::Super1::•();
+  new sup2::Super2::•();
+  new com::Common::•();
+}
+
+library /*isNonNullableByDefault*/;
+import self as test;
+import "dart:_internal" as _in;
+import "dart:core" as core;
+
+import "dart:_internal";
+
+@#C1
+class Class extends core::Object {
+  synthetic constructor •() → test::Class
+    : super core::Object::•()
+    ;
+}
+
+library /*isNonNullableByDefault*/;
+import self as ext;
+import "dart:_internal" as _in;
+import "dart:core" as core;
+
+import "dart:_internal";
+
+@#C1
+class Extra extends core::Object {
+  synthetic constructor •() → ext::Extra
+    : super core::Object::•()
+    ;
+}
+
+library /*isNonNullableByDefault*/;
+import self as sub;
+import "dart:core" as core;
+
+class Sub extends core::Object {
+  synthetic constructor •() → sub::Sub
+    : super core::Object::•()
+    ;
+}
+
+library /*isNonNullableByDefault*/;
+import self as sub2;
+import "dart:core" as core;
+
+class Sub2 extends core::Object {
+  synthetic constructor •() → sub2::Sub2
+    : super core::Object::•()
+    ;
+}
+
+library /*isNonNullableByDefault*/;
+import self as sup;
+import "dart:core" as core;
+
+class Super1 extends core::Object {
+  synthetic constructor •() → sup::Super1
+    : super core::Object::•()
+    ;
+}
+
+library /*isNonNullableByDefault*/;
+import self as sup2;
+import "dart:core" as core;
+
+class Super2 extends core::Object {
+  synthetic constructor •() → sup2::Super2
+    : super core::Object::•()
+    ;
+}
+
+library /*isNonNullableByDefault*/;
+import self as com;
+import "dart:core" as core;
+
+class Common extends core::Object {
+  synthetic constructor •() → com::Common
+    : super core::Object::•()
+    ;
+}
+
+constants  {
+  #C1 = _in::_Patch {}
+}
diff --git a/pkg/front_end/testcases/general/nested_lib_spec/main.dart.weak.outline.expect b/pkg/front_end/testcases/general/nested_lib_spec/main.dart.weak.outline.expect
new file mode 100644
index 0000000..9c88621
--- /dev/null
+++ b/pkg/front_end/testcases/general/nested_lib_spec/main.dart.weak.outline.expect
@@ -0,0 +1,90 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+
+import "dart:test";
+import "dart:extra";
+import "dart:sub";
+import "dart:sub2";
+import "dart:super1";
+import "dart:super2";
+import "dart:common";
+
+static method main() → dynamic
+  ;
+
+library /*isNonNullableByDefault*/;
+import self as self2;
+import "dart:_internal" as _in;
+import "dart:core" as core;
+
+import "dart:_internal";
+
+@_in::patch
+class Class extends core::Object {
+  synthetic constructor •() → self2::Class
+    ;
+}
+
+library /*isNonNullableByDefault*/;
+import self as self3;
+import "dart:_internal" as _in;
+import "dart:core" as core;
+
+import "dart:_internal";
+
+@_in::patch
+class Extra extends core::Object {
+  synthetic constructor •() → self3::Extra
+    ;
+}
+
+library /*isNonNullableByDefault*/;
+import self as self4;
+import "dart:core" as core;
+
+class Sub extends core::Object {
+  synthetic constructor •() → self4::Sub
+    ;
+}
+
+library /*isNonNullableByDefault*/;
+import self as self5;
+import "dart:core" as core;
+
+class Sub2 extends core::Object {
+  synthetic constructor •() → self5::Sub2
+    ;
+}
+
+library /*isNonNullableByDefault*/;
+import self as self6;
+import "dart:core" as core;
+
+class Super1 extends core::Object {
+  synthetic constructor •() → self6::Super1
+    ;
+}
+
+library /*isNonNullableByDefault*/;
+import self as self7;
+import "dart:core" as core;
+
+class Super2 extends core::Object {
+  synthetic constructor •() → self7::Super2
+    ;
+}
+
+library /*isNonNullableByDefault*/;
+import self as self8;
+import "dart:core" as core;
+
+class Common extends core::Object {
+  synthetic constructor •() → self8::Common
+    ;
+}
+
+
+Extra constant evaluation status:
+Evaluated: StaticGet @ (unknown position in org-dartlang-testcase:///origin_lib.dart) -> InstanceConstant(const _Patch{})
+Evaluated: StaticGet @ (unknown position in org-dartlang-testcase:///extra_lib.dart) -> InstanceConstant(const _Patch{})
+Extra constant evaluation: evaluated: 2, effectively constant: 2
diff --git a/pkg/front_end/testcases/general/nested_lib_spec/main.dart.weak.transformed.expect b/pkg/front_end/testcases/general/nested_lib_spec/main.dart.weak.transformed.expect
new file mode 100644
index 0000000..bbfc87a
--- /dev/null
+++ b/pkg/front_end/testcases/general/nested_lib_spec/main.dart.weak.transformed.expect
@@ -0,0 +1,109 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:test" as test;
+import "dart:extra" as ext;
+import "dart:sub" as sub;
+import "dart:sub2" as sub2;
+import "dart:super1" as sup;
+import "dart:super2" as sup2;
+import "dart:common" as com;
+
+import "dart:test";
+import "dart:extra";
+import "dart:sub";
+import "dart:sub2";
+import "dart:super1";
+import "dart:super2";
+import "dart:common";
+
+static method main() → dynamic {
+  new test::Class::•();
+  new ext::Extra::•();
+  new sub::Sub::•();
+  new sub2::Sub2::•();
+  new sup::Super1::•();
+  new sup2::Super2::•();
+  new com::Common::•();
+}
+
+library /*isNonNullableByDefault*/;
+import self as test;
+import "dart:_internal" as _in;
+import "dart:core" as core;
+
+import "dart:_internal";
+
+@#C1
+class Class extends core::Object {
+  synthetic constructor •() → test::Class
+    : super core::Object::•()
+    ;
+}
+
+library /*isNonNullableByDefault*/;
+import self as ext;
+import "dart:_internal" as _in;
+import "dart:core" as core;
+
+import "dart:_internal";
+
+@#C1
+class Extra extends core::Object {
+  synthetic constructor •() → ext::Extra
+    : super core::Object::•()
+    ;
+}
+
+library /*isNonNullableByDefault*/;
+import self as sub;
+import "dart:core" as core;
+
+class Sub extends core::Object {
+  synthetic constructor •() → sub::Sub
+    : super core::Object::•()
+    ;
+}
+
+library /*isNonNullableByDefault*/;
+import self as sub2;
+import "dart:core" as core;
+
+class Sub2 extends core::Object {
+  synthetic constructor •() → sub2::Sub2
+    : super core::Object::•()
+    ;
+}
+
+library /*isNonNullableByDefault*/;
+import self as sup;
+import "dart:core" as core;
+
+class Super1 extends core::Object {
+  synthetic constructor •() → sup::Super1
+    : super core::Object::•()
+    ;
+}
+
+library /*isNonNullableByDefault*/;
+import self as sup2;
+import "dart:core" as core;
+
+class Super2 extends core::Object {
+  synthetic constructor •() → sup2::Super2
+    : super core::Object::•()
+    ;
+}
+
+library /*isNonNullableByDefault*/;
+import self as com;
+import "dart:core" as core;
+
+class Common extends core::Object {
+  synthetic constructor •() → com::Common
+    : super core::Object::•()
+    ;
+}
+
+constants  {
+  #C1 = _in::_Patch {}
+}
diff --git a/pkg/front_end/testcases/general/nested_lib_spec/origin_lib.dart b/pkg/front_end/testcases/general/nested_lib_spec/origin_lib.dart
new file mode 100644
index 0000000..6d966e0
--- /dev/null
+++ b/pkg/front_end/testcases/general/nested_lib_spec/origin_lib.dart
@@ -0,0 +1,5 @@
+// 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.
+
+class Class {}
diff --git a/pkg/front_end/testcases/general/nested_lib_spec/patch_lib.dart b/pkg/front_end/testcases/general/nested_lib_spec/patch_lib.dart
new file mode 100644
index 0000000..c134e75
--- /dev/null
+++ b/pkg/front_end/testcases/general/nested_lib_spec/patch_lib.dart
@@ -0,0 +1,9 @@
+// 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.
+
+// ignore: import_internal_library
+import 'dart:_internal';
+
+@patch
+class Class {}
diff --git a/pkg/front_end/testcases/general/nested_lib_spec/sub2_lib.dart b/pkg/front_end/testcases/general/nested_lib_spec/sub2_lib.dart
new file mode 100644
index 0000000..5a1f9b0
--- /dev/null
+++ b/pkg/front_end/testcases/general/nested_lib_spec/sub2_lib.dart
@@ -0,0 +1,5 @@
+// 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.
+
+class Sub2 {}
diff --git a/pkg/front_end/testcases/general/nested_lib_spec/subfolder/sub_lib.dart b/pkg/front_end/testcases/general/nested_lib_spec/subfolder/sub_lib.dart
new file mode 100644
index 0000000..2e54c8c
--- /dev/null
+++ b/pkg/front_end/testcases/general/nested_lib_spec/subfolder/sub_lib.dart
@@ -0,0 +1,5 @@
+// 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.
+
+class Sub {}
diff --git a/pkg/front_end/testcases/general/nested_lib_spec/subfolder/sub_libraries.json b/pkg/front_end/testcases/general/nested_lib_spec/subfolder/sub_libraries.json
new file mode 100644
index 0000000..ca8782a
--- /dev/null
+++ b/pkg/front_end/testcases/general/nested_lib_spec/subfolder/sub_libraries.json
@@ -0,0 +1,21 @@
+{
+  "subtarget": {
+    "include": [
+      {
+        "path": "../super1_libraries.json",
+        "target": "none"
+      },
+      { "path": "../../nested_lib_spec/super2_libraries.json",
+        "target": "none"
+      }
+    ],
+    "libraries": {
+      "sub": {
+        "uri": "sub_lib.dart"
+      },
+      "sub2": {
+        "uri": "../sub2_lib.dart"
+      }
+    }
+  }
+}
diff --git a/pkg/front_end/testcases/general/nested_lib_spec/subfolder/super2_lib.dart b/pkg/front_end/testcases/general/nested_lib_spec/subfolder/super2_lib.dart
new file mode 100644
index 0000000..9ac3219
--- /dev/null
+++ b/pkg/front_end/testcases/general/nested_lib_spec/subfolder/super2_lib.dart
@@ -0,0 +1,5 @@
+// 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.
+
+class Super2 {}
diff --git a/pkg/front_end/testcases/general/nested_lib_spec/super1_lib.dart b/pkg/front_end/testcases/general/nested_lib_spec/super1_lib.dart
new file mode 100644
index 0000000..b7b4486
--- /dev/null
+++ b/pkg/front_end/testcases/general/nested_lib_spec/super1_lib.dart
@@ -0,0 +1,5 @@
+// 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.
+
+class Super1 {}
diff --git a/pkg/front_end/testcases/general/nested_lib_spec/super1_libraries.json b/pkg/front_end/testcases/general/nested_lib_spec/super1_libraries.json
new file mode 100644
index 0000000..28bd7f2
--- /dev/null
+++ b/pkg/front_end/testcases/general/nested_lib_spec/super1_libraries.json
@@ -0,0 +1,9 @@
+{
+  "none": {
+    "libraries": {
+      "super1": {
+        "uri": "super1_lib.dart"
+      }
+    }
+  }
+}
diff --git a/pkg/front_end/testcases/general/nested_lib_spec/super2_libraries.json b/pkg/front_end/testcases/general/nested_lib_spec/super2_libraries.json
new file mode 100644
index 0000000..f89a448
--- /dev/null
+++ b/pkg/front_end/testcases/general/nested_lib_spec/super2_libraries.json
@@ -0,0 +1,9 @@
+{
+  "none": {
+    "libraries": {
+      "super2": {
+        "uri": "subfolder/super2_lib.dart"
+      }
+    }
+  }
+}
diff --git a/pkg/js_ast/lib/src/equivalence_visitor.dart b/pkg/js_ast/lib/src/equivalence_visitor.dart
index 8068319..b1a150b 100644
--- a/pkg/js_ast/lib/src/equivalence_visitor.dart
+++ b/pkg/js_ast/lib/src/equivalence_visitor.dart
@@ -340,8 +340,6 @@
     if (arg is! VariableInitialization) return failAt(node, arg);
     VariableInitialization other = arg;
     return testNodes(node.declaration, other.declaration) &&
-        testNodes(node.leftHandSide, other.leftHandSide) &&
-        testValues(node, node.op, other, other.op) &&
         testNodes(node.value, other.value);
   }
 
diff --git a/pkg/js_ast/lib/src/nodes.dart b/pkg/js_ast/lib/src/nodes.dart
index 56a2b40..7c62eab 100644
--- a/pkg/js_ast/lib/src/nodes.dart
+++ b/pkg/js_ast/lib/src/nodes.dart
@@ -126,13 +126,8 @@
   T visitVariableDeclarationList(VariableDeclarationList node) =>
       visitExpression(node);
   T visitAssignment(Assignment node) => visitExpression(node);
-  T visitVariableInitialization(VariableInitialization node) {
-    if (node.value != null) {
-      return visitAssignment(node);
-    } else {
-      return visitExpression(node);
-    }
-  }
+  T visitVariableInitialization(VariableInitialization node) =>
+      visitExpression(node);
 
   T visitConditional(Conditional node) => visitExpression(node);
   T visitNew(New node) => visitExpression(node);
@@ -338,13 +333,8 @@
   R visitVariableDeclarationList(VariableDeclarationList node, A arg) =>
       visitExpression(node, arg);
   R visitAssignment(Assignment node, A arg) => visitExpression(node, arg);
-  R visitVariableInitialization(VariableInitialization node, A arg) {
-    if (node.value != null) {
-      return visitAssignment(node, arg);
-    } else {
-      return visitExpression(node, arg);
-    }
-  }
+  R visitVariableInitialization(VariableInitialization node, A arg) =>
+      visitExpression(node, arg);
 
   R visitConditional(Conditional node, A arg) => visitExpression(node, arg);
   R visitNew(New node, A arg) => visitExpression(node, arg);
@@ -1162,12 +1152,13 @@
 class Assignment extends Expression {
   final Expression leftHandSide;
   final String op; // Null, if the assignment is not compound.
-  final Expression value; // May be null, for [VariableInitialization]s.
+  final Expression value;
 
   Assignment(leftHandSide, value) : this.compound(leftHandSide, null, value);
 
   // If `this.op == null` this will be a non-compound assignment.
-  Assignment.compound(this.leftHandSide, this.op, this.value);
+  Assignment.compound(this.leftHandSide, this.op, this.value)
+      : assert(value != null);
 
   int get precedenceLevel => ASSIGNMENT;
 
@@ -1180,23 +1171,26 @@
 
   void visitChildren<T>(NodeVisitor<T> visitor) {
     leftHandSide.accept(visitor);
-    if (value != null) value.accept(visitor);
+    value.accept(visitor);
   }
 
   void visitChildren1<R, A>(NodeVisitor1<R, A> visitor, A arg) {
     leftHandSide.accept1(visitor, arg);
-    if (value != null) value.accept1(visitor, arg);
+    value.accept1(visitor, arg);
   }
 
   Assignment _clone() => Assignment.compound(leftHandSide, op, value);
 }
 
-class VariableInitialization extends Assignment {
-  /// [value] may be null.
-  VariableInitialization(Declaration declaration, Expression value)
-      : super(declaration, value);
+class VariableInitialization extends Expression {
+  // TODO(sra): Can [VariableInitialization] be a non-expression?
 
-  Declaration get declaration => leftHandSide;
+  final Declaration declaration;
+  final Expression value; // [value] may be null.
+
+  VariableInitialization(this.declaration, this.value);
+
+  int get precedenceLevel => ASSIGNMENT;
 
   T accept<T>(NodeVisitor<T> visitor) =>
       visitor.visitVariableInitialization(this);
@@ -1204,6 +1198,16 @@
   R accept1<R, A>(NodeVisitor1<R, A> visitor, A arg) =>
       visitor.visitVariableInitialization(this, arg);
 
+  void visitChildren<T>(NodeVisitor<T> visitor) {
+    declaration.accept(visitor);
+    value?.accept(visitor);
+  }
+
+  void visitChildren1<R, A>(NodeVisitor1<R, A> visitor, A arg) {
+    declaration.accept1(visitor, arg);
+    value?.accept1(visitor, arg);
+  }
+
   VariableInitialization _clone() => VariableInitialization(declaration, value);
 }
 
diff --git a/pkg/js_ast/lib/src/printer.dart b/pkg/js_ast/lib/src/printer.dart
index d5eb576..562107f 100644
--- a/pkg/js_ast/lib/src/printer.dart
+++ b/pkg/js_ast/lib/src/printer.dart
@@ -840,7 +840,15 @@
 
   @override
   visitVariableInitialization(VariableInitialization initialization) {
-    visitAssignment(initialization);
+    visitNestedExpression(initialization.declaration, CALL,
+        newInForInit: inForInit, newAtStatementBegin: atStatementBegin);
+    if (initialization.value != null) {
+      spaceOut();
+      out("=");
+      spaceOut();
+      visitNestedExpression(initialization.value, ASSIGNMENT,
+          newInForInit: inForInit, newAtStatementBegin: false);
+    }
   }
 
   @override
diff --git a/runtime/bin/dfe.cc b/runtime/bin/dfe.cc
index 701967b..b29c8c1 100644
--- a/runtime/bin/dfe.cc
+++ b/runtime/bin/dfe.cc
@@ -194,6 +194,21 @@
                               package_config, verbosity());
 }
 
+Dart_KernelCompilationResult DFE::CompileScriptWithGivenNullsafety(
+    const char* script_uri,
+    const char* package_config,
+    bool snapshot,
+    bool null_safety) {
+  // TODO(aam): When Frontend is ready, VM should be passing vm_outline.dill
+  // instead of vm_platform.dill to Frontend for compilation.
+  PathSanitizer path_sanitizer(script_uri);
+  const char* sanitized_uri = path_sanitizer.sanitized_uri();
+
+  return Dart_CompileToKernelWithGivenNullsafety(
+      sanitized_uri, platform_strong_dill, platform_strong_dill_size, snapshot,
+      package_config, null_safety, verbosity());
+}
+
 void DFE::CompileAndReadScript(const char* script_uri,
                                uint8_t** kernel_buffer,
                                intptr_t* kernel_buffer_size,
diff --git a/runtime/bin/dfe.h b/runtime/bin/dfe.h
index 038bca7..eb18df6 100644
--- a/runtime/bin/dfe.h
+++ b/runtime/bin/dfe.h
@@ -72,6 +72,19 @@
                                              const char* package_config,
                                              bool snapshot);
 
+  // Compiles specified script.
+  // Returns result from compiling the script.
+  //
+  // `snapshot` is used by the frontend to determine if compilation
+  // related information should be printed to console (e.g., null safety mode).
+  // `null_safety` specifies compilation mode, which is normally
+  // retrieved either from vm flags or from vm isolate group.
+  Dart_KernelCompilationResult CompileScriptWithGivenNullsafety(
+      const char* script_uri,
+      const char* package_config,
+      bool snapshot,
+      bool null_safety);
+
   // Compiles specified script and reads the resulting kernel file.
   // If the compilation is successful, returns a valid in memory kernel
   // representation of the script, NULL otherwise
diff --git a/runtime/bin/main.cc b/runtime/bin/main.cc
index d03555a..cf76d5f 100644
--- a/runtime/bin/main.cc
+++ b/runtime/bin/main.cc
@@ -96,7 +96,7 @@
     SAVE_ERROR_AND_EXIT(result);                                               \
   }
 
-static void WriteDepsFile(Dart_Isolate isolate) {
+static void WriteDepsFile() {
   if (Options::depfile() == NULL) {
     return;
   }
@@ -142,7 +142,7 @@
     if (Options::gen_snapshot_kind() == kAppJIT) {
       Snapshot::GenerateAppJIT(Options::snapshot_filename());
     }
-    WriteDepsFile(main_isolate);
+    WriteDepsFile();
   }
 }
 
@@ -937,6 +937,20 @@
     ErrorExit(exit_code, "%s\n", Dart_GetError(result));                       \
   }
 
+static void CompileAndSaveKernel(const char* script_name,
+                                 const char* package_config_override,
+                                 CommandLineOptions* dart_options) {
+  if (vm_run_app_snapshot) {
+    Syslog::PrintErr("Cannot create a script snapshot from an app snapshot.\n");
+    // The snapshot would contain references to the app snapshot instead of
+    // the core snapshot.
+    Platform::Exit(kErrorExitCode);
+  }
+  Snapshot::GenerateKernel(Options::snapshot_filename(), script_name,
+                           package_config_override);
+  WriteDepsFile();
+}
+
 void RunMainIsolate(const char* script_name,
                     const char* package_config_override,
                     CommandLineOptions* dart_options) {
@@ -1001,71 +1015,59 @@
 
   Dart_EnterScope();
 
-  auto isolate_group_data =
-      reinterpret_cast<IsolateGroupData*>(Dart_IsolateGroupData(isolate));
-  if (Options::gen_snapshot_kind() == kKernel) {
-    if (vm_run_app_snapshot) {
-      Syslog::PrintErr(
-          "Cannot create a script snapshot from an app snapshot.\n");
-      // The snapshot would contain references to the app snapshot instead of
-      // the core snapshot.
-      Platform::Exit(kErrorExitCode);
-    }
-    Snapshot::GenerateKernel(Options::snapshot_filename(), script_name,
-                             isolate_group_data->resolved_packages_config());
-  } else {
-    // Lookup the library of the root script.
-    Dart_Handle root_lib = Dart_RootLibrary();
+  // Kernel snapshots should have been handled before reaching this point.
+  ASSERT(Options::gen_snapshot_kind() != kKernel);
+  // Lookup the library of the root script.
+  Dart_Handle root_lib = Dart_RootLibrary();
 
 #if !defined(DART_PRECOMPILED_RUNTIME)
-    if (Options::compile_all()) {
-      result = Dart_CompileAll();
-      CHECK_RESULT(result);
-    }
-#endif  // !defined(DART_PRECOMPILED_RUNTIME)
-
-    if (Dart_IsNull(root_lib)) {
-      ErrorExit(kErrorExitCode, "Unable to find root library for '%s'\n",
-                script_name);
-    }
-
-    // Create a closure for the main entry point which is in the exported
-    // namespace of the root library or invoke a getter of the same name
-    // in the exported namespace and return the resulting closure.
-    Dart_Handle main_closure =
-        Dart_GetField(root_lib, Dart_NewStringFromCString("main"));
-    CHECK_RESULT(main_closure);
-    if (!Dart_IsClosure(main_closure)) {
-      ErrorExit(kErrorExitCode, "Unable to find 'main' in root library '%s'\n",
-                script_name);
-    }
-
-    // Call _startIsolate in the isolate library to enable dispatching the
-    // initial startup message.
-    const intptr_t kNumIsolateArgs = 2;
-    Dart_Handle isolate_args[kNumIsolateArgs];
-    isolate_args[0] = main_closure;                          // entryPoint
-    isolate_args[1] = dart_options->CreateRuntimeOptions();  // args
-
-    Dart_Handle isolate_lib =
-        Dart_LookupLibrary(Dart_NewStringFromCString("dart:isolate"));
-    result =
-        Dart_Invoke(isolate_lib, Dart_NewStringFromCString("_startMainIsolate"),
-                    kNumIsolateArgs, isolate_args);
-    CHECK_RESULT(result);
-
-    // Keep handling messages until the last active receive port is closed.
-    result = Dart_RunLoop();
-    // Generate an app snapshot after execution if specified.
-    if (Options::gen_snapshot_kind() == kAppJIT) {
-      if (!Dart_IsCompilationError(result)) {
-        Snapshot::GenerateAppJIT(Options::snapshot_filename());
-      }
-    }
+  if (Options::compile_all()) {
+    result = Dart_CompileAll();
     CHECK_RESULT(result);
   }
+#endif  // !defined(DART_PRECOMPILED_RUNTIME)
 
-  WriteDepsFile(isolate);
+  if (Dart_IsNull(root_lib)) {
+    ErrorExit(kErrorExitCode, "Unable to find root library for '%s'\n",
+              script_name);
+  }
+
+  // Create a closure for the main entry point which is in the exported
+  // namespace of the root library or invoke a getter of the same name
+  // in the exported namespace and return the resulting closure.
+  Dart_Handle main_closure =
+      Dart_GetField(root_lib, Dart_NewStringFromCString("main"));
+  CHECK_RESULT(main_closure);
+  if (!Dart_IsClosure(main_closure)) {
+    ErrorExit(kErrorExitCode, "Unable to find 'main' in root library '%s'\n",
+              script_name);
+  }
+
+  // Call _startIsolate in the isolate library to enable dispatching the
+  // initial startup message.
+  const intptr_t kNumIsolateArgs = 2;
+  Dart_Handle isolate_args[kNumIsolateArgs];
+  isolate_args[0] = main_closure;                          // entryPoint
+  isolate_args[1] = dart_options->CreateRuntimeOptions();  // args
+
+  Dart_Handle isolate_lib =
+      Dart_LookupLibrary(Dart_NewStringFromCString("dart:isolate"));
+  result =
+      Dart_Invoke(isolate_lib, Dart_NewStringFromCString("_startMainIsolate"),
+                  kNumIsolateArgs, isolate_args);
+  CHECK_RESULT(result);
+
+  // Keep handling messages until the last active receive port is closed.
+  result = Dart_RunLoop();
+  // Generate an app snapshot after execution if specified.
+  if (Options::gen_snapshot_kind() == kAppJIT) {
+    if (!Dart_IsCompilationError(result)) {
+      Snapshot::GenerateAppJIT(Options::snapshot_filename());
+    }
+  }
+  CHECK_RESULT(result);
+
+  WriteDepsFile();
 
   Dart_ExitScope();
 
@@ -1350,8 +1352,14 @@
           script_name);
       Platform::Exit(kErrorExitCode);
     } else {
-      // Run the main isolate until we aren't told to restart.
-      RunMainIsolate(script_name, package_config_override, &dart_options);
+      if (Options::gen_snapshot_kind() == kKernel) {
+        CompileAndSaveKernel(script_name, package_config_override,
+                             &dart_options);
+
+      } else {
+        // Run the main isolate until we aren't told to restart.
+        RunMainIsolate(script_name, package_config_override, &dart_options);
+      }
     }
   }
 
diff --git a/runtime/bin/main_options.cc b/runtime/bin/main_options.cc
index e213e70..83c1408 100644
--- a/runtime/bin/main_options.cc
+++ b/runtime/bin/main_options.cc
@@ -141,8 +141,10 @@
   if (!Options::verbose_option()) {
     Syslog::Print(
 "Common VM flags:\n"
+#if !defined(PRODUCT)
 "--enable-asserts\n"
 "  Enable assert statements.\n"
+#endif  // !defined(PRODUCT)
 "--help or -h\n"
 "  Display this message (add -v or --verbose for information about\n"
 "  all VM options).\n"
@@ -151,6 +153,7 @@
 "--define=<key>=<value> or -D<key>=<value>\n"
 "  Define an environment declaration. To specify multiple declarations,\n"
 "  use multiple instances of this option.\n"
+#if !defined(PRODUCT)
 "--observe[=<port>[/<bind-address>]]\n"
 "  The observe flag is a convenience flag used to run a program with a\n"
 "  set of options which are often useful for debugging under Observatory.\n"
@@ -166,6 +169,7 @@
 "  Outputs information necessary to connect to the VM service to the\n"
 "  specified file in JSON format. Useful for clients which are unable to\n"
 "  listen to stdout for the Observatory listening message.\n"
+#endif  // !defined(PRODUCT)
 "--snapshot-kind=<snapshot_kind>\n"
 "--snapshot=<file_name>\n"
 "  These snapshot options are used to generate a snapshot of the loaded\n"
@@ -178,8 +182,10 @@
   } else {
     Syslog::Print(
 "Supported options:\n"
+#if !defined(PRODUCT)
 "--enable-asserts\n"
 "  Enable assert statements.\n"
+#endif  // !defined(PRODUCT)
 "--help or -h\n"
 "  Display this message (add -v or --verbose for information about\n"
 "  all VM options).\n"
@@ -188,6 +194,7 @@
 "--define=<key>=<value> or -D<key>=<value>\n"
 "  Define an environment declaration. To specify multiple declarations,\n"
 "  use multiple instances of this option.\n"
+#if !defined(PRODUCT)
 "--observe[=<port>[/<bind-address>]]\n"
 "  The observe flag is a convenience flag used to run a program with a\n"
 "  set of options which are often useful for debugging under Observatory.\n"
@@ -199,12 +206,14 @@
 "      --warn-on-pause-with-no-debugger\n"
 "  This set is subject to change.\n"
 "  Please see these options for further documentation.\n"
+#endif  // !defined(PRODUCT)
 "--version\n"
 "  Print the VM version.\n"
 "\n"
 "--trace-loading\n"
 "  enables tracing of library and script loading\n"
 "\n"
+#if !defined(PRODUCT)
 "--enable-vm-service[=<port>[/<bind-address>]]\n"
 "  Enables the VM service and listens on specified port for connections\n"
 "  (default port number is 8181, default bind address is localhost).\n"
@@ -219,6 +228,7 @@
 "  When the VM service is told to bind to a particular port, fallback to 0 if\n"
 "  it fails to bind instead of failing to start.\n"
 "\n"
+#endif  // !defined(PRODUCT)
 "--root-certs-file=<path>\n"
 "  The path to a file containing the trusted root certificates to use for\n"
 "  secure socket connections.\n"
@@ -321,6 +331,7 @@
 int Options::vm_service_server_port_ = INVALID_VM_SERVICE_SERVER_PORT;
 bool Options::ProcessEnableVmServiceOption(const char* arg,
                                            CommandLineOptions* vm_options) {
+#if !defined(PRODUCT)
   const char* value =
       OptionProcessor::ProcessOption(arg, "--enable-vm-service");
   if (value == NULL) {
@@ -339,10 +350,15 @@
 #endif  // !defined(DART_PRECOMPILED_RUNTIME)
   enable_vm_service_ = true;
   return true;
+#else
+  // VM service not available in product mode.
+  return false;
+#endif  // !defined(PRODUCT)
 }
 
 bool Options::ProcessObserveOption(const char* arg,
                                    CommandLineOptions* vm_options) {
+#if !defined(PRODUCT)
   const char* value = OptionProcessor::ProcessOption(arg, "--observe");
   if (value == NULL) {
     return false;
@@ -366,6 +382,10 @@
 #endif  // !defined(DART_PRECOMPILED_RUNTIME)
   enable_vm_service_ = true;
   return true;
+#else
+  // VM service not available in product mode.
+  return false;
+#endif  // !defined(PRODUCT)
 }
 
 // Explicitly handle VM flags that can be parsed by DartDev's run command.
diff --git a/runtime/bin/snapshot_utils.cc b/runtime/bin/snapshot_utils.cc
index 754043a..4650da4 100644
--- a/runtime/bin/snapshot_utils.cc
+++ b/runtime/bin/snapshot_utils.cc
@@ -471,6 +471,8 @@
                               const char* script_name,
                               const char* package_config) {
 #if !defined(EXCLUDE_CFE_AND_KERNEL_PLATFORM) && !defined(TESTING)
+  ASSERT(Dart_CurrentIsolate() == nullptr);
+
   uint8_t* kernel_buffer = NULL;
   intptr_t kernel_buffer_size = 0;
   dfe.ReadScript(script_name, &kernel_buffer, &kernel_buffer_size);
@@ -478,10 +480,23 @@
     WriteSnapshotFile(snapshot_filename, kernel_buffer, kernel_buffer_size);
     free(kernel_buffer);
   } else {
-    Dart_KernelCompilationResult result =
-        dfe.CompileScript(script_name, false, package_config, true);
+    PathSanitizer script_uri_sanitizer(script_name);
+    PathSanitizer packages_config_sanitizer(package_config);
+
+    bool null_safety =
+        Dart_DetectNullSafety(script_uri_sanitizer.sanitized_uri(),
+                              packages_config_sanitizer.sanitized_uri(),
+                              DartUtils::original_working_directory,
+                              /*isolate_snapshot_data=*/nullptr,
+                              /*isolate_snapshot_instructions=*/nullptr,
+                              /*kernel_buffer=*/nullptr,
+                              /*kernel_buffer_size=*/0);
+
+    Dart_KernelCompilationResult result = dfe.CompileScriptWithGivenNullsafety(
+        script_name, package_config, /*snapshot=*/true, null_safety);
     if (result.status != Dart_KernelCompilationStatus_Ok) {
-      ErrorExit(kErrorExitCode, "%s\n", result.error);
+      Syslog::PrintErr("%s\n", result.error);
+      Platform::Exit(kCompilationErrorExitCode);
     }
     WriteSnapshotFile(snapshot_filename, result.kernel, result.kernel_size);
     free(result.kernel);
diff --git a/runtime/include/dart_api.h b/runtime/include/dart_api.h
index f37de2b..1eccda2 100644
--- a/runtime/include/dart_api.h
+++ b/runtime/include/dart_api.h
@@ -3685,6 +3685,43 @@
                      const char* package_config,
                      Dart_KernelCompilationVerbosityLevel verbosity);
 
+/**
+ * Compiles the given `script_uri` to a kernel file.
+ *
+ * \param platform_kernel A buffer containing the kernel of the platform (e.g.
+ * `vm_platform_strong.dill`). The VM does not take ownership of this memory.
+ *
+ * \param platform_kernel_size The length of the platform_kernel buffer.
+ *
+ * \param snapshot_compile Set to `true` when the compilation is for a snapshot.
+ * This is used by the frontend to determine if compilation related information
+ * should be printed to console (e.g., null safety mode).
+ *
+ * \param null_safety Provides null-safety mode setting for the compiler.
+ *
+ * \param verbosity Specifies the logging behavior of the kernel compilation
+ * service.
+ *
+ * \return Returns the result of the compilation.
+ *
+ * On a successful compilation the returned [Dart_KernelCompilationResult] has
+ * a status of [Dart_KernelCompilationStatus_Ok] and the `kernel`/`kernel_size`
+ * fields are set. The caller takes ownership of the malloc()ed buffer.
+ *
+ * On a failed compilation the `error` might be set describing the reason for
+ * the failed compilation. The caller takes ownership of the malloc()ed
+ * error.
+ */
+DART_EXPORT Dart_KernelCompilationResult
+Dart_CompileToKernelWithGivenNullsafety(
+    const char* script_uri,
+    const uint8_t* platform_kernel,
+    const intptr_t platform_kernel_size,
+    bool snapshot_compile,
+    const char* package_config,
+    const bool null_safety,
+    Dart_KernelCompilationVerbosityLevel verbosity);
+
 typedef struct {
   const char* uri;
   const char* source;
diff --git a/runtime/platform/globals.h b/runtime/platform/globals.h
index 2a2c087..3891afc 100644
--- a/runtime/platform/globals.h
+++ b/runtime/platform/globals.h
@@ -197,40 +197,15 @@
 #if defined(_M_X64) || defined(__x86_64__)
 #define HOST_ARCH_X64 1
 #define ARCH_IS_64_BIT 1
-#define kFpuRegisterSize 16
-typedef simd128_value_t fpu_register_t;
 #elif defined(_M_IX86) || defined(__i386__)
 #define HOST_ARCH_IA32 1
 #define ARCH_IS_32_BIT 1
-#define kFpuRegisterSize 16
-typedef simd128_value_t fpu_register_t;
 #elif defined(__ARMEL__)
 #define HOST_ARCH_ARM 1
 #define ARCH_IS_32_BIT 1
-#define kFpuRegisterSize 16
-// Mark the fact that we have defined simd_value_t.
-#define SIMD_VALUE_T_
-typedef struct {
-  union {
-    uint32_t u;
-    float f;
-  } data_[4];
-} simd_value_t;
-typedef simd_value_t fpu_register_t;
-#define simd_value_safe_load(addr) (*reinterpret_cast<simd_value_t*>(addr))
-#define simd_value_safe_store(addr, value)                                     \
-  do {                                                                         \
-    reinterpret_cast<simd_value_t*>(addr)->data_[0] = value.data_[0];          \
-    reinterpret_cast<simd_value_t*>(addr)->data_[1] = value.data_[1];          \
-    reinterpret_cast<simd_value_t*>(addr)->data_[2] = value.data_[2];          \
-    reinterpret_cast<simd_value_t*>(addr)->data_[3] = value.data_[3];          \
-  } while (0)
-
 #elif defined(__aarch64__)
 #define HOST_ARCH_ARM64 1
 #define ARCH_IS_64_BIT 1
-#define kFpuRegisterSize 16
-typedef simd128_value_t fpu_register_t;
 #else
 #error Architecture was not detected as supported by Dart.
 #endif
diff --git a/runtime/tests/vm/dart/regress_48043_test.dart b/runtime/tests/vm/dart/regress_48043_test.dart
new file mode 100644
index 0000000..19cf04f
--- /dev/null
+++ b/runtime/tests/vm/dart/regress_48043_test.dart
@@ -0,0 +1,56 @@
+// 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.
+
+// Regression test for https://github.com/dart-lang/sdk/issues/48043.
+// Verifies that loads which may call initializer are not forwarded to
+// a previously stored value if it could be an uninitialized sentinel.
+
+// VMOptions=--deterministic --optimization_counter_threshold=120
+
+import "package:expect/expect.dart";
+
+class LateField1 {
+  late int n;
+
+  LateField1() {
+    print(n);
+  }
+}
+
+class LateField2 {
+  late int n;
+
+  LateField2() {
+    print(n);
+    n = 31999;
+  }
+}
+
+class LateField3 {
+  late int n;
+
+  LateField3() {
+    print(n);
+    n = DateTime.now().millisecondsSinceEpoch;
+  }
+}
+
+void doTests() {
+  Expect.throws(() {
+    LateField1();
+  });
+  Expect.throws(() {
+    LateField2();
+  });
+  Expect.throws(() {
+    final obj = LateField3();
+    print(obj.n);
+  });
+}
+
+void main() {
+  for (int i = 0; i < 150; ++i) {
+    doTests();
+  }
+}
diff --git a/runtime/vm/class_finalizer.cc b/runtime/vm/class_finalizer.cc
index 2d58396..f4d01aa 100644
--- a/runtime/vm/class_finalizer.cc
+++ b/runtime/vm/class_finalizer.cc
@@ -1133,7 +1133,7 @@
   }
   FinalizeMemberTypes(cls);
 
-  if (cls.is_enum_class()) {
+  if (cls.is_enum_class() && !FLAG_precompiled_mode) {
     AllocateEnumValues(cls);
   }
 
@@ -1216,69 +1216,58 @@
   }
 }
 
-// Allocate instances for each enumeration value, and populate the
-// static field 'values'.
-// By allocating the instances programmatically, we save an implicit final
-// getter function object for each enumeration value and for the
-// values field. We also don't have to generate the code for these getters
-// from thin air (no source code is available).
+// Eagerly allocate instances for enumeration values by evaluating
+// static const field 'values'. Also, pre-allocate
+// deleted sentinel value. This is needed to correctly
+// migrate enumeration values in case of hot reload.
 void ClassFinalizer::AllocateEnumValues(const Class& enum_cls) {
   Thread* thread = Thread::Current();
   Zone* zone = thread->zone();
 
+  const auto& values_field =
+      Field::Handle(zone, enum_cls.LookupStaticField(Symbols::Values()));
+  ASSERT(!values_field.IsNull() && values_field.is_static() &&
+         values_field.is_const());
+
+  const auto& values =
+      Object::Handle(zone, values_field.StaticConstFieldValue());
+  if (values.IsError()) {
+    ReportError(Error::Cast(values));
+  }
+  ASSERT(values.IsArray());
+
   // The enum_cls is the actual declared class.
   // The shared super-class holds the fields for index and name.
-  const Class& super_cls = Class::Handle(zone, enum_cls.SuperClass());
+  const auto& super_cls = Class::Handle(zone, enum_cls.SuperClass());
 
-  const Field& index_field =
+  const auto& index_field =
       Field::Handle(zone, super_cls.LookupInstanceField(Symbols::Index()));
   ASSERT(!index_field.IsNull());
 
-  const Field& name_field = Field::Handle(
+  const auto& name_field = Field::Handle(
       zone, super_cls.LookupInstanceFieldAllowPrivate(Symbols::_name()));
   ASSERT(!name_field.IsNull());
 
-  const String& enum_name = String::Handle(zone, enum_cls.ScrubbedName());
+  const auto& enum_name = String::Handle(zone, enum_cls.ScrubbedName());
 
-  const Array& fields = Array::Handle(zone, enum_cls.fields());
-  Field& field = Field::Handle(zone);
-  Instance& enum_value = Instance::Handle(zone);
-  String& enum_ident = String::Handle(zone);
-
-  enum_ident =
-      Symbols::FromConcat(thread, Symbols::_DeletedEnumPrefix(), enum_name);
-  enum_value = Instance::New(enum_cls, Heap::kOld);
-  enum_value.SetField(index_field, Smi::Handle(zone, Smi::New(-1)));
-  enum_value.SetField(name_field, enum_ident);
-  enum_value = enum_value.Canonicalize(thread);
-  ASSERT(!enum_value.IsNull());
-  ASSERT(enum_value.IsCanonical());
-  const Field& sentinel = Field::Handle(
+  const auto& sentinel_ident = String::Handle(
+      zone,
+      Symbols::FromConcat(thread, Symbols::_DeletedEnumPrefix(), enum_name));
+  auto& sentinel_value =
+      Instance::Handle(zone, Instance::New(enum_cls, Heap::kOld));
+  sentinel_value.SetField(index_field, Smi::Handle(zone, Smi::New(-1)));
+  sentinel_value.SetField(name_field, sentinel_ident);
+  sentinel_value = sentinel_value.Canonicalize(thread);
+  ASSERT(!sentinel_value.IsNull());
+  ASSERT(sentinel_value.IsCanonical());
+  const auto& sentinel_field = Field::Handle(
       zone, enum_cls.LookupStaticField(Symbols::_DeletedEnumSentinel()));
-  ASSERT(!sentinel.IsNull());
+  ASSERT(!sentinel_field.IsNull());
 
   // The static const field contains `Object::null()` instead of
   // `Object::sentinel()` - so it's not considered an initializing store.
-  sentinel.SetStaticConstFieldValue(enum_value,
-                                    /*assert_initializing_store*/ false);
-
-  ASSERT(enum_cls.kernel_offset() > 0);
-  Object& error = Error::Handle(zone);
-  for (intptr_t i = 0; i < fields.Length(); i++) {
-    field = Field::RawCast(fields.At(i));
-    if (!field.is_static() || !field.is_const() ||
-        (sentinel.ptr() == field.ptr())) {
-      continue;
-    }
-    // Hot-reload expects the static const fields to be evaluated when
-    // performing a reload.
-    if (!FLAG_precompiled_mode) {
-      error = field.StaticConstFieldValue();
-      if (error.IsError()) {
-        ReportError(Error::Cast(error));
-      }
-    }
-  }
+  sentinel_field.SetStaticConstFieldValue(sentinel_value,
+                                          /*assert_initializing_store*/ false);
 }
 
 void ClassFinalizer::PrintClassInformation(const Class& cls) {
diff --git a/runtime/vm/compiler/aot/precompiler.cc b/runtime/vm/compiler/aot/precompiler.cc
index a893335..143546b 100644
--- a/runtime/vm/compiler/aot/precompiler.cc
+++ b/runtime/vm/compiler/aot/precompiler.cc
@@ -2455,11 +2455,6 @@
       if (cls.is_allocated()) {
         retain = true;
       }
-      if (cls.is_enum_class()) {
-        // Enum classes have live instances, so we cannot unregister
-        // them.
-        retain = true;
-      }
 
       constants = cls.constants();
       retained_constants = GrowableObjectArray::New();
diff --git a/runtime/vm/compiler/assembler/assembler_x64.cc b/runtime/vm/compiler/assembler/assembler_x64.cc
index 0c396e7..12398f9 100644
--- a/runtime/vm/compiler/assembler/assembler_x64.cc
+++ b/runtime/vm/compiler/assembler/assembler_x64.cc
@@ -1379,6 +1379,17 @@
   }
 }
 
+void Assembler::LoadDImmediate(FpuRegister dst, double immediate) {
+  int64_t bits = bit_cast<int64_t>(immediate);
+  if (bits == 0) {
+    xorps(dst, dst);
+  } else {
+    intptr_t index = FindImmediate(bits);
+    LoadUnboxedDouble(
+        dst, PP, target::ObjectPool::element_offset(index) - kHeapObjectTag);
+  }
+}
+
 void Assembler::LoadCompressed(Register dest, const Address& slot) {
 #if !defined(DART_COMPRESSED_POINTERS)
   movq(dest, slot);
diff --git a/runtime/vm/compiler/assembler/assembler_x64.h b/runtime/vm/compiler/assembler/assembler_x64.h
index 5312859..3f4bf92 100644
--- a/runtime/vm/compiler/assembler/assembler_x64.h
+++ b/runtime/vm/compiler/assembler/assembler_x64.h
@@ -747,6 +747,7 @@
   void LoadImmediate(Register reg, int32_t immediate) {
     LoadImmediate(reg, Immediate(immediate));
   }
+  void LoadDImmediate(FpuRegister dst, double immediate);
 
   void LoadIsolate(Register dst);
   void LoadIsolateGroup(Register dst);
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler_x64.cc b/runtime/vm/compiler/backend/flow_graph_compiler_x64.cc
index 91cc786..bed125b 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler_x64.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler_x64.cc
@@ -866,14 +866,7 @@
   } else {
     ASSERT(!source.IsInvalid());
     ASSERT(source.IsConstant());
-    if (destination.IsFpuRegister() || destination.IsDoubleStackSlot()) {
-      Register scratch = tmp->AllocateTemporary();
-      source.constant_instruction()->EmitMoveToLocation(this, destination,
-                                                        scratch);
-      tmp->ReleaseTemporary();
-    } else {
-      source.constant_instruction()->EmitMoveToLocation(this, destination);
-    }
+    source.constant_instruction()->EmitMoveToLocation(this, destination);
   }
 }
 
diff --git a/runtime/vm/compiler/backend/il_x64.cc b/runtime/vm/compiler/backend/il_x64.cc
index 378537a..3066d10 100644
--- a/runtime/vm/compiler/backend/il_x64.cc
+++ b/runtime/vm/compiler/backend/il_x64.cc
@@ -560,22 +560,9 @@
       __ LoadObject(destination.reg(), value_);
     }
   } else if (destination.IsFpuRegister()) {
-    if (Utils::DoublesBitEqual(Double::Cast(value_).value(), 0.0)) {
-      __ xorps(destination.fpu_reg(), destination.fpu_reg());
-    } else {
-      ASSERT(tmp != kNoRegister);
-      __ LoadObject(tmp, value_);
-      __ movsd(destination.fpu_reg(),
-               compiler::FieldAddress(tmp, Double::value_offset()));
-    }
+    __ LoadDImmediate(destination.fpu_reg(), Double::Cast(value_).value());
   } else if (destination.IsDoubleStackSlot()) {
-    if (Utils::DoublesBitEqual(Double::Cast(value_).value(), 0.0)) {
-      __ xorps(FpuTMP, FpuTMP);
-    } else {
-      ASSERT(tmp != kNoRegister);
-      __ LoadObject(tmp, value_);
-      __ movsd(FpuTMP, compiler::FieldAddress(tmp, Double::value_offset()));
-    }
+    __ LoadDImmediate(FpuTMP, Double::Cast(value_).value());
     __ movsd(LocationToStackSlotAddress(destination), FpuTMP);
   } else {
     ASSERT(destination.IsStackSlot());
@@ -5438,13 +5425,11 @@
   XmmRegister base = locs->in(0).fpu_reg();
   XmmRegister exp = locs->in(1).fpu_reg();
   XmmRegister result = locs->out(0).fpu_reg();
-  Register temp = locs->temp(InvokeMathCFunctionInstr::kObjectTempIndex).reg();
   XmmRegister zero_temp =
       locs->temp(InvokeMathCFunctionInstr::kDoubleTempIndex).fpu_reg();
 
   __ xorps(zero_temp, zero_temp);
-  __ LoadObject(temp, Double::ZoneHandle(Double::NewCanonical(1)));
-  __ movsd(result, compiler::FieldAddress(temp, Double::value_offset()));
+  __ LoadDImmediate(result, 1.0);
 
   compiler::Label check_base, skip_call;
   // exponent == 0.0 -> return 1.0;
@@ -5458,15 +5443,13 @@
   __ j(EQUAL, &return_base, compiler::Assembler::kNearJump);
 
   // exponent == 2.0 ?
-  __ LoadObject(temp, Double::ZoneHandle(Double::NewCanonical(2.0)));
-  __ movsd(XMM0, compiler::FieldAddress(temp, Double::value_offset()));
+  __ LoadDImmediate(XMM0, 2.0);
   __ comisd(exp, XMM0);
   compiler::Label return_base_times_2;
   __ j(EQUAL, &return_base_times_2, compiler::Assembler::kNearJump);
 
   // exponent == 3.0 ?
-  __ LoadObject(temp, Double::ZoneHandle(Double::NewCanonical(3.0)));
-  __ movsd(XMM0, compiler::FieldAddress(temp, Double::value_offset()));
+  __ LoadDImmediate(XMM0, 3.0);
   __ comisd(exp, XMM0);
   __ j(NOT_EQUAL, &check_base);
 
@@ -5500,22 +5483,19 @@
   __ j(PARITY_ODD, &try_sqrt, compiler::Assembler::kNearJump);
   // Return NaN.
   __ Bind(&return_nan);
-  __ LoadObject(temp, Double::ZoneHandle(Double::NewCanonical(NAN)));
-  __ movsd(result, compiler::FieldAddress(temp, Double::value_offset()));
+  __ LoadDImmediate(result, NAN);
   __ jmp(&skip_call);
 
   compiler::Label do_pow, return_zero;
   __ Bind(&try_sqrt);
   // Before calling pow, check if we could use sqrt instead of pow.
-  __ LoadObject(temp, Double::ZoneHandle(Double::NewCanonical(kNegInfinity)));
-  __ movsd(result, compiler::FieldAddress(temp, Double::value_offset()));
+  __ LoadDImmediate(result, kNegInfinity);
   // base == -Infinity -> call pow;
   __ comisd(base, result);
   __ j(EQUAL, &do_pow, compiler::Assembler::kNearJump);
 
   // exponent == 0.5 ?
-  __ LoadObject(temp, Double::ZoneHandle(Double::NewCanonical(0.5)));
-  __ movsd(result, compiler::FieldAddress(temp, Double::value_offset()));
+  __ LoadDImmediate(result, 0.5);
   __ comisd(exp, result);
   __ j(NOT_EQUAL, &do_pow, compiler::Assembler::kNearJump);
 
diff --git a/runtime/vm/compiler/backend/redundancy_elimination.cc b/runtime/vm/compiler/backend/redundancy_elimination.cc
index e356875..35070d4 100644
--- a/runtime/vm/compiler/backend/redundancy_elimination.cc
+++ b/runtime/vm/compiler/backend/redundancy_elimination.cc
@@ -1837,6 +1837,12 @@
     }
   }
 
+  bool CanForwardLoadTo(Definition* load, Definition* replacement) {
+    // Loads which check initialization status can only be replaced if
+    // we can guarantee that forwarded value is not a sentinel.
+    return !(CallsInitializer(load) && replacement->Type()->can_be_sentinel());
+  }
+
   // Returns true if given instruction stores the sentinel value.
   // Such a store doesn't initialize corresponding field.
   bool IsSentinelStore(Instruction* instr) {
@@ -2259,16 +2265,18 @@
           ASSERT((out_values != NULL) && ((*out_values)[place_id] != NULL));
 
           Definition* replacement = (*out_values)[place_id];
-          graph_->EnsureSSATempIndex(defn, replacement);
-          if (FLAG_trace_optimization) {
-            THR_Print("Replacing load v%" Pd " with v%" Pd "\n",
-                      defn->ssa_temp_index(), replacement->ssa_temp_index());
-          }
+          if (CanForwardLoadTo(defn, replacement)) {
+            graph_->EnsureSSATempIndex(defn, replacement);
+            if (FLAG_trace_optimization) {
+              THR_Print("Replacing load v%" Pd " with v%" Pd "\n",
+                        defn->ssa_temp_index(), replacement->ssa_temp_index());
+            }
 
-          ReplaceLoad(defn, replacement);
-          instr_it.RemoveCurrentFromGraph();
-          forwarded_ = true;
-          continue;
+            ReplaceLoad(defn, replacement);
+            instr_it.RemoveCurrentFromGraph();
+            forwarded_ = true;
+            continue;
+          }
         } else if (!kill->Contains(place_id)) {
           // This is an exposed load: it is the first representative of a
           // given expression id and it is not killed on the path from
@@ -2630,7 +2638,7 @@
         // as replaced and store a pointer to the replacement.
         replacement = replacement->Replacement();
 
-        if (load != replacement) {
+        if ((load != replacement) && CanForwardLoadTo(load, replacement)) {
           graph_->EnsureSSATempIndex(load, replacement);
 
           if (FLAG_trace_optimization) {
diff --git a/runtime/vm/compiler/backend/typed_data_aot_test.cc b/runtime/vm/compiler/backend/typed_data_aot_test.cc
index 1087c72..9b8891e 100644
--- a/runtime/vm/compiler/backend/typed_data_aot_test.cc
+++ b/runtime/vm/compiler/backend/typed_data_aot_test.cc
@@ -95,7 +95,7 @@
 
       void reverse%s(%s list) {
         final length = list.length;
-        final halfLength = length ~/ 2;
+        final halfLength = length >> 1;
         for (int i = 0; i < halfLength; ++i) {
           final tmp = list[length-i-1];
           list[length-i-1] = list[i];
diff --git a/runtime/vm/constants_arm.h b/runtime/vm/constants_arm.h
index c774203..94b214a 100644
--- a/runtime/vm/constants_arm.h
+++ b/runtime/vm/constants_arm.h
@@ -288,6 +288,8 @@
 typedef QRegister FpuRegister;
 
 const FpuRegister FpuTMP = QTMP;
+const int kFpuRegisterSize = 16;
+typedef simd128_value_t fpu_register_t;
 const int kNumberOfFpuRegisters = kNumberOfQRegisters;
 const FpuRegister kNoFpuRegister = kNoQRegister;
 
diff --git a/runtime/vm/constants_arm64.h b/runtime/vm/constants_arm64.h
index 7947a60..9e4213d 100644
--- a/runtime/vm/constants_arm64.h
+++ b/runtime/vm/constants_arm64.h
@@ -123,6 +123,8 @@
 // Architecture independent aliases.
 typedef VRegister FpuRegister;
 const FpuRegister FpuTMP = VTMP;
+const int kFpuRegisterSize = 16;
+typedef simd128_value_t fpu_register_t;
 const int kNumberOfFpuRegisters = kNumberOfVRegisters;
 const FpuRegister kNoFpuRegister = kNoVRegister;
 
diff --git a/runtime/vm/constants_ia32.h b/runtime/vm/constants_ia32.h
index 4a497730..bac9dd5 100644
--- a/runtime/vm/constants_ia32.h
+++ b/runtime/vm/constants_ia32.h
@@ -61,6 +61,8 @@
 // Architecture independent aliases.
 typedef XmmRegister FpuRegister;
 const FpuRegister FpuTMP = XMM7;
+const int kFpuRegisterSize = 16;
+typedef simd128_value_t fpu_register_t;
 const int kNumberOfFpuRegisters = kNumberOfXmmRegisters;
 const FpuRegister kNoFpuRegister = kNoXmmRegister;
 
diff --git a/runtime/vm/constants_x64.h b/runtime/vm/constants_x64.h
index 3e7f3c5..2bc9444 100644
--- a/runtime/vm/constants_x64.h
+++ b/runtime/vm/constants_x64.h
@@ -93,6 +93,8 @@
 // Architecture independent aliases.
 typedef XmmRegister FpuRegister;
 const FpuRegister FpuTMP = XMM15;
+const int kFpuRegisterSize = 16;
+typedef simd128_value_t fpu_register_t;
 const int kNumberOfFpuRegisters = kNumberOfXmmRegisters;
 const FpuRegister kNoFpuRegister = kNoXmmRegister;
 
diff --git a/runtime/vm/dart_api_impl.cc b/runtime/vm/dart_api_impl.cc
index fe7dcc4..a4e6c1a 100644
--- a/runtime/vm/dart_api_impl.cc
+++ b/runtime/vm/dart_api_impl.cc
@@ -6076,7 +6076,7 @@
   result = KernelIsolate::CompileToKernel(
       script_uri, platform_kernel, platform_kernel_size, 0, NULL,
       incremental_compile, snapshot_compile, package_config, NULL, NULL,
-      verbosity);
+      FLAG_sound_null_safety, verbosity);
   if (result.status == Dart_KernelCompilationStatus_Ok) {
     Dart_KernelCompilationResult accept_result =
         KernelIsolate::AcceptCompilation();
@@ -6091,6 +6091,34 @@
   return result;
 }
 
+DART_EXPORT Dart_KernelCompilationResult
+Dart_CompileToKernelWithGivenNullsafety(
+    const char* script_uri,
+    const uint8_t* platform_kernel,
+    intptr_t platform_kernel_size,
+    bool snapshot_compile,
+    const char* package_config,
+    bool null_safety,
+    Dart_KernelCompilationVerbosityLevel verbosity) {
+  API_TIMELINE_DURATION(Thread::Current());
+
+  Dart_KernelCompilationResult result = {};
+#if defined(DART_PRECOMPILED_RUNTIME)
+  result.status = Dart_KernelCompilationStatus_Unknown;
+  result.error = Utils::StrDup("Dart_CompileToKernel is unsupported.");
+#else
+  intptr_t null_safety_option =
+      null_safety ? kNullSafetyOptionStrong : kNullSafetyOptionWeak;
+  result = KernelIsolate::CompileToKernel(
+      script_uri, platform_kernel, platform_kernel_size,
+      /*source_files_count=*/0, /*source_files=*/nullptr,
+      /*incremental_compile=*/false, snapshot_compile, package_config,
+      /*multiroot_filepaths=*/nullptr, /*multiroot_scheme=*/nullptr,
+      null_safety_option, verbosity);
+#endif
+  return result;
+}
+
 DART_EXPORT Dart_KernelCompilationResult Dart_KernelListDependencies() {
   Dart_KernelCompilationResult result = {};
 #if defined(DART_PRECOMPILED_RUNTIME)
diff --git a/runtime/vm/isolate_reload.cc b/runtime/vm/isolate_reload.cc
index 11d116a..c61d766 100644
--- a/runtime/vm/isolate_reload.cc
+++ b/runtime/vm/isolate_reload.cc
@@ -991,7 +991,11 @@
     TransitionVMToNative transition(Thread::Current());
     retval = KernelIsolate::CompileToKernel(
         root_lib_url, nullptr, 0, modified_scripts_count, modified_scripts,
-        true, false, nullptr);
+        /*incremental_compile=*/true,
+        /*snapshot_compile=*/false,
+        /*package_config=*/nullptr,
+        /*multiroot_filepaths=*/nullptr,
+        /*multiroot_scheme=*/nullptr, FLAG_sound_null_safety);
   }
   if (retval.status != Dart_KernelCompilationStatus_Ok) {
     if (retval.kernel != nullptr) {
@@ -1556,9 +1560,8 @@
           ASSERT(new_cls.is_enum_class() == old_cls.is_enum_class());
           if (new_cls.is_enum_class() && new_cls.is_finalized()) {
             new_cls.ReplaceEnum(this, old_cls);
-          } else {
-            new_cls.CopyStaticFieldValues(this, old_cls);
           }
+          new_cls.CopyStaticFieldValues(this, old_cls);
           old_cls.PatchFieldsAndFunctions();
           old_cls.MigrateImplicitStaticClosures(this, new_cls);
         }
diff --git a/runtime/vm/kernel_isolate.cc b/runtime/vm/kernel_isolate.cc
index 8926b5d..7e098bf 100644
--- a/runtime/vm/kernel_isolate.cc
+++ b/runtime/vm/kernel_isolate.cc
@@ -721,6 +721,7 @@
       const char* package_config,
       const char* multiroot_filepaths,
       const char* multiroot_scheme,
+      intptr_t default_null_safety,
       const MallocGrowableArray<char*>* experimental_flags,
       const char* original_working_directory,
       Dart_KernelCompilationVerbosityLevel verbosity) {
@@ -809,7 +810,7 @@
         (isolate_group != nullptr)
             ? (isolate_group->null_safety() ? kNullSafetyOptionStrong
                                             : kNullSafetyOptionWeak)
-            : FLAG_sound_null_safety;
+            : default_null_safety;
 
     intptr_t num_experimental_flags = experimental_flags->length();
     Dart_CObject** experimental_flags_array =
@@ -1052,6 +1053,7 @@
     const char* package_config,
     const char* multiroot_filepaths,
     const char* multiroot_scheme,
+    intptr_t default_null_safety,
     Dart_KernelCompilationVerbosityLevel verbosity) {
   // Start the kernel Isolate if it is not already running.
   if (!Start()) {
@@ -1076,8 +1078,8 @@
       kCompileTag, kernel_port, script_uri, platform_kernel,
       platform_kernel_size, source_file_count, source_files,
       incremental_compile, snapshot_compile, package_config,
-      multiroot_filepaths, multiroot_scheme, experimental_flags_, NULL,
-      verbosity);
+      multiroot_filepaths, multiroot_scheme, default_null_safety,
+      experimental_flags_, NULL, verbosity);
 }
 
 bool KernelIsolate::DetectNullSafety(const char* script_uri,
@@ -1095,7 +1097,8 @@
   KernelCompilationRequest request;
   Dart_KernelCompilationResult result = request.SendAndWaitForResponse(
       kDetectNullabilityTag, kernel_port, script_uri, nullptr, -1, 0, nullptr,
-      false, false, package_config, nullptr, nullptr, experimental_flags_,
+      false, false, package_config, nullptr, nullptr,
+      /*default_null_safety=*/kNullSafetyOptionUnspecified, experimental_flags_,
       original_working_directory, Dart_KernelCompilationVerbosityLevel_Error);
   return result.null_safety;
 }
@@ -1112,8 +1115,8 @@
   KernelCompilationRequest request;
   return request.SendAndWaitForResponse(
       kListDependenciesTag, kernel_port, NULL, NULL, 0, 0, NULL, false, false,
-      NULL, NULL, NULL, experimental_flags_, NULL,
-      Dart_KernelCompilationVerbosityLevel_Error);
+      NULL, NULL, NULL, /*default_null_safety=*/kNullSafetyOptionUnspecified,
+      experimental_flags_, NULL, Dart_KernelCompilationVerbosityLevel_Error);
 }
 
 Dart_KernelCompilationResult KernelIsolate::AcceptCompilation() {
@@ -1130,8 +1133,8 @@
   KernelCompilationRequest request;
   return request.SendAndWaitForResponse(
       kAcceptTag, kernel_port, NULL, NULL, 0, 0, NULL, true, false, NULL, NULL,
-      NULL, experimental_flags_, NULL,
-      Dart_KernelCompilationVerbosityLevel_Error);
+      NULL, /*default_null_safety=*/kNullSafetyOptionUnspecified,
+      experimental_flags_, NULL, Dart_KernelCompilationVerbosityLevel_Error);
 }
 
 Dart_KernelCompilationResult KernelIsolate::CompileExpressionToKernel(
@@ -1177,8 +1180,9 @@
   KernelCompilationRequest request;
   return request.SendAndWaitForResponse(
       kUpdateSourcesTag, kernel_port, NULL, NULL, 0, source_files_count,
-      source_files, true, false, NULL, NULL, NULL, experimental_flags_, NULL,
-      Dart_KernelCompilationVerbosityLevel_Error);
+      source_files, true, false, NULL, NULL, NULL,
+      /*default_null_safety=*/kNullSafetyOptionUnspecified, experimental_flags_,
+      NULL, Dart_KernelCompilationVerbosityLevel_Error);
 }
 
 void KernelIsolate::NotifyAboutIsolateGroupShutdown(
diff --git a/runtime/vm/kernel_isolate.h b/runtime/vm/kernel_isolate.h
index 5880beb..d5d5297 100644
--- a/runtime/vm/kernel_isolate.h
+++ b/runtime/vm/kernel_isolate.h
@@ -55,6 +55,7 @@
       const char* package_config = NULL,
       const char* multiroot_filepaths = NULL,
       const char* multiroot_scheme = NULL,
+      intptr_t default_null_safety = kNullSafetyOptionUnspecified,
       Dart_KernelCompilationVerbosityLevel verbosity =
           Dart_KernelCompilationVerbosityLevel_All);
 
diff --git a/runtime/vm/object_reload.cc b/runtime/vm/object_reload.cc
index 5ed79a5..d4ed8d0 100644
--- a/runtime/vm/object_reload.cc
+++ b/runtime/vm/object_reload.cc
@@ -192,9 +192,6 @@
 
 void Class::CopyStaticFieldValues(ProgramReloadContext* reload_context,
                                   const Class& old_cls) const {
-  // We only update values for non-enum classes.
-  const bool update_values = !is_enum_class();
-
   const Array& old_field_list = Array::Handle(old_cls.fields());
   Field& old_field = Field::Handle();
   String& old_name = String::Handle();
@@ -215,7 +212,7 @@
         if (field.is_static()) {
           // We only copy values if requested and if the field is not a const
           // field. We let const fields be updated with a reload.
-          if (update_values && !field.is_const()) {
+          if (!field.is_const()) {
             // Make new field point to the old field value so that both
             // old and new code see and update same value.
             reload_context->isolate_group()->FreeStaticField(field);
@@ -307,15 +304,15 @@
 
   Zone* zone = Thread::Current()->zone();
 
-  Array& enum_fields = Array::Handle(zone);
   Field& field = Field::Handle(zone);
+  Class& cls = Class::Handle(zone);
   String& enum_ident = String::Handle();
   Instance& old_enum_value = Instance::Handle(zone);
   Instance& enum_value = Instance::Handle(zone);
   // The E.values array.
-  Instance& old_enum_values = Instance::Handle(zone);
+  Array& old_enum_values = Array::Handle(zone);
   // The E.values array.
-  Instance& enum_values = Instance::Handle(zone);
+  Array& enum_values = Array::Handle(zone);
   // The E._deleted_enum_sentinel instance.
   Instance& old_deleted_enum_sentinel = Instance::Handle(zone);
   // The E._deleted_enum_sentinel instance.
@@ -327,31 +324,26 @@
   TIR_Print("Replacing enum `%s`\n", String::Handle(Name()).ToCString());
 
   {
+    field = old_enum.LookupStaticField(Symbols::Values());
+    ASSERT(!field.IsNull() && field.is_static() && field.is_const());
+    old_enum_values ^= field.StaticConstFieldValue();
+    ASSERT(!old_enum_values.IsNull());
+
+    field = old_enum.LookupStaticField(Symbols::_DeletedEnumSentinel());
+    ASSERT(!field.IsNull() && field.is_static() && field.is_const());
+    old_deleted_enum_sentinel ^= field.StaticConstFieldValue();
+    ASSERT(!old_deleted_enum_sentinel.IsNull());
+
+    cls = old_enum.SuperClass();
+    field = cls.LookupInstanceFieldAllowPrivate(Symbols::_name());
+    ASSERT(!field.IsNull());
+
     UnorderedHashMap<EnumMapTraits> enum_map(enum_map_storage.ptr());
     // Build a map of all enum name -> old enum instance.
-    enum_fields = old_enum.fields();
-    for (intptr_t i = 0; i < enum_fields.Length(); i++) {
-      field = Field::RawCast(enum_fields.At(i));
-      enum_ident = field.name();
-      if (!field.is_static()) {
-        // Enum instances are only held in static fields.
-        continue;
-      }
-      ASSERT(field.is_const());
-      if (enum_ident.Equals(Symbols::Values())) {
-        old_enum_values = Instance::RawCast(field.StaticConstFieldValue());
-        // Non-enum instance.
-        continue;
-      }
-      if (enum_ident.Equals(Symbols::_DeletedEnumSentinel())) {
-        old_deleted_enum_sentinel =
-            Instance::RawCast(field.StaticConstFieldValue());
-        // Non-enum instance.
-        continue;
-      }
-      old_enum_value = Instance::RawCast(field.StaticConstFieldValue());
-
+    for (intptr_t i = 0, n = old_enum_values.Length(); i < n; ++i) {
+      old_enum_value ^= old_enum_values.At(i);
       ASSERT(!old_enum_value.IsNull());
+      enum_ident ^= old_enum_value.GetField(field);
       VTIR_Print("Element %s being added to mapping\n", enum_ident.ToCString());
       bool update = enum_map.UpdateOrInsert(enum_ident, old_enum_value);
       VTIR_Print("Element %s added to mapping\n", enum_ident.ToCString());
@@ -364,31 +356,27 @@
 
   bool enums_deleted = false;
   {
+    field = LookupStaticField(Symbols::Values());
+    ASSERT(!field.IsNull() && field.is_static() && field.is_const());
+    enum_values ^= field.StaticConstFieldValue();
+    ASSERT(!enum_values.IsNull());
+
+    field = LookupStaticField(Symbols::_DeletedEnumSentinel());
+    ASSERT(!field.IsNull() && field.is_static() && field.is_const());
+    deleted_enum_sentinel ^= field.StaticConstFieldValue();
+    ASSERT(!deleted_enum_sentinel.IsNull());
+
+    cls = SuperClass();
+    field = cls.LookupInstanceFieldAllowPrivate(Symbols::_name());
+    ASSERT(!field.IsNull());
+
     UnorderedHashMap<EnumMapTraits> enum_map(enum_map_storage.ptr());
     // Add a become mapping from the old instances to the new instances.
-    enum_fields = fields();
-    for (intptr_t i = 0; i < enum_fields.Length(); i++) {
-      field = Field::RawCast(enum_fields.At(i));
-      enum_ident = field.name();
-      if (!field.is_static()) {
-        // Enum instances are only held in static fields.
-        continue;
-      }
-      ASSERT(field.is_const());
-      if (enum_ident.Equals(Symbols::Values())) {
-        enum_values = Instance::RawCast(field.StaticConstFieldValue());
-        // Non-enum instance.
-        continue;
-      }
-      if (enum_ident.Equals(Symbols::_DeletedEnumSentinel())) {
-        deleted_enum_sentinel =
-            Instance::RawCast(field.StaticConstFieldValue());
-        // Non-enum instance.
-        continue;
-      }
-      enum_value = Instance::RawCast(field.StaticConstFieldValue());
-
+    for (intptr_t i = 0, n = enum_values.Length(); i < n; ++i) {
+      enum_value ^= enum_values.At(i);
       ASSERT(!enum_value.IsNull());
+      enum_ident ^= enum_value.GetField(field);
+
       old_enum_value ^= enum_map.GetOrNull(enum_ident);
       if (old_enum_value.IsNull()) {
         VTIR_Print("New element %s was not found in mapping\n",
@@ -408,13 +396,9 @@
   }
 
   // Map the old E.values array to the new E.values array.
-  ASSERT(!old_enum_values.IsNull());
-  ASSERT(!enum_values.IsNull());
   reload_context->AddBecomeMapping(old_enum_values, enum_values);
 
   // Map the old E._deleted_enum_sentinel to the new E._deleted_enum_sentinel.
-  ASSERT(!old_deleted_enum_sentinel.IsNull());
-  ASSERT(!deleted_enum_sentinel.IsNull());
   reload_context->AddBecomeMapping(old_deleted_enum_sentinel,
                                    deleted_enum_sentinel);
 
diff --git a/runtime/vm/simulator_arm.h b/runtime/vm/simulator_arm.h
index 8074d56..61beaec 100644
--- a/runtime/vm/simulator_arm.h
+++ b/runtime/vm/simulator_arm.h
@@ -25,14 +25,12 @@
 class SimulatorSetjmpBuffer;
 class Thread;
 
-#if !defined(SIMD_VALUE_T_)
 typedef struct {
   union {
     uint32_t u;
     float f;
   } data_[4];
 } simd_value_t;
-#endif
 
 class Simulator {
  public:
diff --git a/sdk/lib/core/pattern.dart b/sdk/lib/core/pattern.dart
index 23b4445..7facb38 100644
--- a/sdk/lib/core/pattern.dart
+++ b/sdk/lib/core/pattern.dart
@@ -26,7 +26,7 @@
   ///
   /// Returns a match if the pattern matches a substring of [string]
   /// starting at [start], and `null` if the pattern doesn't match
-  /// a that point.
+  /// at that point.
   ///
   /// The [start] must be non-negative and no greater than `string.length`.
   Match? matchAsPrefix(String string, [int start = 0]);
@@ -41,10 +41,10 @@
 /// The following example finds all matches of a [RegExp] in a [String]
 /// and iterates through the returned iterable of `Match` objects.
 /// ```dart
-/// RegExp exp = RegExp(r"(\w+)");
-/// String str = "Parse my string";
-/// Iterable<Match> matches = exp.allMatches(str);
-/// for (Match m in matches) {
+/// final regExp = RegExp(r'(\w+)');
+/// const string = 'Parse my string';
+/// final matches = regExp.allMatches(string);
+/// for (final m in matches) {
 ///   String match = m[0]!;
 ///   print(match);
 /// }
@@ -72,6 +72,17 @@
   ///
   /// The result may be `null` if the pattern didn't assign a value to it
   /// as part of this match.
+  /// ```dart import dart:convert
+  ///
+  /// final string = '[00:13.37] This is a chat message.';
+  /// final regExp = RegExp(r'^\[\s*(\d+):(\d+)\.(\d+)\]\s*(.*)$');
+  /// final match = regExp.firstMatch(string)!;
+  /// final message = jsonEncode(match[0]!); // '[00:13.37] This is a chat message.'
+  /// final hours = jsonEncode(match[1]!); // '00'
+  /// final minutes = jsonEncode(match[2]!); // '13'
+  /// final seconds = jsonEncode(match[3]!); // '37'
+  /// final text = jsonEncode(match[4]!); // 'This is a chat message.'
+  /// ```
   String? group(int group);
 
   /// The string matched by the given [group].
@@ -85,6 +96,14 @@
   ///
   /// The list contains the strings returned by [group] for each index in
   /// [groupIndices].
+  /// ```dart import dart:convert
+  ///
+  /// final string = '[00:13.37] This is a chat message.';
+  /// final regExp = RegExp(r'^\[\s*(\d+):(\d+)\.(\d+)\]\s*(.*)$');
+  /// final match = regExp.firstMatch(string)!;
+  /// final message = jsonEncode(match.groups([1, 2, 3, 4]));
+  /// // ['00','13','37','This is a chat message.']
+  /// ```
   List<String?> groups(List<int> groupIndices);
 
   /// Returns the number of captured groups in the match.
diff --git a/sdk/lib/libraries.json b/sdk/lib/libraries.json
index c59dc6f..c9a168a 100644
--- a/sdk/lib/libraries.json
+++ b/sdk/lib/libraries.json
@@ -154,27 +154,12 @@
     }
   },
   "dart2js": {
+    "include": [
+      {
+        "target": "_dart2js_common"
+      }
+    ],
     "libraries": {
-      "async": {
-        "uri": "async/async.dart",
-        "patches": "_internal/js_runtime/lib/async_patch.dart"
-      },
-      "collection": {
-        "uri": "collection/collection.dart",
-        "patches": "_internal/js_runtime/lib/collection_patch.dart"
-      },
-      "convert": {
-        "uri": "convert/convert.dart",
-        "patches": "_internal/js_runtime/lib/convert_patch.dart"
-      },
-      "core": {
-        "uri": "core/core.dart",
-        "patches": "_internal/js_runtime/lib/core_patch.dart"
-      },
-      "developer": {
-        "uri": "developer/developer.dart",
-        "patches": "_internal/js_runtime/lib/developer_patch.dart"
-      },
       "html": {
         "uri": "html/dart2js/html_dart2js.dart"
       },
@@ -184,44 +169,10 @@
       "indexed_db": {
         "uri": "indexed_db/dart2js/indexed_db_dart2js.dart"
       },
-      "_http": {
-        "uri": "_http/http.dart"
-      },
-      "io": {
-        "uri": "io/io.dart",
-        "patches": "_internal/js_runtime/lib/io_patch.dart",
-        "supported": false
-      },
-      "isolate": {
-        "uri": "isolate/isolate.dart",
-        "patches": "_internal/js_runtime/lib/isolate_patch.dart",
-        "supported": false
-      },
-      "js": {
-        "uri": "js/js.dart",
-        "patches": "_internal/js_runtime/lib/js_patch.dart"
-      },
       "_js": {
         "uri": "js/_js.dart",
         "patches": "js/_js_client.dart"
       },
-      "_js_annotations": {
-        "uri": "js/_js_annotations.dart"
-      },
-      "js_util": {
-        "uri": "js_util/js_util.dart"
-      },
-      "math": {
-        "uri": "math/math.dart",
-        "patches": "_internal/js_runtime/lib/math_patch.dart"
-      },
-      "typed_data": {
-        "uri": "typed_data/typed_data.dart",
-        "patches": "_internal/js_runtime/lib/typed_data_patch.dart"
-      },
-      "_native_typed_data": {
-        "uri": "_internal/js_runtime/lib/native_typed_data.dart"
-      },
       "svg": {
         "uri": "svg/dart2js/svg_dart2js.dart"
       },
@@ -234,46 +185,25 @@
       "_dart2js_runtime_metrics": {
         "uri": "_internal/js_runtime/lib/dart2js_runtime_metrics.dart"
       },
-      "_internal": {
-        "uri": "internal/internal.dart",
-        "patches": "_internal/js_runtime/lib/internal_patch.dart"
-      },
-      "_js_helper": {
-        "uri": "_internal/js_runtime/lib/js_helper.dart"
-      },
-      "_late_helper": {
-        "uri": "_internal/js_runtime/lib/late_helper.dart"
-      },
-      "_rti": {
-        "uri": "_internal/js_runtime/lib/rti.dart"
-      },
-      "_interceptors": {
-        "uri": "_internal/js_runtime/lib/interceptors.dart"
-      },
-      "_foreign_helper": {
-        "uri": "_internal/js_runtime/lib/foreign_helper.dart"
-      },
-      "_js_names": {
-        "uri": "_internal/js_runtime/lib/js_names.dart"
-      },
-      "_js_primitives": {
-        "uri": "_internal/js_runtime/lib/js_primitives.dart"
-      },
-      "_js_embedded_names": {
-        "uri": "_internal/js_runtime/lib/shared/embedded_names.dart"
-      },
-      "_async_await_error_codes": {
-        "uri": "_internal/js_runtime/lib/shared/async_await_error_codes.dart"
-      },
-      "_recipe_syntax": {
-        "uri": "_internal/js_runtime/lib/shared/recipe_syntax.dart"
-      },
       "_metadata": {
         "uri": "html/html_common/metadata.dart"
       }
     }
   },
   "dart2js_server": {
+    "include": [
+      {
+        "target": "_dart2js_common"
+      }
+    ],
+    "libraries": {
+      "_js": {
+        "uri": "js/_js.dart",
+        "patches": "js/_js_server.dart"
+      }
+    }
+  },
+  "_dart2js_common": {
     "libraries": {
       "async": {
         "uri": "async/async.dart",
@@ -312,10 +242,6 @@
         "uri": "js/js.dart",
         "patches": "_internal/js_runtime/lib/js_patch.dart"
       },
-      "_js": {
-        "uri": "js/_js.dart",
-        "patches": "js/_js_server.dart"
-      },
       "_js_annotations": {
         "uri": "js/_js_annotations.dart"
       },
@@ -476,4 +402,4 @@
       }
     }
   }
-}
+}
\ No newline at end of file
diff --git a/sdk/lib/libraries.yaml b/sdk/lib/libraries.yaml
index 812487a..4aab70c 100644
--- a/sdk/lib/libraries.yaml
+++ b/sdk/lib/libraries.yaml
@@ -152,27 +152,9 @@
       uri: "_internal/vm/bin/vmservice_io.dart"
 
 dart2js:
+  include:
+    - target: "_dart2js_common"
   libraries:
-    async:
-      uri: "async/async.dart"
-      patches: "_internal/js_runtime/lib/async_patch.dart"
-
-    collection:
-      uri: "collection/collection.dart"
-      patches: "_internal/js_runtime/lib/collection_patch.dart"
-
-    convert:
-      uri: "convert/convert.dart"
-      patches: "_internal/js_runtime/lib/convert_patch.dart"
-
-    core:
-      uri: "core/core.dart"
-      patches: "_internal/js_runtime/lib/core_patch.dart"
-
-    developer:
-      uri: "developer/developer.dart"
-      patches: "_internal/js_runtime/lib/developer_patch.dart"
-
     html:
       uri: "html/dart2js/html_dart2js.dart"
 
@@ -182,44 +164,10 @@
     indexed_db:
       uri: "indexed_db/dart2js/indexed_db_dart2js.dart"
 
-    _http:
-      uri: "_http/http.dart"
-
-    io:
-      uri: "io/io.dart"
-      patches: "_internal/js_runtime/lib/io_patch.dart"
-      supported: false
-
-    isolate:
-      uri: "isolate/isolate.dart"
-      patches: "_internal/js_runtime/lib/isolate_patch.dart"
-      supported: false
-
-    js:
-      uri: "js/js.dart"
-      patches: "_internal/js_runtime/lib/js_patch.dart"
-
     _js:
       uri: "js/_js.dart"
       patches: "js/_js_client.dart"
 
-    _js_annotations:
-      uri: "js/_js_annotations.dart"
-
-    js_util:
-      uri: "js_util/js_util.dart"
-
-    math:
-      uri: "math/math.dart"
-      patches: "_internal/js_runtime/lib/math_patch.dart"
-
-    typed_data:
-      uri: "typed_data/typed_data.dart"
-      patches: "_internal/js_runtime/lib/typed_data_patch.dart"
-
-    _native_typed_data:
-      uri: "_internal/js_runtime/lib/native_typed_data.dart"
-
     svg:
       uri: "svg/dart2js/svg_dart2js.dart"
 
@@ -229,47 +177,18 @@
     web_gl:
       uri: "web_gl/dart2js/web_gl_dart2js.dart"
 
-    _dart2js_runtime_metrics:
-      uri: "_internal/js_runtime/lib/dart2js_runtime_metrics.dart"
-
-    _internal:
-      uri: "internal/internal.dart"
-      patches: "_internal/js_runtime/lib/internal_patch.dart"
-
-    _js_helper:
-      uri: "_internal/js_runtime/lib/js_helper.dart"
-
-    _late_helper:
-      uri: "_internal/js_runtime/lib/late_helper.dart"
-
-    _rti:
-      uri: "_internal/js_runtime/lib/rti.dart"
-
-    _interceptors:
-      uri: "_internal/js_runtime/lib/interceptors.dart"
-
-    _foreign_helper:
-      uri: "_internal/js_runtime/lib/foreign_helper.dart"
-
-    _js_names:
-      uri: "_internal/js_runtime/lib/js_names.dart"
-
-    _js_primitives:
-      uri: "_internal/js_runtime/lib/js_primitives.dart"
-
-    _js_embedded_names:
-      uri: "_internal/js_runtime/lib/shared/embedded_names.dart"
-
-    _async_await_error_codes:
-      uri: "_internal/js_runtime/lib/shared/async_await_error_codes.dart"
-
-    _recipe_syntax:
-      uri: "_internal/js_runtime/lib/shared/recipe_syntax.dart"
-
     _metadata:
       uri: "html/html_common/metadata.dart"
 
 dart2js_server:
+  include:
+    - target: "_dart2js_common"
+  libraries:
+    _js:
+      uri: "js/_js.dart"
+      patches: "js/_js_server.dart"
+
+_dart2js_common:
   libraries:
     async:
       uri: "async/async.dart"
@@ -308,10 +227,6 @@
       uri: "js/js.dart"
       patches: "_internal/js_runtime/lib/js_patch.dart"
 
-    _js:
-      uri: "js/_js.dart"
-      patches: "js/_js_server.dart"
-
     _js_annotations:
       uri: "js/_js_annotations.dart"
 
diff --git a/tools/VERSION b/tools/VERSION
index 0eafd3c..e8362d8 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 16
 PATCH 0
-PRERELEASE 153
+PRERELEASE 154
 PRERELEASE_PATCH 0
\ No newline at end of file
diff --git a/utils/application_snapshot.gni b/utils/application_snapshot.gni
index 9c4cd3f..bd07d3a 100644
--- a/utils/application_snapshot.gni
+++ b/utils/application_snapshot.gni
@@ -112,6 +112,7 @@
     ]
 
     script = gen_kernel_kernel
+    is_product_flag = dart_runtime_mode == "release"
 
     args = [
       "--packages=" + rebase_path(dot_packages),
@@ -128,6 +129,7 @@
       # (Instead of ensuring every user of the "application_snapshot" /
       # "kernel_snapshot" passes this if needed, we always pass it)
       "-Dsdk_hash=$sdk_hash",
+      "-Ddart.vm.product=$is_product_flag",
     ]
     args += [ rebase_path(main_dart) ]
   }