diff --git a/CHANGELOG.md b/CHANGELOG.md
index ab41e51..46f2467 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,52 @@
 ## 2.18.0
 
+### Language
+
+The following features are new in the Dart 2.18 [language version][]. To use
+them, you must set the lower bound on the SDK constraint for your package to
+2.18 or greater (`sdk: '>=2.18.0 <3.0.0'`).
+
+[language version]: https://dart.dev/guides/language/evolution
+
+-  **[Enhanced type inference for generic invocations with function
+   literals][]**: Invocations of generic methods/constructors that supply
+   function literal arguments now have improved type inference.  This primarily
+   affects the `Iterable.fold` method.  For example, in previous versions of
+   Dart, the compiler would fail to infer an appropriate type for the parameter
+   `a`:
+
+   ```dart
+   void main() {
+     List<int> ints = [1, 2, 3];
+     var maximum = ints.fold(0, (a, b) => a < b ? b : a);
+   }
+   ```
+
+   With this improvement, `a` receives its type from the initial value, `0`.
+
+   On rare occasions, the wrong type will be inferred, leading to a compile-time
+   error, for example in this code, type inference will infer that `a` has a
+   type of `Null`:
+
+   ```dart
+   void main() {
+     List<int> ints = [1, 2, 3];
+     var maximumOrNull = ints.fold(null,
+         (a, b) => a == null || a < b ? b : a);
+   }
+   ```
+
+   This can be worked around by supplying the appropriate type as an explicit
+   type argument to `fold`:
+
+   ```dart
+   void main() {
+     List<int> ints = [1, 2, 3];
+     var maximumOrNull = ints.fold<int?>(null,
+         (a, b) => a == null || a < b ? b : a);
+   }
+   ```
+
 ### Core libraries
 
 #### `dart:html`
diff --git a/DEPS b/DEPS
index 4db49ee..41f4b08 100644
--- a/DEPS
+++ b/DEPS
@@ -83,7 +83,7 @@
   "boringssl_gen_rev": "ced85ef0a00bbca77ce5a91261a5f2ae61b1e62f",
   "boringssl_rev": "87f316d7748268eb56f2dc147bd593254ae93198",
   "browser-compat-data_tag": "ac8cae697014da1ff7124fba33b0b4245cc6cd1b", # v1.0.22
-  "browser_launcher_rev": "c6cc1025d6901926cf022e144ba109677e3548f1",
+  "browser_launcher_rev": "f841375ad337381e23d333b6eaaebde3d8266c68",
   "characters_rev": "4b1d4b7737ad47cd2b8105c47e2159174010f29f",
   "charcode_rev": "84ea427711e24abf3b832923959caa7dd9a8514b",
   "chrome_rev": "19997",
@@ -114,7 +114,7 @@
   "glob_rev": "e10eb2407c58427144004458ef85c9bbf7286e56",
   "html_rev": "f108bce59d136c584969fd24a5006914796cf213",
   "http_io_rev": "405fc79233b4a3d4bb079ebf438bb2caf2f49355",
-  "http_multi_server_rev": "34bf7f04b61cce561f47f7f275c2cc811534a05a",
+  "http_multi_server_rev": "35a3b947256768426090e3b1f5132e4fc23c175d",
   "http_parser_rev": "9126ee04e77fd8e4e2e6435b503ee4dd708d7ddc",
   "http_rev": "2c9b418f5086f999c150d18172d2eec1f963de7b",
   "icu_rev": "81d656878ec611cb0b42d52c82e9dae93920d9ba",
@@ -123,16 +123,15 @@
   "json_rpc_2_rev": "7e00f893440a72de0637970325e4ea44bd1e8c8e",
   "linter_rev": "a8529c6692922b45bc287543b355c90d7b1286d3", # 1.24.0
   "lints_rev": "8294e5648ab49474541527e2911e72e4c5aefe55",
-  "logging_rev": "dfbe88b890c3b4f7bc06da5a7b3b43e9e263b688",
+  "logging_rev": "f6979e3bc3b6e1847a08335b7eb6304e18986195",
   "markdown_rev": "5699cafa9ef004875fd7de8ae9ea00e5295e87a4", # 5.0.0
   "markupsafe_rev": "8f45f5cfa0009d2a70589bcda0349b8cb2b72783",
-  "matcher_rev": "07595a7739d47a8315caba5a8e58fb9ae3d81261",
+  "matcher_rev": "12cdc5fbafd666ed908359ae215d5d0306087969",
   "mime_rev": "c2c5ffd594674f32dc277521369da1557a1622d3",
   "mockito_rev": "1e977a727e82a2e1bdb49b79ef1dce0f23aa1faa",
-  "oauth2_rev": "7cd3284049fe5badbec9f2bea2afc41d14c01057",
-  "package_config_rev": "8731bf10b5375542792a32a0f7c8a6f370583d96",
+  "oauth2_rev": "199ebf15cbd5b07958438184f32e41c4447a57bf",
+  "package_config_rev": "cff98c90acc457a3b0750f0a7da0e351a35e5d0c",
   "path_rev": "3d41ea582f5b0b18de3d90008809b877ff3f69bc",
-  "platform_rev": "1ffad63428bbd1b3ecaa15926bacfb724023648c",
   "ply_rev": "604b32590ffad5cbb82e4afef1d305512d06ae93",
   "pool_rev": "c40cc32eabecb9d60f1045d1403108d968805f9a",
   "protobuf_rev": "b149f801cf7a5e959cf1dbf72d61068ac275f24b",
@@ -140,7 +139,7 @@
   "pub_semver_rev": "ea6c54019948dc03042c595ce9413e17aaf7aa38",
   "root_certificates_rev": "692f6d6488af68e0121317a9c2c9eb393eb0ee50",
   "rust_revision": "b7856f695d65a8ebc846754f97d15814bcb1c244",
-  "shelf_rev": "fadca320b04689be9ec960013843a0d9ee6c4fc4",
+  "shelf_rev": "05f42601d22c9bfe490ceda50e812f83b7d1de77",
   "source_map_stack_trace_rev": "8eabd96b1811e30a11d3c54c9b4afae4fb72e98f",
   "source_maps_rev": "c07a01b8d5547ce3a47ee7a7a2b938a2bc09afe3",
   "source_span_rev": "8ae724c3e67f5afaacead44e93ff145bfb8775c7",
@@ -373,8 +372,6 @@
       "@" + Var("package_config_rev"),
   Var("dart_root") + "/third_party/pkg/path":
       Var("dart_git") + "path.git" + "@" + Var("path_rev"),
-  Var("dart_root") + "/third_party/pkg/platform":
-       Var("dart_git") + "platform.dart.git" + "@" + Var("platform_rev"),
   Var("dart_root") + "/third_party/pkg/pool":
       Var("dart_git") + "pool.git" + "@" + Var("pool_rev"),
   Var("dart_root") + "/third_party/pkg/protobuf":
diff --git a/pkg/_fe_analyzer_shared/pubspec.yaml b/pkg/_fe_analyzer_shared/pubspec.yaml
index 5f4c879..ad5468c 100644
--- a/pkg/_fe_analyzer_shared/pubspec.yaml
+++ b/pkg/_fe_analyzer_shared/pubspec.yaml
@@ -9,5 +9,9 @@
 dependencies:
   meta: ^1.0.2
 
+# We use 'any' version constraints here as we get our package versions from
+# the dart-lang/sdk repo's DEPS file. Note that this is a special case; the
+# best practice for packages is to specify their compatible version ranges.
+# See also https://dart.dev/tools/pub/dependencies.
 dev_dependencies:
-  test: ^1.3.4
+  test: any
diff --git a/pkg/_js_interop_checks/pubspec.yaml b/pkg/_js_interop_checks/pubspec.yaml
index 776dab8..9be1352 100644
--- a/pkg/_js_interop_checks/pubspec.yaml
+++ b/pkg/_js_interop_checks/pubspec.yaml
@@ -5,6 +5,7 @@
 environment:
   sdk: '>=2.12.0 <3.0.0'
 
+# Use 'any' constraints here; we get our versions from the DEPS file.
 dependencies:
   _fe_analyzer_shared: any
   kernel: any
diff --git a/pkg/analysis_server/doc/api.html b/pkg/analysis_server/doc/api.html
index d610cb4..8571ef7 100644
--- a/pkg/analysis_server/doc/api.html
+++ b/pkg/analysis_server/doc/api.html
@@ -109,7 +109,7 @@
 <body>
 <h1>Analysis Server API Specification</h1>
 <h1 style="color:#999999">Version
-  1.33.0
+  1.33.1
 </h1>
 <p>
   This document contains a specification of the API provided by the
@@ -236,6 +236,11 @@
   ignoring the item or treating it with some default/fallback handling.
 </p>
 <h3>Changelog</h3>
+<h4>1.33.1</h4>
+<ul>
+  <li><tt>SourceChange</tt> now has an optional <tt>selectionLength</tt> that may be
+  provided when <tt>selection</tt> is.</li>
+</ul>
 <h4>1.33.0</h4>
 <ul>
   <li>Requests <tt>getSuggestions2</tt> and <tt>getSuggestionDetails2</tt>
@@ -5875,6 +5880,12 @@
           The position that should be selected after the edits have been
           applied.
         </p>
+      </dd><dt class="field"><b>selectionLength: int<span style="color:#999999"> (optional)</span></b></dt><dd>
+        
+        <p>
+          The length of the selection (starting at Position) that should be selected after
+          the edits have been applied.
+        </p>
       </dd><dt class="field"><b>id: String<span style="color:#999999"> (optional)</span></b></dt><dd>
         
         <p>
diff --git a/pkg/analysis_server/lib/lsp_protocol/protocol_custom_generated.dart b/pkg/analysis_server/lib/lsp_protocol/protocol_custom_generated.dart
index f8096bd..de4aa97 100644
--- a/pkg/analysis_server/lib/lsp_protocol/protocol_custom_generated.dart
+++ b/pkg/analysis_server/lib/lsp_protocol/protocol_custom_generated.dart
@@ -6,10 +6,6 @@
 // To regenerate the file, use the script
 // "pkg/analysis_server/tool/lsp_spec/generate_all.dart".
 
-// ignore_for_file: annotate_overrides
-// ignore_for_file: prefer_is_not_operator
-// ignore_for_file: unnecessary_parenthesis
-
 import 'dart:core' hide deprecated;
 import 'dart:core' as core show deprecated;
 import 'dart:convert' show JsonEncoder;
@@ -39,6 +35,7 @@
 
   final bool isAnalyzing;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['isAnalyzing'] = isAnalyzing;
@@ -58,7 +55,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(isAnalyzing is bool)) {
+        if (isAnalyzing is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -112,6 +109,7 @@
   final String label;
   final Range range;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['label'] = label;
@@ -132,7 +130,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(label is String)) {
+        if (label is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -150,7 +148,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(Range.canParse(range, reporter))) {
+        if (!Range.canParse(range, reporter)) {
           reporter.reportError('must be of type Range');
           return false;
         }
@@ -200,10 +198,8 @@
     return CompletionItemResolutionInfo();
   }
 
-  Map<String, Object?> toJson() {
-    var result = <String, Object?>{};
-    return result;
-  }
+  @override
+  Map<String, Object?> toJson() => {};
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
@@ -249,6 +245,7 @@
 
   final int port;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['port'] = port;
@@ -268,7 +265,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(port is int)) {
+        if (port is! int) {
           reporter.reportError('must be of type int');
           return false;
         }
@@ -349,6 +346,7 @@
   final int rLength;
   final int rOffset;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['displayUri'] = displayUri;
@@ -374,7 +372,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(displayUri is String)) {
+        if (displayUri is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -392,7 +390,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(file is String)) {
+        if (file is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -410,7 +408,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(iLength is int)) {
+        if (iLength is! int) {
           reporter.reportError('must be of type int');
           return false;
         }
@@ -428,7 +426,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(libId is int)) {
+        if (libId is! int) {
           reporter.reportError('must be of type int');
           return false;
         }
@@ -446,7 +444,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(offset is int)) {
+        if (offset is! int) {
           reporter.reportError('must be of type int');
           return false;
         }
@@ -464,7 +462,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(rLength is int)) {
+        if (rLength is! int) {
           reporter.reportError('must be of type int');
           return false;
         }
@@ -482,7 +480,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(rOffset is int)) {
+        if (rOffset is! int) {
           reporter.reportError('must be of type int');
           return false;
         }
@@ -574,6 +572,7 @@
   final String? returnType;
   final String? typeParameters;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['kind'] = kind;
@@ -606,7 +605,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(kind is String)) {
+        if (kind is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -624,7 +623,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(name is String)) {
+        if (name is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -634,7 +633,7 @@
       reporter.push('parameters');
       try {
         final parameters = obj['parameters'];
-        if (parameters != null && !(parameters is String)) {
+        if (parameters != null && parameters is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -644,7 +643,7 @@
       reporter.push('range');
       try {
         final range = obj['range'];
-        if (range != null && !(Range.canParse(range, reporter))) {
+        if (range != null && !Range.canParse(range, reporter)) {
           reporter.reportError('must be of type Range');
           return false;
         }
@@ -654,7 +653,7 @@
       reporter.push('returnType');
       try {
         final returnType = obj['returnType'];
-        if (returnType != null && !(returnType is String)) {
+        if (returnType != null && returnType is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -664,7 +663,7 @@
       reporter.push('typeParameters');
       try {
         final typeParameters = obj['typeParameters'];
-        if (typeParameters != null && !(typeParameters is String)) {
+        if (typeParameters != null && typeParameters is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -772,6 +771,7 @@
   final Range range;
   final String? variableName;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (attributes != null) {
@@ -804,9 +804,9 @@
       try {
         final attributes = obj['attributes'];
         if (attributes != null &&
-            !((attributes is List<Object?> &&
-                (attributes.every((item) =>
-                    FlutterOutlineAttribute.canParse(item, reporter)))))) {
+            (attributes is! List<Object?> ||
+                attributes.any((item) =>
+                    !FlutterOutlineAttribute.canParse(item, reporter)))) {
           reporter.reportError('must be of type List<FlutterOutlineAttribute>');
           return false;
         }
@@ -817,9 +817,9 @@
       try {
         final children = obj['children'];
         if (children != null &&
-            !((children is List<Object?> &&
-                (children.every(
-                    (item) => FlutterOutline.canParse(item, reporter)))))) {
+            (children is! List<Object?> ||
+                children
+                    .any((item) => !FlutterOutline.canParse(item, reporter)))) {
           reporter.reportError('must be of type List<FlutterOutline>');
           return false;
         }
@@ -829,7 +829,7 @@
       reporter.push('className');
       try {
         final className = obj['className'];
-        if (className != null && !(className is String)) {
+        if (className != null && className is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -847,7 +847,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(Range.canParse(codeRange, reporter))) {
+        if (!Range.canParse(codeRange, reporter)) {
           reporter.reportError('must be of type Range');
           return false;
         }
@@ -857,7 +857,7 @@
       reporter.push('dartElement');
       try {
         final dartElement = obj['dartElement'];
-        if (dartElement != null && !(Element.canParse(dartElement, reporter))) {
+        if (dartElement != null && !Element.canParse(dartElement, reporter)) {
           reporter.reportError('must be of type Element');
           return false;
         }
@@ -875,7 +875,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(kind is String)) {
+        if (kind is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -885,7 +885,7 @@
       reporter.push('label');
       try {
         final label = obj['label'];
-        if (label != null && !(label is String)) {
+        if (label != null && label is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -903,7 +903,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(Range.canParse(range, reporter))) {
+        if (!Range.canParse(range, reporter)) {
           reporter.reportError('must be of type Range');
           return false;
         }
@@ -913,7 +913,7 @@
       reporter.push('variableName');
       try {
         final variableName = obj['variableName'];
-        if (variableName != null && !(variableName is String)) {
+        if (variableName != null && variableName is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -997,6 +997,7 @@
   final String name;
   final Range? valueRange;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['label'] = label;
@@ -1020,7 +1021,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(label is String)) {
+        if (label is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -1038,7 +1039,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(name is String)) {
+        if (name is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -1048,7 +1049,7 @@
       reporter.push('valueRange');
       try {
         final valueRange = obj['valueRange'];
-        if (valueRange != null && !(Range.canParse(valueRange, reporter))) {
+        if (valueRange != null && !Range.canParse(valueRange, reporter)) {
           reporter.reportError('must be of type Range');
           return false;
         }
@@ -1120,11 +1121,14 @@
     );
   }
 
+  @override
   final int? clientRequestTime;
+  @override
   final String jsonrpc;
   final Method method;
   final Object? params;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (clientRequestTime != null) {
@@ -1143,7 +1147,7 @@
       reporter.push('clientRequestTime');
       try {
         final clientRequestTime = obj['clientRequestTime'];
-        if (clientRequestTime != null && !(clientRequestTime is int)) {
+        if (clientRequestTime != null && clientRequestTime is! int) {
           reporter.reportError('must be of type int');
           return false;
         }
@@ -1161,7 +1165,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(jsonrpc is String)) {
+        if (jsonrpc is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -1179,7 +1183,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(Method.canParse(method, reporter))) {
+        if (!Method.canParse(method, reporter)) {
           reporter.reportError('must be of type Method');
           return false;
         }
@@ -1247,6 +1251,7 @@
   final int? clientRequestTime;
   final String jsonrpc;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (clientRequestTime != null) {
@@ -1261,7 +1266,7 @@
       reporter.push('clientRequestTime');
       try {
         final clientRequestTime = obj['clientRequestTime'];
-        if (clientRequestTime != null && !(clientRequestTime is int)) {
+        if (clientRequestTime != null && clientRequestTime is! int) {
           reporter.reportError('must be of type int');
           return false;
         }
@@ -1279,7 +1284,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(jsonrpc is String)) {
+        if (jsonrpc is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -1342,11 +1347,16 @@
     );
   }
 
+  @override
   final int? clientRequestTime;
+  @override
   final String jsonrpc;
+  @override
   final Method method;
+  @override
   final Object? params;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (clientRequestTime != null) {
@@ -1365,7 +1375,7 @@
       reporter.push('clientRequestTime');
       try {
         final clientRequestTime = obj['clientRequestTime'];
-        if (clientRequestTime != null && !(clientRequestTime is int)) {
+        if (clientRequestTime != null && clientRequestTime is! int) {
           reporter.reportError('must be of type int');
           return false;
         }
@@ -1383,7 +1393,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(jsonrpc is String)) {
+        if (jsonrpc is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -1401,7 +1411,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(Method.canParse(method, reporter))) {
+        if (!Method.canParse(method, reporter)) {
           reporter.reportError('must be of type Method');
           return false;
         }
@@ -1476,6 +1486,7 @@
   final Element element;
   final Range range;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (children != null) {
@@ -1493,9 +1504,8 @@
       try {
         final children = obj['children'];
         if (children != null &&
-            !((children is List<Object?> &&
-                (children
-                    .every((item) => Outline.canParse(item, reporter)))))) {
+            (children is! List<Object?> ||
+                children.any((item) => !Outline.canParse(item, reporter)))) {
           reporter.reportError('must be of type List<Outline>');
           return false;
         }
@@ -1513,7 +1523,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(Range.canParse(codeRange, reporter))) {
+        if (!Range.canParse(codeRange, reporter)) {
           reporter.reportError('must be of type Range');
           return false;
         }
@@ -1531,7 +1541,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(Element.canParse(element, reporter))) {
+        if (!Element.canParse(element, reporter)) {
           reporter.reportError('must be of type Element');
           return false;
         }
@@ -1549,7 +1559,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(Range.canParse(range, reporter))) {
+        if (!Range.canParse(range, reporter)) {
           reporter.reportError('must be of type Range');
           return false;
         }
@@ -1609,6 +1619,7 @@
 
   final String packageName;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['packageName'] = packageName;
@@ -1628,7 +1639,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(packageName is String)) {
+        if (packageName is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -1685,6 +1696,7 @@
   final List<ClosingLabel> labels;
   final String uri;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['labels'] = labels.map((item) => item.toJson()).toList();
@@ -1705,8 +1717,8 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!((labels is List<Object?> &&
-            (labels.every((item) => ClosingLabel.canParse(item, reporter)))))) {
+        if (labels is! List<Object?> ||
+            labels.any((item) => !ClosingLabel.canParse(item, reporter))) {
           reporter.reportError('must be of type List<ClosingLabel>');
           return false;
         }
@@ -1724,7 +1736,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(uri is String)) {
+        if (uri is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -1785,6 +1797,7 @@
   final FlutterOutline outline;
   final String uri;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['outline'] = outline.toJson();
@@ -1805,7 +1818,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(FlutterOutline.canParse(outline, reporter))) {
+        if (!FlutterOutline.canParse(outline, reporter)) {
           reporter.reportError('must be of type FlutterOutline');
           return false;
         }
@@ -1823,7 +1836,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(uri is String)) {
+        if (uri is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -1880,6 +1893,7 @@
   final Outline outline;
   final String uri;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['outline'] = outline.toJson();
@@ -1900,7 +1914,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(Outline.canParse(outline, reporter))) {
+        if (!Outline.canParse(outline, reporter)) {
           reporter.reportError('must be of type Outline');
           return false;
         }
@@ -1918,7 +1932,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(uri is String)) {
+        if (uri is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -1988,12 +2002,17 @@
     );
   }
 
+  @override
   final int? clientRequestTime;
   final Either2<int, String> id;
+  @override
   final String jsonrpc;
+  @override
   final Method method;
+  @override
   final Object? params;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (clientRequestTime != null) {
@@ -2013,7 +2032,7 @@
       reporter.push('clientRequestTime');
       try {
         final clientRequestTime = obj['clientRequestTime'];
-        if (clientRequestTime != null && !(clientRequestTime is int)) {
+        if (clientRequestTime != null && clientRequestTime is! int) {
           reporter.reportError('must be of type int');
           return false;
         }
@@ -2031,7 +2050,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!((id is int || id is String))) {
+        if (id is! int && id is! String) {
           reporter.reportError('must be of type Either2<int, String>');
           return false;
         }
@@ -2049,7 +2068,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(jsonrpc is String)) {
+        if (jsonrpc is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -2067,7 +2086,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(Method.canParse(method, reporter))) {
+        if (!Method.canParse(method, reporter)) {
           reporter.reportError('must be of type Method');
           return false;
         }
@@ -2139,6 +2158,7 @@
   final String? data;
   final String message;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['code'] = code.toJson();
@@ -2162,7 +2182,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(ErrorCodes.canParse(code, reporter))) {
+        if (!ErrorCodes.canParse(code, reporter)) {
           reporter.reportError('must be of type ErrorCodes');
           return false;
         }
@@ -2172,7 +2192,7 @@
       reporter.push('data');
       try {
         final data = obj['data'];
-        if (data != null && !(data is String)) {
+        if (data != null && data is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -2190,7 +2210,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(message is String)) {
+        if (message is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -2267,12 +2287,15 @@
     );
   }
 
+  @override
   final int? clientRequestTime;
   final ResponseError? error;
   final Either2<int, String>? id;
+  @override
   final String jsonrpc;
   final Object? result;
 
+  @override
   Map<String, Object?> toJson() {
     var map = <String, Object?>{};
     if (clientRequestTime != null) {
@@ -2295,7 +2318,7 @@
       reporter.push('clientRequestTime');
       try {
         final clientRequestTime = obj['clientRequestTime'];
-        if (clientRequestTime != null && !(clientRequestTime is int)) {
+        if (clientRequestTime != null && clientRequestTime is! int) {
           reporter.reportError('must be of type int');
           return false;
         }
@@ -2305,7 +2328,7 @@
       reporter.push('error');
       try {
         final error = obj['error'];
-        if (error != null && !(ResponseError.canParse(error, reporter))) {
+        if (error != null && !ResponseError.canParse(error, reporter)) {
           reporter.reportError('must be of type ResponseError');
           return false;
         }
@@ -2319,7 +2342,7 @@
           return false;
         }
         final id = obj['id'];
-        if (id != null && !((id is int || id is String))) {
+        if (id != null && id is! int && id is! String) {
           reporter.reportError('must be of type Either2<int, String>');
           return false;
         }
@@ -2337,7 +2360,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(jsonrpc is String)) {
+        if (jsonrpc is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -2406,12 +2429,15 @@
   final InsertTextFormat insertTextFormat;
 
   /// The string to be inserted. For delete operations use an empty string.
+  @override
   final String newText;
 
   /// The range of the text document to be manipulated. To insert text into a
   /// document create a range where start === end.
+  @override
   final Range range;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['insertTextFormat'] = insertTextFormat.toJson();
@@ -2433,7 +2459,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(InsertTextFormat.canParse(insertTextFormat, reporter))) {
+        if (!InsertTextFormat.canParse(insertTextFormat, reporter)) {
           reporter.reportError('must be of type InsertTextFormat');
           return false;
         }
@@ -2451,7 +2477,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(newText is String)) {
+        if (newText is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -2469,7 +2495,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(Range.canParse(range, reporter))) {
+        if (!Range.canParse(range, reporter)) {
           reporter.reportError('must be of type Range');
           return false;
         }
@@ -2529,6 +2555,7 @@
   final String? message;
   final bool valid;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (message != null) {
@@ -2543,7 +2570,7 @@
       reporter.push('message');
       try {
         final message = obj['message'];
-        if (message != null && !(message is String)) {
+        if (message != null && message is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -2561,7 +2588,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(valid is bool)) {
+        if (valid is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
diff --git a/pkg/analysis_server/lib/lsp_protocol/protocol_generated.dart b/pkg/analysis_server/lib/lsp_protocol/protocol_generated.dart
index 736dda0..9c7edcb 100644
--- a/pkg/analysis_server/lib/lsp_protocol/protocol_generated.dart
+++ b/pkg/analysis_server/lib/lsp_protocol/protocol_generated.dart
@@ -6,10 +6,6 @@
 // To regenerate the file, use the script
 // "pkg/analysis_server/tool/lsp_spec/generate_all.dart".
 
-// ignore_for_file: annotate_overrides
-// ignore_for_file: prefer_is_not_operator
-// ignore_for_file: unnecessary_parenthesis
-
 import 'dart:core' hide deprecated;
 import 'dart:core' as core show deprecated;
 import 'dart:convert' show JsonEncoder;
@@ -51,12 +47,15 @@
   final String annotationId;
 
   /// The string to be inserted. For delete operations use an empty string.
+  @override
   final String newText;
 
   /// The range of the text document to be manipulated. To insert text into a
   /// document create a range where start === end.
+  @override
   final Range range;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['annotationId'] = annotationId;
@@ -78,7 +77,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(annotationId is String)) {
+        if (annotationId is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -96,7 +95,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(newText is String)) {
+        if (newText is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -114,7 +113,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(Range.canParse(range, reporter))) {
+        if (!Range.canParse(range, reporter)) {
           reporter.reportError('must be of type Range');
           return false;
         }
@@ -178,6 +177,7 @@
   /// user interface for example on an undo stack to undo the workspace edit.
   final String? label;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['edit'] = edit.toJson();
@@ -200,7 +200,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(WorkspaceEdit.canParse(edit, reporter))) {
+        if (!WorkspaceEdit.canParse(edit, reporter)) {
           reporter.reportError('must be of type WorkspaceEdit');
           return false;
         }
@@ -210,7 +210,7 @@
       reporter.push('label');
       try {
         final label = obj['label'];
-        if (label != null && !(label is String)) {
+        if (label != null && label is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -282,6 +282,7 @@
   /// error for a request that triggered the edit.
   final String? failureReason;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['applied'] = applied;
@@ -307,7 +308,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(applied is bool)) {
+        if (applied is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -317,7 +318,7 @@
       reporter.push('failedChange');
       try {
         final failedChange = obj['failedChange'];
-        if (failedChange != null && !(failedChange is int)) {
+        if (failedChange != null && failedChange is! int) {
           reporter.reportError('must be of type int');
           return false;
         }
@@ -327,7 +328,7 @@
       reporter.push('failureReason');
       try {
         final failureReason = obj['failureReason'];
-        if (failureReason != null && !(failureReason is String)) {
+        if (failureReason != null && failureReason is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -387,6 +388,7 @@
   /// capability as well.
   final bool? dynamicRegistration;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (dynamicRegistration != null) {
@@ -400,7 +402,7 @@
       reporter.push('dynamicRegistration');
       try {
         final dynamicRegistration = obj['dynamicRegistration'];
-        if (dynamicRegistration != null && !(dynamicRegistration is bool)) {
+        if (dynamicRegistration != null && dynamicRegistration is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -460,6 +462,7 @@
   /// denoted by [`this.from`](#CallHierarchyIncomingCall.from).
   final List<Range> fromRanges;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['from'] = from.toJson();
@@ -480,7 +483,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(CallHierarchyItem.canParse(from, reporter))) {
+        if (!CallHierarchyItem.canParse(from, reporter)) {
           reporter.reportError('must be of type CallHierarchyItem');
           return false;
         }
@@ -498,8 +501,8 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!((fromRanges is List<Object?> &&
-            (fromRanges.every((item) => Range.canParse(item, reporter)))))) {
+        if (fromRanges is! List<Object?> ||
+            fromRanges.any((item) => !Range.canParse(item, reporter))) {
           reporter.reportError('must be of type List<Range>');
           return false;
         }
@@ -577,11 +580,14 @@
 
   /// An optional token that a server can use to report partial results (e.g.
   /// streaming) to the client.
+  @override
   final Either2<int, String>? partialResultToken;
 
   /// An optional token that a server can use to report work done progress.
+  @override
   final Either2<int, String>? workDoneToken;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['item'] = item.toJson();
@@ -607,7 +613,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(CallHierarchyItem.canParse(item, reporter))) {
+        if (!CallHierarchyItem.canParse(item, reporter)) {
           reporter.reportError('must be of type CallHierarchyItem');
           return false;
         }
@@ -618,7 +624,8 @@
       try {
         final partialResultToken = obj['partialResultToken'];
         if (partialResultToken != null &&
-            !((partialResultToken is int || partialResultToken is String))) {
+            partialResultToken is! int &&
+            partialResultToken is! String) {
           reporter.reportError('must be of type Either2<int, String>');
           return false;
         }
@@ -629,7 +636,8 @@
       try {
         final workDoneToken = obj['workDoneToken'];
         if (workDoneToken != null &&
-            !((workDoneToken is int || workDoneToken is String))) {
+            workDoneToken is! int &&
+            workDoneToken is! String) {
           reporter.reportError('must be of type Either2<int, String>');
           return false;
         }
@@ -742,6 +750,7 @@
   /// The resource identifier of this item.
   final String uri;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (data != null) {
@@ -766,7 +775,7 @@
       reporter.push('detail');
       try {
         final detail = obj['detail'];
-        if (detail != null && !(detail is String)) {
+        if (detail != null && detail is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -784,7 +793,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(SymbolKind.canParse(kind, reporter))) {
+        if (!SymbolKind.canParse(kind, reporter)) {
           reporter.reportError('must be of type SymbolKind');
           return false;
         }
@@ -802,7 +811,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(name is String)) {
+        if (name is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -820,7 +829,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(Range.canParse(range, reporter))) {
+        if (!Range.canParse(range, reporter)) {
           reporter.reportError('must be of type Range');
           return false;
         }
@@ -838,7 +847,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(Range.canParse(selectionRange, reporter))) {
+        if (!Range.canParse(selectionRange, reporter)) {
           reporter.reportError('must be of type Range');
           return false;
         }
@@ -849,8 +858,8 @@
       try {
         final tags = obj['tags'];
         if (tags != null &&
-            !((tags is List<Object?> &&
-                (tags.every((item) => SymbolTag.canParse(item, reporter)))))) {
+            (tags is! List<Object?> ||
+                tags.any((item) => !SymbolTag.canParse(item, reporter)))) {
           reporter.reportError('must be of type List<SymbolTag>');
           return false;
         }
@@ -868,7 +877,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(uri is String)) {
+        if (uri is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -934,8 +943,10 @@
     );
   }
 
+  @override
   final bool? workDoneProgress;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (workDoneProgress != null) {
@@ -949,7 +960,7 @@
       reporter.push('workDoneProgress');
       try {
         final workDoneProgress = obj['workDoneProgress'];
-        if (workDoneProgress != null && !(workDoneProgress is bool)) {
+        if (workDoneProgress != null && workDoneProgress is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -1009,6 +1020,7 @@
   /// The item that is called.
   final CallHierarchyItem to;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['fromRanges'] = fromRanges.map((item) => item.toJson()).toList();
@@ -1029,8 +1041,8 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!((fromRanges is List<Object?> &&
-            (fromRanges.every((item) => Range.canParse(item, reporter)))))) {
+        if (fromRanges is! List<Object?> ||
+            fromRanges.any((item) => !Range.canParse(item, reporter))) {
           reporter.reportError('must be of type List<Range>');
           return false;
         }
@@ -1048,7 +1060,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(CallHierarchyItem.canParse(to, reporter))) {
+        if (!CallHierarchyItem.canParse(to, reporter)) {
           reporter.reportError('must be of type CallHierarchyItem');
           return false;
         }
@@ -1126,11 +1138,14 @@
 
   /// An optional token that a server can use to report partial results (e.g.
   /// streaming) to the client.
+  @override
   final Either2<int, String>? partialResultToken;
 
   /// An optional token that a server can use to report work done progress.
+  @override
   final Either2<int, String>? workDoneToken;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['item'] = item.toJson();
@@ -1156,7 +1171,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(CallHierarchyItem.canParse(item, reporter))) {
+        if (!CallHierarchyItem.canParse(item, reporter)) {
           reporter.reportError('must be of type CallHierarchyItem');
           return false;
         }
@@ -1167,7 +1182,8 @@
       try {
         final partialResultToken = obj['partialResultToken'];
         if (partialResultToken != null &&
-            !((partialResultToken is int || partialResultToken is String))) {
+            partialResultToken is! int &&
+            partialResultToken is! String) {
           reporter.reportError('must be of type Either2<int, String>');
           return false;
         }
@@ -1178,7 +1194,8 @@
       try {
         final workDoneToken = obj['workDoneToken'];
         if (workDoneToken != null &&
-            !((workDoneToken is int || workDoneToken is String))) {
+            workDoneToken is! int &&
+            workDoneToken is! String) {
           reporter.reportError('must be of type Either2<int, String>');
           return false;
         }
@@ -1249,14 +1266,18 @@
   }
 
   /// The position inside the text document.
+  @override
   final Position position;
 
   /// The text document.
+  @override
   final TextDocumentIdentifier textDocument;
 
   /// An optional token that a server can use to report work done progress.
+  @override
   final Either2<int, String>? workDoneToken;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['position'] = position.toJson();
@@ -1280,7 +1301,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(Position.canParse(position, reporter))) {
+        if (!Position.canParse(position, reporter)) {
           reporter.reportError('must be of type Position');
           return false;
         }
@@ -1298,7 +1319,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(TextDocumentIdentifier.canParse(textDocument, reporter))) {
+        if (!TextDocumentIdentifier.canParse(textDocument, reporter)) {
           reporter.reportError('must be of type TextDocumentIdentifier');
           return false;
         }
@@ -1309,7 +1330,8 @@
       try {
         final workDoneToken = obj['workDoneToken'];
         if (workDoneToken != null &&
-            !((workDoneToken is int || workDoneToken is String))) {
+            workDoneToken is! int &&
+            workDoneToken is! String) {
           reporter.reportError('must be of type Either2<int, String>');
           return false;
         }
@@ -1365,8 +1387,8 @@
   static CallHierarchyRegistrationOptions fromJson(Map<String, Object?> json) {
     final documentSelectorJson = json['documentSelector'];
     final documentSelector = (documentSelectorJson as List<Object?>?)
-        ?.map(
-            (item) => TextDocumentFilter.fromJson(item as Map<String, Object?>))
+        ?.map((item) =>
+            TextDocumentFilterWithScheme.fromJson(item as Map<String, Object?>))
         .toList();
     final idJson = json['id'];
     final id = idJson as String?;
@@ -1381,13 +1403,17 @@
 
   /// A document selector to identify the scope of the registration. If set to
   /// null the document selector provided on the client side will be used.
-  final List<TextDocumentFilter>? documentSelector;
+  @override
+  final List<TextDocumentFilterWithScheme>? documentSelector;
 
   /// The id used to register the request. The id can be used to deregister the
   /// request again. See also Registration#id.
+  @override
   final String? id;
+  @override
   final bool? workDoneProgress;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['documentSelector'] = documentSelector;
@@ -1410,10 +1436,11 @@
         }
         final documentSelector = obj['documentSelector'];
         if (documentSelector != null &&
-            !((documentSelector is List<Object?> &&
-                (documentSelector.every(
-                    (item) => TextDocumentFilter.canParse(item, reporter)))))) {
-          reporter.reportError('must be of type List<TextDocumentFilter>');
+            (documentSelector is! List<Object?> ||
+                documentSelector.any((item) =>
+                    !TextDocumentFilterWithScheme.canParse(item, reporter)))) {
+          reporter.reportError(
+              'must be of type List<TextDocumentFilterWithScheme>');
           return false;
         }
       } finally {
@@ -1422,7 +1449,7 @@
       reporter.push('id');
       try {
         final id = obj['id'];
-        if (id != null && !(id is String)) {
+        if (id != null && id is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -1432,7 +1459,7 @@
       reporter.push('workDoneProgress');
       try {
         final workDoneProgress = obj['workDoneProgress'];
-        if (workDoneProgress != null && !(workDoneProgress is bool)) {
+        if (workDoneProgress != null && workDoneProgress is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -1450,8 +1477,12 @@
   bool operator ==(Object other) {
     if (other is CallHierarchyRegistrationOptions &&
         other.runtimeType == CallHierarchyRegistrationOptions) {
-      return listEqual(documentSelector, other.documentSelector,
-              (TextDocumentFilter a, TextDocumentFilter b) => a == b) &&
+      return listEqual(
+              documentSelector,
+              other.documentSelector,
+              (TextDocumentFilterWithScheme a,
+                      TextDocumentFilterWithScheme b) =>
+                  a == b) &&
           id == other.id &&
           workDoneProgress == other.workDoneProgress &&
           true;
@@ -1494,6 +1525,7 @@
   /// The request id to cancel.
   final Either2<int, String> id;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['id'] = id;
@@ -1513,7 +1545,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!((id is int || id is String))) {
+        if (id is! int && id is! String) {
           reporter.reportError('must be of type Either2<int, String>');
           return false;
         }
@@ -1581,6 +1613,7 @@
   /// the change.
   final bool? needsConfirmation;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (description != null) {
@@ -1598,7 +1631,7 @@
       reporter.push('description');
       try {
         final description = obj['description'];
-        if (description != null && !(description is String)) {
+        if (description != null && description is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -1616,7 +1649,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(label is String)) {
+        if (label is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -1626,7 +1659,7 @@
       reporter.push('needsConfirmation');
       try {
         final needsConfirmation = obj['needsConfirmation'];
-        if (needsConfirmation != null && !(needsConfirmation is bool)) {
+        if (needsConfirmation != null && needsConfirmation is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -1733,6 +1766,7 @@
   /// Workspace specific client capabilities.
   final WorkspaceClientCapabilities? workspace;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (experimental != null) {
@@ -1762,7 +1796,7 @@
       try {
         final general = obj['general'];
         if (general != null &&
-            !(GeneralClientCapabilities.canParse(general, reporter))) {
+            !GeneralClientCapabilities.canParse(general, reporter)) {
           reporter.reportError('must be of type GeneralClientCapabilities');
           return false;
         }
@@ -1773,8 +1807,8 @@
       try {
         final notebookDocument = obj['notebookDocument'];
         if (notebookDocument != null &&
-            !(NotebookDocumentClientCapabilities.canParse(
-                notebookDocument, reporter))) {
+            !NotebookDocumentClientCapabilities.canParse(
+                notebookDocument, reporter)) {
           reporter.reportError(
               'must be of type NotebookDocumentClientCapabilities');
           return false;
@@ -1786,8 +1820,7 @@
       try {
         final textDocument = obj['textDocument'];
         if (textDocument != null &&
-            !(TextDocumentClientCapabilities.canParse(
-                textDocument, reporter))) {
+            !TextDocumentClientCapabilities.canParse(textDocument, reporter)) {
           reporter
               .reportError('must be of type TextDocumentClientCapabilities');
           return false;
@@ -1799,7 +1832,7 @@
       try {
         final window = obj['window'];
         if (window != null &&
-            !(WindowClientCapabilities.canParse(window, reporter))) {
+            !WindowClientCapabilities.canParse(window, reporter)) {
           reporter.reportError('must be of type WindowClientCapabilities');
           return false;
         }
@@ -1810,7 +1843,7 @@
       try {
         final workspace = obj['workspace'];
         if (workspace != null &&
-            !(WorkspaceClientCapabilities.canParse(workspace, reporter))) {
+            !WorkspaceClientCapabilities.canParse(workspace, reporter)) {
           reporter.reportError('must be of type WorkspaceClientCapabilities');
           return false;
         }
@@ -1962,6 +1995,7 @@
   /// A short, human-readable, title for this code action.
   final String title;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (command != null) {
@@ -1995,7 +2029,7 @@
       reporter.push('command');
       try {
         final command = obj['command'];
-        if (command != null && !(Command.canParse(command, reporter))) {
+        if (command != null && !Command.canParse(command, reporter)) {
           reporter.reportError('must be of type Command');
           return false;
         }
@@ -2006,9 +2040,9 @@
       try {
         final diagnostics = obj['diagnostics'];
         if (diagnostics != null &&
-            !((diagnostics is List<Object?> &&
-                (diagnostics
-                    .every((item) => Diagnostic.canParse(item, reporter)))))) {
+            (diagnostics is! List<Object?> ||
+                diagnostics
+                    .any((item) => !Diagnostic.canParse(item, reporter)))) {
           reporter.reportError('must be of type List<Diagnostic>');
           return false;
         }
@@ -2019,7 +2053,7 @@
       try {
         final disabled = obj['disabled'];
         if (disabled != null &&
-            !(CodeActionDisabled.canParse(disabled, reporter))) {
+            !CodeActionDisabled.canParse(disabled, reporter)) {
           reporter.reportError('must be of type CodeActionDisabled');
           return false;
         }
@@ -2029,7 +2063,7 @@
       reporter.push('edit');
       try {
         final edit = obj['edit'];
-        if (edit != null && !(WorkspaceEdit.canParse(edit, reporter))) {
+        if (edit != null && !WorkspaceEdit.canParse(edit, reporter)) {
           reporter.reportError('must be of type WorkspaceEdit');
           return false;
         }
@@ -2039,7 +2073,7 @@
       reporter.push('isPreferred');
       try {
         final isPreferred = obj['isPreferred'];
-        if (isPreferred != null && !(isPreferred is bool)) {
+        if (isPreferred != null && isPreferred is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -2049,7 +2083,7 @@
       reporter.push('kind');
       try {
         final kind = obj['kind'];
-        if (kind != null && !(CodeActionKind.canParse(kind, reporter))) {
+        if (kind != null && !CodeActionKind.canParse(kind, reporter)) {
           reporter.reportError('must be of type CodeActionKind');
           return false;
         }
@@ -2067,7 +2101,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(title is String)) {
+        if (title is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -2195,6 +2229,7 @@
   ///  @since 3.16.0
   final CodeActionClientCapabilitiesResolveSupport? resolveSupport;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (codeActionLiteralSupport != null) {
@@ -2227,8 +2262,8 @@
       try {
         final codeActionLiteralSupport = obj['codeActionLiteralSupport'];
         if (codeActionLiteralSupport != null &&
-            !(CodeActionClientCapabilitiesCodeActionLiteralSupport.canParse(
-                codeActionLiteralSupport, reporter))) {
+            !CodeActionClientCapabilitiesCodeActionLiteralSupport.canParse(
+                codeActionLiteralSupport, reporter)) {
           reporter.reportError(
               'must be of type CodeActionClientCapabilitiesCodeActionLiteralSupport');
           return false;
@@ -2239,7 +2274,7 @@
       reporter.push('dataSupport');
       try {
         final dataSupport = obj['dataSupport'];
-        if (dataSupport != null && !(dataSupport is bool)) {
+        if (dataSupport != null && dataSupport is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -2249,7 +2284,7 @@
       reporter.push('disabledSupport');
       try {
         final disabledSupport = obj['disabledSupport'];
-        if (disabledSupport != null && !(disabledSupport is bool)) {
+        if (disabledSupport != null && disabledSupport is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -2259,7 +2294,7 @@
       reporter.push('dynamicRegistration');
       try {
         final dynamicRegistration = obj['dynamicRegistration'];
-        if (dynamicRegistration != null && !(dynamicRegistration is bool)) {
+        if (dynamicRegistration != null && dynamicRegistration is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -2270,7 +2305,7 @@
       try {
         final honorsChangeAnnotations = obj['honorsChangeAnnotations'];
         if (honorsChangeAnnotations != null &&
-            !(honorsChangeAnnotations is bool)) {
+            honorsChangeAnnotations is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -2280,7 +2315,7 @@
       reporter.push('isPreferredSupport');
       try {
         final isPreferredSupport = obj['isPreferredSupport'];
-        if (isPreferredSupport != null && !(isPreferredSupport is bool)) {
+        if (isPreferredSupport != null && isPreferredSupport is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -2291,8 +2326,8 @@
       try {
         final resolveSupport = obj['resolveSupport'];
         if (resolveSupport != null &&
-            !(CodeActionClientCapabilitiesResolveSupport.canParse(
-                resolveSupport, reporter))) {
+            !CodeActionClientCapabilitiesResolveSupport.canParse(
+                resolveSupport, reporter)) {
           reporter.reportError(
               'must be of type CodeActionClientCapabilitiesResolveSupport');
           return false;
@@ -2361,6 +2396,7 @@
   /// The code action kind is supported with the following value set.
   final CodeActionLiteralSupportCodeActionKind codeActionKind;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['codeActionKind'] = codeActionKind.toJson();
@@ -2380,8 +2416,8 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(CodeActionLiteralSupportCodeActionKind.canParse(
-            codeActionKind, reporter))) {
+        if (!CodeActionLiteralSupportCodeActionKind.canParse(
+            codeActionKind, reporter)) {
           reporter.reportError(
               'must be of type CodeActionLiteralSupportCodeActionKind');
           return false;
@@ -2437,6 +2473,7 @@
   /// The properties that a client can resolve lazily.
   final List<String> properties;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['properties'] = properties;
@@ -2456,8 +2493,8 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!((properties is List<Object?> &&
-            (properties.every((item) => item is String))))) {
+        if (properties is! List<Object?> ||
+            properties.any((item) => item is! String)) {
           reporter.reportError('must be of type List<String>');
           return false;
         }
@@ -2541,6 +2578,7 @@
   ///  @since 3.17.0
   final CodeActionTriggerKind? triggerKind;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['diagnostics'] = diagnostics.map((item) => item.toJson()).toList();
@@ -2566,9 +2604,8 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!((diagnostics is List<Object?> &&
-            (diagnostics
-                .every((item) => Diagnostic.canParse(item, reporter)))))) {
+        if (diagnostics is! List<Object?> ||
+            diagnostics.any((item) => !Diagnostic.canParse(item, reporter))) {
           reporter.reportError('must be of type List<Diagnostic>');
           return false;
         }
@@ -2579,9 +2616,8 @@
       try {
         final only = obj['only'];
         if (only != null &&
-            !((only is List<Object?> &&
-                (only.every(
-                    (item) => CodeActionKind.canParse(item, reporter)))))) {
+            (only is! List<Object?> ||
+                only.any((item) => !CodeActionKind.canParse(item, reporter)))) {
           reporter.reportError('must be of type List<CodeActionKind>');
           return false;
         }
@@ -2592,7 +2628,7 @@
       try {
         final triggerKind = obj['triggerKind'];
         if (triggerKind != null &&
-            !(CodeActionTriggerKind.canParse(triggerKind, reporter))) {
+            !CodeActionTriggerKind.canParse(triggerKind, reporter)) {
           reporter.reportError('must be of type CodeActionTriggerKind');
           return false;
         }
@@ -2652,6 +2688,7 @@
   /// This is displayed in the code actions UI.
   final String reason;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['reason'] = reason;
@@ -2671,7 +2708,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(reason is String)) {
+        if (reason is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -2769,6 +2806,7 @@
   /// Base kind for an organize imports source action: `source.organizeImports`.
   static const SourceOrganizeImports = CodeActionKind('source.organizeImports');
 
+  @override
   Object toJson() => _value;
 
   @override
@@ -2777,6 +2815,7 @@
   @override
   int get hashCode => _value.hashCode;
 
+  @override
   bool operator ==(Object other) =>
       other is CodeActionKind && other._value == _value;
 }
@@ -2806,6 +2845,7 @@
   /// gracefully and falls back to a default value when unknown.
   final List<CodeActionKind> valueSet;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['valueSet'] = valueSet.map((item) => item.toJson()).toList();
@@ -2825,9 +2865,8 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!((valueSet is List<Object?> &&
-            (valueSet
-                .every((item) => CodeActionKind.canParse(item, reporter)))))) {
+        if (valueSet is! List<Object?> ||
+            valueSet.any((item) => !CodeActionKind.canParse(item, reporter))) {
           reporter.reportError('must be of type List<CodeActionKind>');
           return false;
         }
@@ -2900,8 +2939,10 @@
   /// action.
   ///  @since 3.16.0
   final bool? resolveProvider;
+  @override
   final bool? workDoneProgress;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (codeActionKinds != null) {
@@ -2923,9 +2964,9 @@
       try {
         final codeActionKinds = obj['codeActionKinds'];
         if (codeActionKinds != null &&
-            !((codeActionKinds is List<Object?> &&
-                (codeActionKinds.every(
-                    (item) => CodeActionKind.canParse(item, reporter)))))) {
+            (codeActionKinds is! List<Object?> ||
+                codeActionKinds
+                    .any((item) => !CodeActionKind.canParse(item, reporter)))) {
           reporter.reportError('must be of type List<CodeActionKind>');
           return false;
         }
@@ -2935,7 +2976,7 @@
       reporter.push('resolveProvider');
       try {
         final resolveProvider = obj['resolveProvider'];
-        if (resolveProvider != null && !(resolveProvider is bool)) {
+        if (resolveProvider != null && resolveProvider is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -2945,7 +2986,7 @@
       reporter.push('workDoneProgress');
       try {
         final workDoneProgress = obj['workDoneProgress'];
-        if (workDoneProgress != null && !(workDoneProgress is bool)) {
+        if (workDoneProgress != null && workDoneProgress is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -3036,6 +3077,7 @@
 
   /// An optional token that a server can use to report partial results (e.g.
   /// streaming) to the client.
+  @override
   final Either2<int, String>? partialResultToken;
 
   /// The range for which the command was invoked.
@@ -3045,8 +3087,10 @@
   final TextDocumentIdentifier textDocument;
 
   /// An optional token that a server can use to report work done progress.
+  @override
   final Either2<int, String>? workDoneToken;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['context'] = context.toJson();
@@ -3074,7 +3118,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(CodeActionContext.canParse(context, reporter))) {
+        if (!CodeActionContext.canParse(context, reporter)) {
           reporter.reportError('must be of type CodeActionContext');
           return false;
         }
@@ -3085,7 +3129,8 @@
       try {
         final partialResultToken = obj['partialResultToken'];
         if (partialResultToken != null &&
-            !((partialResultToken is int || partialResultToken is String))) {
+            partialResultToken is! int &&
+            partialResultToken is! String) {
           reporter.reportError('must be of type Either2<int, String>');
           return false;
         }
@@ -3103,7 +3148,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(Range.canParse(range, reporter))) {
+        if (!Range.canParse(range, reporter)) {
           reporter.reportError('must be of type Range');
           return false;
         }
@@ -3121,7 +3166,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(TextDocumentIdentifier.canParse(textDocument, reporter))) {
+        if (!TextDocumentIdentifier.canParse(textDocument, reporter)) {
           reporter.reportError('must be of type TextDocumentIdentifier');
           return false;
         }
@@ -3132,7 +3177,8 @@
       try {
         final workDoneToken = obj['workDoneToken'];
         if (workDoneToken != null &&
-            !((workDoneToken is int || workDoneToken is String))) {
+            workDoneToken is! int &&
+            workDoneToken is! String) {
           reporter.reportError('must be of type Either2<int, String>');
           return false;
         }
@@ -3192,8 +3238,8 @@
         .toList();
     final documentSelectorJson = json['documentSelector'];
     final documentSelector = (documentSelectorJson as List<Object?>?)
-        ?.map(
-            (item) => TextDocumentFilter.fromJson(item as Map<String, Object?>))
+        ?.map((item) =>
+            TextDocumentFilterWithScheme.fromJson(item as Map<String, Object?>))
         .toList();
     final resolveProviderJson = json['resolveProvider'];
     final resolveProvider = resolveProviderJson as bool?;
@@ -3211,18 +3257,23 @@
   ///
   /// The list of kinds may be generic, such as `CodeActionKind.Refactor`, or
   /// the server may list out every specific kind they provide.
+  @override
   final List<CodeActionKind>? codeActionKinds;
 
   /// A document selector to identify the scope of the registration. If set to
   /// null the document selector provided on the client side will be used.
-  final List<TextDocumentFilter>? documentSelector;
+  @override
+  final List<TextDocumentFilterWithScheme>? documentSelector;
 
   /// The server provides support to resolve additional information for a code
   /// action.
   ///  @since 3.16.0
+  @override
   final bool? resolveProvider;
+  @override
   final bool? workDoneProgress;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (codeActionKinds != null) {
@@ -3245,9 +3296,9 @@
       try {
         final codeActionKinds = obj['codeActionKinds'];
         if (codeActionKinds != null &&
-            !((codeActionKinds is List<Object?> &&
-                (codeActionKinds.every(
-                    (item) => CodeActionKind.canParse(item, reporter)))))) {
+            (codeActionKinds is! List<Object?> ||
+                codeActionKinds
+                    .any((item) => !CodeActionKind.canParse(item, reporter)))) {
           reporter.reportError('must be of type List<CodeActionKind>');
           return false;
         }
@@ -3262,10 +3313,11 @@
         }
         final documentSelector = obj['documentSelector'];
         if (documentSelector != null &&
-            !((documentSelector is List<Object?> &&
-                (documentSelector.every(
-                    (item) => TextDocumentFilter.canParse(item, reporter)))))) {
-          reporter.reportError('must be of type List<TextDocumentFilter>');
+            (documentSelector is! List<Object?> ||
+                documentSelector.any((item) =>
+                    !TextDocumentFilterWithScheme.canParse(item, reporter)))) {
+          reporter.reportError(
+              'must be of type List<TextDocumentFilterWithScheme>');
           return false;
         }
       } finally {
@@ -3274,7 +3326,7 @@
       reporter.push('resolveProvider');
       try {
         final resolveProvider = obj['resolveProvider'];
-        if (resolveProvider != null && !(resolveProvider is bool)) {
+        if (resolveProvider != null && resolveProvider is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -3284,7 +3336,7 @@
       reporter.push('workDoneProgress');
       try {
         final workDoneProgress = obj['workDoneProgress'];
-        if (workDoneProgress != null && !(workDoneProgress is bool)) {
+        if (workDoneProgress != null && workDoneProgress is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -3304,8 +3356,12 @@
         other.runtimeType == CodeActionRegistrationOptions) {
       return listEqual(codeActionKinds, other.codeActionKinds,
               (CodeActionKind a, CodeActionKind b) => a == b) &&
-          listEqual(documentSelector, other.documentSelector,
-              (TextDocumentFilter a, TextDocumentFilter b) => a == b) &&
+          listEqual(
+              documentSelector,
+              other.documentSelector,
+              (TextDocumentFilterWithScheme a,
+                      TextDocumentFilterWithScheme b) =>
+                  a == b) &&
           resolveProvider == other.resolveProvider &&
           workDoneProgress == other.workDoneProgress &&
           true;
@@ -3346,6 +3402,7 @@
   /// Code actions were explicitly requested by the user or by an extension.
   static const Invoked = CodeActionTriggerKind(1);
 
+  @override
   Object toJson() => _value;
 
   @override
@@ -3354,6 +3411,7 @@
   @override
   int get hashCode => _value.hashCode;
 
+  @override
   bool operator ==(Object other) =>
       other is CodeActionTriggerKind && other._value == _value;
 }
@@ -3380,6 +3438,7 @@
   /// An URI to open with more information about the diagnostic error.
   final String href;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['href'] = href;
@@ -3399,7 +3458,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(href is String)) {
+        if (href is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -3472,6 +3531,7 @@
   /// line.
   final Range range;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (command != null) {
@@ -3489,7 +3549,7 @@
       reporter.push('command');
       try {
         final command = obj['command'];
-        if (command != null && !(Command.canParse(command, reporter))) {
+        if (command != null && !Command.canParse(command, reporter)) {
           reporter.reportError('must be of type Command');
           return false;
         }
@@ -3507,7 +3567,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(Range.canParse(range, reporter))) {
+        if (!Range.canParse(range, reporter)) {
           reporter.reportError('must be of type Range');
           return false;
         }
@@ -3563,6 +3623,7 @@
   /// Whether code lens supports dynamic registration.
   final bool? dynamicRegistration;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (dynamicRegistration != null) {
@@ -3576,7 +3637,7 @@
       reporter.push('dynamicRegistration');
       try {
         final dynamicRegistration = obj['dynamicRegistration'];
-        if (dynamicRegistration != null && !(dynamicRegistration is bool)) {
+        if (dynamicRegistration != null && dynamicRegistration is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -3632,8 +3693,10 @@
 
   /// Code lens has a resolve provider as well.
   final bool? resolveProvider;
+  @override
   final bool? workDoneProgress;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (resolveProvider != null) {
@@ -3650,7 +3713,7 @@
       reporter.push('resolveProvider');
       try {
         final resolveProvider = obj['resolveProvider'];
-        if (resolveProvider != null && !(resolveProvider is bool)) {
+        if (resolveProvider != null && resolveProvider is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -3660,7 +3723,7 @@
       reporter.push('workDoneProgress');
       try {
         final workDoneProgress = obj['workDoneProgress'];
-        if (workDoneProgress != null && !(workDoneProgress is bool)) {
+        if (workDoneProgress != null && workDoneProgress is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -3735,14 +3798,17 @@
 
   /// An optional token that a server can use to report partial results (e.g.
   /// streaming) to the client.
+  @override
   final Either2<int, String>? partialResultToken;
 
   /// The document to request code lens for.
   final TextDocumentIdentifier textDocument;
 
   /// An optional token that a server can use to report work done progress.
+  @override
   final Either2<int, String>? workDoneToken;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (partialResultToken != null) {
@@ -3761,7 +3827,8 @@
       try {
         final partialResultToken = obj['partialResultToken'];
         if (partialResultToken != null &&
-            !((partialResultToken is int || partialResultToken is String))) {
+            partialResultToken is! int &&
+            partialResultToken is! String) {
           reporter.reportError('must be of type Either2<int, String>');
           return false;
         }
@@ -3779,7 +3846,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(TextDocumentIdentifier.canParse(textDocument, reporter))) {
+        if (!TextDocumentIdentifier.canParse(textDocument, reporter)) {
           reporter.reportError('must be of type TextDocumentIdentifier');
           return false;
         }
@@ -3790,7 +3857,8 @@
       try {
         final workDoneToken = obj['workDoneToken'];
         if (workDoneToken != null &&
-            !((workDoneToken is int || workDoneToken is String))) {
+            workDoneToken is! int &&
+            workDoneToken is! String) {
           reporter.reportError('must be of type Either2<int, String>');
           return false;
         }
@@ -3841,8 +3909,8 @@
   static CodeLensRegistrationOptions fromJson(Map<String, Object?> json) {
     final documentSelectorJson = json['documentSelector'];
     final documentSelector = (documentSelectorJson as List<Object?>?)
-        ?.map(
-            (item) => TextDocumentFilter.fromJson(item as Map<String, Object?>))
+        ?.map((item) =>
+            TextDocumentFilterWithScheme.fromJson(item as Map<String, Object?>))
         .toList();
     final resolveProviderJson = json['resolveProvider'];
     final resolveProvider = resolveProviderJson as bool?;
@@ -3857,12 +3925,16 @@
 
   /// A document selector to identify the scope of the registration. If set to
   /// null the document selector provided on the client side will be used.
-  final List<TextDocumentFilter>? documentSelector;
+  @override
+  final List<TextDocumentFilterWithScheme>? documentSelector;
 
   /// Code lens has a resolve provider as well.
+  @override
   final bool? resolveProvider;
+  @override
   final bool? workDoneProgress;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['documentSelector'] = documentSelector;
@@ -3885,10 +3957,11 @@
         }
         final documentSelector = obj['documentSelector'];
         if (documentSelector != null &&
-            !((documentSelector is List<Object?> &&
-                (documentSelector.every(
-                    (item) => TextDocumentFilter.canParse(item, reporter)))))) {
-          reporter.reportError('must be of type List<TextDocumentFilter>');
+            (documentSelector is! List<Object?> ||
+                documentSelector.any((item) =>
+                    !TextDocumentFilterWithScheme.canParse(item, reporter)))) {
+          reporter.reportError(
+              'must be of type List<TextDocumentFilterWithScheme>');
           return false;
         }
       } finally {
@@ -3897,7 +3970,7 @@
       reporter.push('resolveProvider');
       try {
         final resolveProvider = obj['resolveProvider'];
-        if (resolveProvider != null && !(resolveProvider is bool)) {
+        if (resolveProvider != null && resolveProvider is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -3907,7 +3980,7 @@
       reporter.push('workDoneProgress');
       try {
         final workDoneProgress = obj['workDoneProgress'];
-        if (workDoneProgress != null && !(workDoneProgress is bool)) {
+        if (workDoneProgress != null && workDoneProgress is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -3925,8 +3998,12 @@
   bool operator ==(Object other) {
     if (other is CodeLensRegistrationOptions &&
         other.runtimeType == CodeLensRegistrationOptions) {
-      return listEqual(documentSelector, other.documentSelector,
-              (TextDocumentFilter a, TextDocumentFilter b) => a == b) &&
+      return listEqual(
+              documentSelector,
+              other.documentSelector,
+              (TextDocumentFilterWithScheme a,
+                      TextDocumentFilterWithScheme b) =>
+                  a == b) &&
           resolveProvider == other.resolveProvider &&
           workDoneProgress == other.workDoneProgress &&
           true;
@@ -3972,6 +4049,7 @@
   /// change that requires such a calculation.
   final bool? refreshSupport;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (refreshSupport != null) {
@@ -3985,7 +4063,7 @@
       reporter.push('refreshSupport');
       try {
         final refreshSupport = obj['refreshSupport'];
-        if (refreshSupport != null && !(refreshSupport is bool)) {
+        if (refreshSupport != null && refreshSupport is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -4058,6 +4136,7 @@
   /// The red component of this color in the range [0-1].
   final num red;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['alpha'] = alpha;
@@ -4080,7 +4159,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(alpha is num)) {
+        if (alpha is! num) {
           reporter.reportError('must be of type num');
           return false;
         }
@@ -4098,7 +4177,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(blue is num)) {
+        if (blue is! num) {
           reporter.reportError('must be of type num');
           return false;
         }
@@ -4116,7 +4195,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(green is num)) {
+        if (green is! num) {
           reporter.reportError('must be of type num');
           return false;
         }
@@ -4134,7 +4213,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(red is num)) {
+        if (red is! num) {
           reporter.reportError('must be of type num');
           return false;
         }
@@ -4199,6 +4278,7 @@
   /// The range in the document where this color appears.
   final Range range;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['color'] = color.toJson();
@@ -4219,7 +4299,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(Color.canParse(color, reporter))) {
+        if (!Color.canParse(color, reporter)) {
           reporter.reportError('must be of type Color');
           return false;
         }
@@ -4237,7 +4317,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(Range.canParse(range, reporter))) {
+        if (!Range.canParse(range, reporter)) {
           reporter.reportError('must be of type Range');
           return false;
         }
@@ -4313,6 +4393,7 @@
   /// [label](#ColorPresentation.label) is used.
   final TextEdit? textEdit;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (additionalTextEdits != null) {
@@ -4332,9 +4413,9 @@
       try {
         final additionalTextEdits = obj['additionalTextEdits'];
         if (additionalTextEdits != null &&
-            !((additionalTextEdits is List<Object?> &&
-                (additionalTextEdits
-                    .every((item) => TextEdit.canParse(item, reporter)))))) {
+            (additionalTextEdits is! List<Object?> ||
+                additionalTextEdits
+                    .any((item) => !TextEdit.canParse(item, reporter)))) {
           reporter.reportError('must be of type List<TextEdit>');
           return false;
         }
@@ -4352,7 +4433,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(label is String)) {
+        if (label is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -4362,7 +4443,7 @@
       reporter.push('textEdit');
       try {
         final textEdit = obj['textEdit'];
-        if (textEdit != null && !(TextEdit.canParse(textEdit, reporter))) {
+        if (textEdit != null && !TextEdit.canParse(textEdit, reporter)) {
           reporter.reportError('must be of type TextEdit');
           return false;
         }
@@ -4451,6 +4532,7 @@
 
   /// An optional token that a server can use to report partial results (e.g.
   /// streaming) to the client.
+  @override
   final Either2<int, String>? partialResultToken;
 
   /// The range where the color would be inserted. Serves as a context.
@@ -4460,8 +4542,10 @@
   final TextDocumentIdentifier textDocument;
 
   /// An optional token that a server can use to report work done progress.
+  @override
   final Either2<int, String>? workDoneToken;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['color'] = color.toJson();
@@ -4489,7 +4573,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(Color.canParse(color, reporter))) {
+        if (!Color.canParse(color, reporter)) {
           reporter.reportError('must be of type Color');
           return false;
         }
@@ -4500,7 +4584,8 @@
       try {
         final partialResultToken = obj['partialResultToken'];
         if (partialResultToken != null &&
-            !((partialResultToken is int || partialResultToken is String))) {
+            partialResultToken is! int &&
+            partialResultToken is! String) {
           reporter.reportError('must be of type Either2<int, String>');
           return false;
         }
@@ -4518,7 +4603,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(Range.canParse(range, reporter))) {
+        if (!Range.canParse(range, reporter)) {
           reporter.reportError('must be of type Range');
           return false;
         }
@@ -4536,7 +4621,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(TextDocumentIdentifier.canParse(textDocument, reporter))) {
+        if (!TextDocumentIdentifier.canParse(textDocument, reporter)) {
           reporter.reportError('must be of type TextDocumentIdentifier');
           return false;
         }
@@ -4547,7 +4632,8 @@
       try {
         final workDoneToken = obj['workDoneToken'];
         if (workDoneToken != null &&
-            !((workDoneToken is int || workDoneToken is String))) {
+            workDoneToken is! int &&
+            workDoneToken is! String) {
           reporter.reportError('must be of type Either2<int, String>');
           return false;
         }
@@ -4623,6 +4709,7 @@
   /// Title of the command, like `save`.
   final String title;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (arguments != null) {
@@ -4639,8 +4726,7 @@
       try {
         final arguments = obj['arguments'];
         if (arguments != null &&
-            !((arguments is List<Object?> &&
-                (arguments.every((item) => true))))) {
+            (arguments is! List<Object?> || arguments.any((item) => false))) {
           reporter.reportError('must be of type List<Object?>');
           return false;
         }
@@ -4658,7 +4744,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(command is String)) {
+        if (command is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -4676,7 +4762,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(title is String)) {
+        if (title is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -4781,6 +4867,7 @@
   ///  @since 3.17.0
   final InsertTextMode? insertTextMode;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (completionItem != null) {
@@ -4810,8 +4897,8 @@
       try {
         final completionItem = obj['completionItem'];
         if (completionItem != null &&
-            !(CompletionClientCapabilitiesCompletionItem.canParse(
-                completionItem, reporter))) {
+            !CompletionClientCapabilitiesCompletionItem.canParse(
+                completionItem, reporter)) {
           reporter.reportError(
               'must be of type CompletionClientCapabilitiesCompletionItem');
           return false;
@@ -4823,8 +4910,8 @@
       try {
         final completionItemKind = obj['completionItemKind'];
         if (completionItemKind != null &&
-            !(CompletionClientCapabilitiesCompletionItemKind.canParse(
-                completionItemKind, reporter))) {
+            !CompletionClientCapabilitiesCompletionItemKind.canParse(
+                completionItemKind, reporter)) {
           reporter.reportError(
               'must be of type CompletionClientCapabilitiesCompletionItemKind');
           return false;
@@ -4836,8 +4923,8 @@
       try {
         final completionList = obj['completionList'];
         if (completionList != null &&
-            !(CompletionClientCapabilitiesCompletionList.canParse(
-                completionList, reporter))) {
+            !CompletionClientCapabilitiesCompletionList.canParse(
+                completionList, reporter)) {
           reporter.reportError(
               'must be of type CompletionClientCapabilitiesCompletionList');
           return false;
@@ -4848,7 +4935,7 @@
       reporter.push('contextSupport');
       try {
         final contextSupport = obj['contextSupport'];
-        if (contextSupport != null && !(contextSupport is bool)) {
+        if (contextSupport != null && contextSupport is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -4858,7 +4945,7 @@
       reporter.push('dynamicRegistration');
       try {
         final dynamicRegistration = obj['dynamicRegistration'];
-        if (dynamicRegistration != null && !(dynamicRegistration is bool)) {
+        if (dynamicRegistration != null && dynamicRegistration is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -4869,7 +4956,7 @@
       try {
         final insertTextMode = obj['insertTextMode'];
         if (insertTextMode != null &&
-            !(InsertTextMode.canParse(insertTextMode, reporter))) {
+            !InsertTextMode.canParse(insertTextMode, reporter)) {
           reporter.reportError('must be of type InsertTextMode');
           return false;
         }
@@ -5027,6 +5114,7 @@
   ///  @since 3.15.0
   final CompletionItemTagSupport? tagSupport;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (commitCharactersSupport != null) {
@@ -5069,7 +5157,7 @@
       try {
         final commitCharactersSupport = obj['commitCharactersSupport'];
         if (commitCharactersSupport != null &&
-            !(commitCharactersSupport is bool)) {
+            commitCharactersSupport is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -5079,7 +5167,7 @@
       reporter.push('deprecatedSupport');
       try {
         final deprecatedSupport = obj['deprecatedSupport'];
-        if (deprecatedSupport != null && !(deprecatedSupport is bool)) {
+        if (deprecatedSupport != null && deprecatedSupport is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -5090,9 +5178,9 @@
       try {
         final documentationFormat = obj['documentationFormat'];
         if (documentationFormat != null &&
-            !((documentationFormat is List<Object?> &&
-                (documentationFormat
-                    .every((item) => MarkupKind.canParse(item, reporter)))))) {
+            (documentationFormat is! List<Object?> ||
+                documentationFormat
+                    .any((item) => !MarkupKind.canParse(item, reporter)))) {
           reporter.reportError('must be of type List<MarkupKind>');
           return false;
         }
@@ -5102,7 +5190,7 @@
       reporter.push('insertReplaceSupport');
       try {
         final insertReplaceSupport = obj['insertReplaceSupport'];
-        if (insertReplaceSupport != null && !(insertReplaceSupport is bool)) {
+        if (insertReplaceSupport != null && insertReplaceSupport is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -5113,8 +5201,8 @@
       try {
         final insertTextModeSupport = obj['insertTextModeSupport'];
         if (insertTextModeSupport != null &&
-            !(CompletionItemInsertTextModeSupport.canParse(
-                insertTextModeSupport, reporter))) {
+            !CompletionItemInsertTextModeSupport.canParse(
+                insertTextModeSupport, reporter)) {
           reporter.reportError(
               'must be of type CompletionItemInsertTextModeSupport');
           return false;
@@ -5125,7 +5213,7 @@
       reporter.push('labelDetailsSupport');
       try {
         final labelDetailsSupport = obj['labelDetailsSupport'];
-        if (labelDetailsSupport != null && !(labelDetailsSupport is bool)) {
+        if (labelDetailsSupport != null && labelDetailsSupport is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -5135,7 +5223,7 @@
       reporter.push('preselectSupport');
       try {
         final preselectSupport = obj['preselectSupport'];
-        if (preselectSupport != null && !(preselectSupport is bool)) {
+        if (preselectSupport != null && preselectSupport is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -5146,8 +5234,7 @@
       try {
         final resolveSupport = obj['resolveSupport'];
         if (resolveSupport != null &&
-            !(CompletionItemResolveSupport.canParse(
-                resolveSupport, reporter))) {
+            !CompletionItemResolveSupport.canParse(resolveSupport, reporter)) {
           reporter.reportError('must be of type CompletionItemResolveSupport');
           return false;
         }
@@ -5157,7 +5244,7 @@
       reporter.push('snippetSupport');
       try {
         final snippetSupport = obj['snippetSupport'];
-        if (snippetSupport != null && !(snippetSupport is bool)) {
+        if (snippetSupport != null && snippetSupport is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -5168,7 +5255,7 @@
       try {
         final tagSupport = obj['tagSupport'];
         if (tagSupport != null &&
-            !(CompletionItemTagSupport.canParse(tagSupport, reporter))) {
+            !CompletionItemTagSupport.canParse(tagSupport, reporter)) {
           reporter.reportError('must be of type CompletionItemTagSupport');
           return false;
         }
@@ -5250,6 +5337,7 @@
   /// of the protocol.
   final List<CompletionItemKind>? valueSet;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (valueSet != null) {
@@ -5264,9 +5352,9 @@
       try {
         final valueSet = obj['valueSet'];
         if (valueSet != null &&
-            !((valueSet is List<Object?> &&
-                (valueSet.every(
-                    (item) => CompletionItemKind.canParse(item, reporter)))))) {
+            (valueSet is! List<Object?> ||
+                valueSet.any(
+                    (item) => !CompletionItemKind.canParse(item, reporter)))) {
           reporter.reportError('must be of type List<CompletionItemKind>');
           return false;
         }
@@ -5327,6 +5415,7 @@
   ///  @since 3.17.0
   final List<String>? itemDefaults;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (itemDefaults != null) {
@@ -5341,8 +5430,8 @@
       try {
         final itemDefaults = obj['itemDefaults'];
         if (itemDefaults != null &&
-            !((itemDefaults is List<Object?> &&
-                (itemDefaults.every((item) => item is String))))) {
+            (itemDefaults is! List<Object?> ||
+                itemDefaults.any((item) => item is! String))) {
           reporter.reportError('must be of type List<String>');
           return false;
         }
@@ -5405,6 +5494,7 @@
   /// How the completion was triggered.
   final CompletionTriggerKind triggerKind;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (triggerCharacter != null) {
@@ -5419,7 +5509,7 @@
       reporter.push('triggerCharacter');
       try {
         final triggerCharacter = obj['triggerCharacter'];
-        if (triggerCharacter != null && !(triggerCharacter is String)) {
+        if (triggerCharacter != null && triggerCharacter is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -5437,7 +5527,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(CompletionTriggerKind.canParse(triggerKind, reporter))) {
+        if (!CompletionTriggerKind.canParse(triggerKind, reporter)) {
           reporter.reportError('must be of type CompletionTriggerKind');
           return false;
         }
@@ -5728,6 +5818,7 @@
   ///  @since 3.17.0
   final String? textEditText;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (additionalTextEdits != null) {
@@ -5795,9 +5886,9 @@
       try {
         final additionalTextEdits = obj['additionalTextEdits'];
         if (additionalTextEdits != null &&
-            !((additionalTextEdits is List<Object?> &&
-                (additionalTextEdits
-                    .every((item) => TextEdit.canParse(item, reporter)))))) {
+            (additionalTextEdits is! List<Object?> ||
+                additionalTextEdits
+                    .any((item) => !TextEdit.canParse(item, reporter)))) {
           reporter.reportError('must be of type List<TextEdit>');
           return false;
         }
@@ -5807,7 +5898,7 @@
       reporter.push('command');
       try {
         final command = obj['command'];
-        if (command != null && !(Command.canParse(command, reporter))) {
+        if (command != null && !Command.canParse(command, reporter)) {
           reporter.reportError('must be of type Command');
           return false;
         }
@@ -5818,8 +5909,8 @@
       try {
         final commitCharacters = obj['commitCharacters'];
         if (commitCharacters != null &&
-            !((commitCharacters is List<Object?> &&
-                (commitCharacters.every((item) => item is String))))) {
+            (commitCharacters is! List<Object?> ||
+                commitCharacters.any((item) => item is! String))) {
           reporter.reportError('must be of type List<String>');
           return false;
         }
@@ -5830,7 +5921,7 @@
       try {
         final data = obj['data'];
         if (data != null &&
-            !(CompletionItemResolutionInfo.canParse(data, reporter))) {
+            !CompletionItemResolutionInfo.canParse(data, reporter)) {
           reporter.reportError('must be of type CompletionItemResolutionInfo');
           return false;
         }
@@ -5840,7 +5931,7 @@
       reporter.push('deprecated');
       try {
         final deprecated = obj['deprecated'];
-        if (deprecated != null && !(deprecated is bool)) {
+        if (deprecated != null && deprecated is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -5850,7 +5941,7 @@
       reporter.push('detail');
       try {
         final detail = obj['detail'];
-        if (detail != null && !(detail is String)) {
+        if (detail != null && detail is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -5861,8 +5952,8 @@
       try {
         final documentation = obj['documentation'];
         if (documentation != null &&
-            !((MarkupContent.canParse(documentation, reporter) ||
-                documentation is String))) {
+            !MarkupContent.canParse(documentation, reporter) &&
+            documentation is! String) {
           reporter
               .reportError('must be of type Either2<MarkupContent, String>');
           return false;
@@ -5873,7 +5964,7 @@
       reporter.push('filterText');
       try {
         final filterText = obj['filterText'];
-        if (filterText != null && !(filterText is String)) {
+        if (filterText != null && filterText is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -5883,7 +5974,7 @@
       reporter.push('insertText');
       try {
         final insertText = obj['insertText'];
-        if (insertText != null && !(insertText is String)) {
+        if (insertText != null && insertText is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -5894,7 +5985,7 @@
       try {
         final insertTextFormat = obj['insertTextFormat'];
         if (insertTextFormat != null &&
-            !(InsertTextFormat.canParse(insertTextFormat, reporter))) {
+            !InsertTextFormat.canParse(insertTextFormat, reporter)) {
           reporter.reportError('must be of type InsertTextFormat');
           return false;
         }
@@ -5905,7 +5996,7 @@
       try {
         final insertTextMode = obj['insertTextMode'];
         if (insertTextMode != null &&
-            !(InsertTextMode.canParse(insertTextMode, reporter))) {
+            !InsertTextMode.canParse(insertTextMode, reporter)) {
           reporter.reportError('must be of type InsertTextMode');
           return false;
         }
@@ -5915,7 +6006,7 @@
       reporter.push('kind');
       try {
         final kind = obj['kind'];
-        if (kind != null && !(CompletionItemKind.canParse(kind, reporter))) {
+        if (kind != null && !CompletionItemKind.canParse(kind, reporter)) {
           reporter.reportError('must be of type CompletionItemKind');
           return false;
         }
@@ -5933,7 +6024,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(label is String)) {
+        if (label is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -5944,7 +6035,7 @@
       try {
         final labelDetails = obj['labelDetails'];
         if (labelDetails != null &&
-            !(CompletionItemLabelDetails.canParse(labelDetails, reporter))) {
+            !CompletionItemLabelDetails.canParse(labelDetails, reporter)) {
           reporter.reportError('must be of type CompletionItemLabelDetails');
           return false;
         }
@@ -5954,7 +6045,7 @@
       reporter.push('preselect');
       try {
         final preselect = obj['preselect'];
-        if (preselect != null && !(preselect is bool)) {
+        if (preselect != null && preselect is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -5964,7 +6055,7 @@
       reporter.push('sortText');
       try {
         final sortText = obj['sortText'];
-        if (sortText != null && !(sortText is String)) {
+        if (sortText != null && sortText is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -5975,9 +6066,9 @@
       try {
         final tags = obj['tags'];
         if (tags != null &&
-            !((tags is List<Object?> &&
-                (tags.every(
-                    (item) => CompletionItemTag.canParse(item, reporter)))))) {
+            (tags is! List<Object?> ||
+                tags.any(
+                    (item) => !CompletionItemTag.canParse(item, reporter)))) {
           reporter.reportError('must be of type List<CompletionItemTag>');
           return false;
         }
@@ -5988,8 +6079,8 @@
       try {
         final textEdit = obj['textEdit'];
         if (textEdit != null &&
-            !((InsertReplaceEdit.canParse(textEdit, reporter) ||
-                TextEdit.canParse(textEdit, reporter)))) {
+            !InsertReplaceEdit.canParse(textEdit, reporter) &&
+            !TextEdit.canParse(textEdit, reporter)) {
           reporter.reportError(
               'must be of type Either2<InsertReplaceEdit, TextEdit>');
           return false;
@@ -6000,7 +6091,7 @@
       reporter.push('textEditText');
       try {
         final textEditText = obj['textEditText'];
-        if (textEditText != null && !(textEditText is String)) {
+        if (textEditText != null && textEditText is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -6071,6 +6162,102 @@
   String toString() => jsonEncoder.convert(toJson());
 }
 
+class CompletionItemEditRange implements ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+    CompletionItemEditRange.canParse,
+    CompletionItemEditRange.fromJson,
+  );
+
+  CompletionItemEditRange({
+    required this.insert,
+    required this.replace,
+  });
+  static CompletionItemEditRange fromJson(Map<String, Object?> json) {
+    final insertJson = json['insert'];
+    final insert = Range.fromJson(insertJson as Map<String, Object?>);
+    final replaceJson = json['replace'];
+    final replace = Range.fromJson(replaceJson as Map<String, Object?>);
+    return CompletionItemEditRange(
+      insert: insert,
+      replace: replace,
+    );
+  }
+
+  final Range insert;
+  final Range replace;
+
+  @override
+  Map<String, Object?> toJson() {
+    var result = <String, Object?>{};
+    result['insert'] = insert.toJson();
+    result['replace'] = replace.toJson();
+    return result;
+  }
+
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
+    if (obj is Map<String, Object?>) {
+      reporter.push('insert');
+      try {
+        if (!obj.containsKey('insert')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final insert = obj['insert'];
+        if (insert == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!Range.canParse(insert, reporter)) {
+          reporter.reportError('must be of type Range');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('replace');
+      try {
+        if (!obj.containsKey('replace')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final replace = obj['replace'];
+        if (replace == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!Range.canParse(replace, reporter)) {
+          reporter.reportError('must be of type Range');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError('must be of type CompletionItemEditRange');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is CompletionItemEditRange &&
+        other.runtimeType == CompletionItemEditRange) {
+      return insert == other.insert && replace == other.replace && true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode => Object.hash(
+        insert,
+        replace,
+      );
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
 class CompletionItemInsertTextModeSupport implements ToJsonable {
   static const jsonHandler = LspJsonHandler(
     CompletionItemInsertTextModeSupport.canParse,
@@ -6093,6 +6280,7 @@
 
   final List<InsertTextMode> valueSet;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['valueSet'] = valueSet.map((item) => item.toJson()).toList();
@@ -6112,9 +6300,8 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!((valueSet is List<Object?> &&
-            (valueSet
-                .every((item) => InsertTextMode.canParse(item, reporter)))))) {
+        if (valueSet is! List<Object?> ||
+            valueSet.any((item) => !InsertTextMode.canParse(item, reporter))) {
           reporter.reportError('must be of type List<InsertTextMode>');
           return false;
         }
@@ -6184,6 +6371,7 @@
   static const Value = CompletionItemKind(12);
   static const Variable = CompletionItemKind(6);
 
+  @override
   Object toJson() => _value;
 
   @override
@@ -6192,6 +6380,7 @@
   @override
   int get hashCode => _value.hashCode;
 
+  @override
   bool operator ==(Object other) =>
       other is CompletionItemKind && other._value == _value;
 }
@@ -6229,6 +6418,7 @@
   /// for function signatures or type annotations.
   final String? detail;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (description != null) {
@@ -6245,7 +6435,7 @@
       reporter.push('description');
       try {
         final description = obj['description'];
-        if (description != null && !(description is String)) {
+        if (description != null && description is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -6255,7 +6445,7 @@
       reporter.push('detail');
       try {
         final detail = obj['detail'];
-        if (detail != null && !(detail is String)) {
+        if (detail != null && detail is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -6310,6 +6500,7 @@
   /// The properties that a client can resolve lazily.
   final List<String> properties;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['properties'] = properties;
@@ -6329,8 +6520,8 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!((properties is List<Object?> &&
-            (properties.every((item) => item is String))))) {
+        if (properties is! List<Object?> ||
+            properties.any((item) => item is! String)) {
           reporter.reportError('must be of type List<String>');
           return false;
         }
@@ -6378,6 +6569,7 @@
   /// Render a completion as obsolete, usually using a strike-out.
   static const Deprecated = CompletionItemTag(1);
 
+  @override
   Object toJson() => _value;
 
   @override
@@ -6386,6 +6578,7 @@
   @override
   int get hashCode => _value.hashCode;
 
+  @override
   bool operator ==(Object other) =>
       other is CompletionItemTag && other._value == _value;
 }
@@ -6412,6 +6605,7 @@
   /// The tags supported by the client.
   final List<CompletionItemTag> valueSet;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['valueSet'] = valueSet.map((item) => item.toJson()).toList();
@@ -6431,9 +6625,9 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!((valueSet is List<Object?> &&
-            (valueSet.every(
-                (item) => CompletionItemTag.canParse(item, reporter)))))) {
+        if (valueSet is! List<Object?> ||
+            valueSet
+                .any((item) => !CompletionItemTag.canParse(item, reporter))) {
           reporter.reportError('must be of type List<CompletionItemTag>');
           return false;
         }
@@ -6520,6 +6714,7 @@
   /// The completion items.
   final List<CompletionItem> items;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['isIncomplete'] = isIncomplete;
@@ -6543,7 +6738,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(isIncomplete is bool)) {
+        if (isIncomplete is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -6554,7 +6749,7 @@
       try {
         final itemDefaults = obj['itemDefaults'];
         if (itemDefaults != null &&
-            !(CompletionListItemDefaults.canParse(itemDefaults, reporter))) {
+            !CompletionListItemDefaults.canParse(itemDefaults, reporter)) {
           reporter.reportError('must be of type CompletionListItemDefaults');
           return false;
         }
@@ -6572,9 +6767,8 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!((items is List<Object?> &&
-            (items
-                .every((item) => CompletionItem.canParse(item, reporter)))))) {
+        if (items is! List<Object?> ||
+            items.any((item) => !CompletionItem.canParse(item, reporter))) {
           reporter.reportError('must be of type List<CompletionItem>');
           return false;
         }
@@ -6611,101 +6805,6 @@
   String toString() => jsonEncoder.convert(toJson());
 }
 
-class CompletionListEditRange implements ToJsonable {
-  static const jsonHandler = LspJsonHandler(
-    CompletionListEditRange.canParse,
-    CompletionListEditRange.fromJson,
-  );
-
-  CompletionListEditRange({
-    required this.insert,
-    required this.replace,
-  });
-  static CompletionListEditRange fromJson(Map<String, Object?> json) {
-    final insertJson = json['insert'];
-    final insert = Range.fromJson(insertJson as Map<String, Object?>);
-    final replaceJson = json['replace'];
-    final replace = Range.fromJson(replaceJson as Map<String, Object?>);
-    return CompletionListEditRange(
-      insert: insert,
-      replace: replace,
-    );
-  }
-
-  final Range insert;
-  final Range replace;
-
-  Map<String, Object?> toJson() {
-    var result = <String, Object?>{};
-    result['insert'] = insert.toJson();
-    result['replace'] = replace.toJson();
-    return result;
-  }
-
-  static bool canParse(Object? obj, LspJsonReporter reporter) {
-    if (obj is Map<String, Object?>) {
-      reporter.push('insert');
-      try {
-        if (!obj.containsKey('insert')) {
-          reporter.reportError('must not be undefined');
-          return false;
-        }
-        final insert = obj['insert'];
-        if (insert == null) {
-          reporter.reportError('must not be null');
-          return false;
-        }
-        if (!(Range.canParse(insert, reporter))) {
-          reporter.reportError('must be of type Range');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      reporter.push('replace');
-      try {
-        if (!obj.containsKey('replace')) {
-          reporter.reportError('must not be undefined');
-          return false;
-        }
-        final replace = obj['replace'];
-        if (replace == null) {
-          reporter.reportError('must not be null');
-          return false;
-        }
-        if (!(Range.canParse(replace, reporter))) {
-          reporter.reportError('must be of type Range');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      return true;
-    } else {
-      reporter.reportError('must be of type CompletionListEditRange');
-      return false;
-    }
-  }
-
-  @override
-  bool operator ==(Object other) {
-    if (other is CompletionListEditRange &&
-        other.runtimeType == CompletionListEditRange) {
-      return insert == other.insert && replace == other.replace && true;
-    }
-    return false;
-  }
-
-  @override
-  int get hashCode => Object.hash(
-        insert,
-        replace,
-      );
-
-  @override
-  String toString() => jsonEncoder.convert(toJson());
-}
-
 class CompletionListItemDefaults implements ToJsonable {
   static const jsonHandler = LspJsonHandler(
     CompletionListItemDefaults.canParse,
@@ -6714,6 +6813,7 @@
 
   CompletionListItemDefaults({
     this.commitCharacters,
+    this.data,
     this.editRange,
     this.insertTextFormat,
     this.insertTextMode,
@@ -6723,17 +6823,19 @@
     final commitCharacters = (commitCharactersJson as List<Object?>?)
         ?.map((item) => item as String)
         .toList();
+    final dataJson = json['data'];
+    final data = dataJson;
     final editRangeJson = json['editRange'];
     final editRange = editRangeJson == null
         ? null
-        : (CompletionListEditRange.canParse(editRangeJson, nullLspJsonReporter)
-            ? Either2<CompletionListEditRange, Range>.t1(
-                CompletionListEditRange.fromJson(
+        : (CompletionItemEditRange.canParse(editRangeJson, nullLspJsonReporter)
+            ? Either2<CompletionItemEditRange, Range>.t1(
+                CompletionItemEditRange.fromJson(
                     editRangeJson as Map<String, Object?>))
             : (Range.canParse(editRangeJson, nullLspJsonReporter)
-                ? Either2<CompletionListEditRange, Range>.t2(
+                ? Either2<CompletionItemEditRange, Range>.t2(
                     Range.fromJson(editRangeJson as Map<String, Object?>))
-                : (throw '''$editRangeJson was not one of (CompletionListEditRange, Range)''')));
+                : (throw '''$editRangeJson was not one of (CompletionItemEditRange, Range)''')));
     final insertTextFormatJson = json['insertTextFormat'];
     final insertTextFormat = insertTextFormatJson != null
         ? InsertTextFormat.fromJson(insertTextFormatJson as int)
@@ -6744,6 +6846,7 @@
         : null;
     return CompletionListItemDefaults(
       commitCharacters: commitCharacters,
+      data: data,
       editRange: editRange,
       insertTextFormat: insertTextFormat,
       insertTextMode: insertTextMode,
@@ -6754,9 +6857,13 @@
   ///  @since 3.17.0
   final List<String>? commitCharacters;
 
+  /// A default data value.
+  ///  @since 3.17.0
+  final Object? data;
+
   /// A default edit range
   ///  @since 3.17.0
-  final Either2<CompletionListEditRange, Range>? editRange;
+  final Either2<CompletionItemEditRange, Range>? editRange;
 
   /// A default insert text format
   ///  @since 3.17.0
@@ -6766,11 +6873,15 @@
   ///  @since 3.17.0
   final InsertTextMode? insertTextMode;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (commitCharacters != null) {
       result['commitCharacters'] = commitCharacters;
     }
+    if (data != null) {
+      result['data'] = data;
+    }
     if (editRange != null) {
       result['editRange'] = editRange;
     }
@@ -6789,8 +6900,8 @@
       try {
         final commitCharacters = obj['commitCharacters'];
         if (commitCharacters != null &&
-            !((commitCharacters is List<Object?> &&
-                (commitCharacters.every((item) => item is String))))) {
+            (commitCharacters is! List<Object?> ||
+                commitCharacters.any((item) => item is! String))) {
           reporter.reportError('must be of type List<String>');
           return false;
         }
@@ -6801,10 +6912,10 @@
       try {
         final editRange = obj['editRange'];
         if (editRange != null &&
-            !((CompletionListEditRange.canParse(editRange, reporter) ||
-                Range.canParse(editRange, reporter)))) {
+            !CompletionItemEditRange.canParse(editRange, reporter) &&
+            !Range.canParse(editRange, reporter)) {
           reporter.reportError(
-              'must be of type Either2<CompletionListEditRange, Range>');
+              'must be of type Either2<CompletionItemEditRange, Range>');
           return false;
         }
       } finally {
@@ -6814,7 +6925,7 @@
       try {
         final insertTextFormat = obj['insertTextFormat'];
         if (insertTextFormat != null &&
-            !(InsertTextFormat.canParse(insertTextFormat, reporter))) {
+            !InsertTextFormat.canParse(insertTextFormat, reporter)) {
           reporter.reportError('must be of type InsertTextFormat');
           return false;
         }
@@ -6825,7 +6936,7 @@
       try {
         final insertTextMode = obj['insertTextMode'];
         if (insertTextMode != null &&
-            !(InsertTextMode.canParse(insertTextMode, reporter))) {
+            !InsertTextMode.canParse(insertTextMode, reporter)) {
           reporter.reportError('must be of type InsertTextMode');
           return false;
         }
@@ -6845,6 +6956,7 @@
         other.runtimeType == CompletionListItemDefaults) {
       return listEqual(commitCharacters, other.commitCharacters,
               (String a, String b) => a == b) &&
+          data == other.data &&
           editRange == other.editRange &&
           insertTextFormat == other.insertTextFormat &&
           insertTextMode == other.insertTextMode &&
@@ -6856,6 +6968,7 @@
   @override
   int get hashCode => Object.hash(
         lspHashCode(commitCharacters),
+        data,
         editRange,
         insertTextFormat,
         insertTextMode,
@@ -6938,8 +7051,10 @@
   /// valid inside an identifier (for example `.` in JavaScript) list them in
   /// `triggerCharacters`.
   final List<String>? triggerCharacters;
+  @override
   final bool? workDoneProgress;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (allCommitCharacters != null) {
@@ -6966,8 +7081,8 @@
       try {
         final allCommitCharacters = obj['allCommitCharacters'];
         if (allCommitCharacters != null &&
-            !((allCommitCharacters is List<Object?> &&
-                (allCommitCharacters.every((item) => item is String))))) {
+            (allCommitCharacters is! List<Object?> ||
+                allCommitCharacters.any((item) => item is! String))) {
           reporter.reportError('must be of type List<String>');
           return false;
         }
@@ -6978,8 +7093,8 @@
       try {
         final completionItem = obj['completionItem'];
         if (completionItem != null &&
-            !(CompletionOptionsCompletionItem.canParse(
-                completionItem, reporter))) {
+            !CompletionOptionsCompletionItem.canParse(
+                completionItem, reporter)) {
           reporter
               .reportError('must be of type CompletionOptionsCompletionItem');
           return false;
@@ -6990,7 +7105,7 @@
       reporter.push('resolveProvider');
       try {
         final resolveProvider = obj['resolveProvider'];
-        if (resolveProvider != null && !(resolveProvider is bool)) {
+        if (resolveProvider != null && resolveProvider is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -7001,8 +7116,8 @@
       try {
         final triggerCharacters = obj['triggerCharacters'];
         if (triggerCharacters != null &&
-            !((triggerCharacters is List<Object?> &&
-                (triggerCharacters.every((item) => item is String))))) {
+            (triggerCharacters is! List<Object?> ||
+                triggerCharacters.any((item) => item is! String))) {
           reporter.reportError('must be of type List<String>');
           return false;
         }
@@ -7012,7 +7127,7 @@
       reporter.push('workDoneProgress');
       try {
         final workDoneProgress = obj['workDoneProgress'];
-        if (workDoneProgress != null && !(workDoneProgress is bool)) {
+        if (workDoneProgress != null && workDoneProgress is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -7077,6 +7192,7 @@
   ///  @since 3.17.0
   final bool? labelDetailsSupport;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (labelDetailsSupport != null) {
@@ -7090,7 +7206,7 @@
       reporter.push('labelDetailsSupport');
       try {
         final labelDetailsSupport = obj['labelDetailsSupport'];
-        if (labelDetailsSupport != null && !(labelDetailsSupport is bool)) {
+        if (labelDetailsSupport != null && labelDetailsSupport is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -7179,17 +7295,22 @@
 
   /// An optional token that a server can use to report partial results (e.g.
   /// streaming) to the client.
+  @override
   final Either2<int, String>? partialResultToken;
 
   /// The position inside the text document.
+  @override
   final Position position;
 
   /// The text document.
+  @override
   final TextDocumentIdentifier textDocument;
 
   /// An optional token that a server can use to report work done progress.
+  @override
   final Either2<int, String>? workDoneToken;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (context != null) {
@@ -7211,8 +7332,7 @@
       reporter.push('context');
       try {
         final context = obj['context'];
-        if (context != null &&
-            !(CompletionContext.canParse(context, reporter))) {
+        if (context != null && !CompletionContext.canParse(context, reporter)) {
           reporter.reportError('must be of type CompletionContext');
           return false;
         }
@@ -7223,7 +7343,8 @@
       try {
         final partialResultToken = obj['partialResultToken'];
         if (partialResultToken != null &&
-            !((partialResultToken is int || partialResultToken is String))) {
+            partialResultToken is! int &&
+            partialResultToken is! String) {
           reporter.reportError('must be of type Either2<int, String>');
           return false;
         }
@@ -7241,7 +7362,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(Position.canParse(position, reporter))) {
+        if (!Position.canParse(position, reporter)) {
           reporter.reportError('must be of type Position');
           return false;
         }
@@ -7259,7 +7380,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(TextDocumentIdentifier.canParse(textDocument, reporter))) {
+        if (!TextDocumentIdentifier.canParse(textDocument, reporter)) {
           reporter.reportError('must be of type TextDocumentIdentifier');
           return false;
         }
@@ -7270,7 +7391,8 @@
       try {
         final workDoneToken = obj['workDoneToken'];
         if (workDoneToken != null &&
-            !((workDoneToken is int || workDoneToken is String))) {
+            workDoneToken is! int &&
+            workDoneToken is! String) {
           reporter.reportError('must be of type Either2<int, String>');
           return false;
         }
@@ -7337,8 +7459,8 @@
         : null;
     final documentSelectorJson = json['documentSelector'];
     final documentSelector = (documentSelectorJson as List<Object?>?)
-        ?.map(
-            (item) => TextDocumentFilter.fromJson(item as Map<String, Object?>))
+        ?.map((item) =>
+            TextDocumentFilterWithScheme.fromJson(item as Map<String, Object?>))
         .toList();
     final resolveProviderJson = json['resolveProvider'];
     final resolveProvider = resolveProviderJson as bool?;
@@ -7366,18 +7488,22 @@
   /// If a server provides both `allCommitCharacters` and commit characters on
   /// an individual completion item the ones on the completion item win.
   ///  @since 3.2.0
+  @override
   final List<String>? allCommitCharacters;
 
   /// The server supports the following `CompletionItem` specific capabilities.
   ///  @since 3.17.0
+  @override
   final CompletionOptionsCompletionItem? completionItem;
 
   /// A document selector to identify the scope of the registration. If set to
   /// null the document selector provided on the client side will be used.
-  final List<TextDocumentFilter>? documentSelector;
+  @override
+  final List<TextDocumentFilterWithScheme>? documentSelector;
 
   /// The server provides support to resolve additional information for a
   /// completion item.
+  @override
   final bool? resolveProvider;
 
   /// Most tools trigger completion request automatically without explicitly
@@ -7390,9 +7516,12 @@
   /// If code complete should automatically be trigger on characters not being
   /// valid inside an identifier (for example `.` in JavaScript) list them in
   /// `triggerCharacters`.
+  @override
   final List<String>? triggerCharacters;
+  @override
   final bool? workDoneProgress;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (allCommitCharacters != null) {
@@ -7420,8 +7549,8 @@
       try {
         final allCommitCharacters = obj['allCommitCharacters'];
         if (allCommitCharacters != null &&
-            !((allCommitCharacters is List<Object?> &&
-                (allCommitCharacters.every((item) => item is String))))) {
+            (allCommitCharacters is! List<Object?> ||
+                allCommitCharacters.any((item) => item is! String))) {
           reporter.reportError('must be of type List<String>');
           return false;
         }
@@ -7432,8 +7561,8 @@
       try {
         final completionItem = obj['completionItem'];
         if (completionItem != null &&
-            !(CompletionOptionsCompletionItem.canParse(
-                completionItem, reporter))) {
+            !CompletionOptionsCompletionItem.canParse(
+                completionItem, reporter)) {
           reporter
               .reportError('must be of type CompletionOptionsCompletionItem');
           return false;
@@ -7449,10 +7578,11 @@
         }
         final documentSelector = obj['documentSelector'];
         if (documentSelector != null &&
-            !((documentSelector is List<Object?> &&
-                (documentSelector.every(
-                    (item) => TextDocumentFilter.canParse(item, reporter)))))) {
-          reporter.reportError('must be of type List<TextDocumentFilter>');
+            (documentSelector is! List<Object?> ||
+                documentSelector.any((item) =>
+                    !TextDocumentFilterWithScheme.canParse(item, reporter)))) {
+          reporter.reportError(
+              'must be of type List<TextDocumentFilterWithScheme>');
           return false;
         }
       } finally {
@@ -7461,7 +7591,7 @@
       reporter.push('resolveProvider');
       try {
         final resolveProvider = obj['resolveProvider'];
-        if (resolveProvider != null && !(resolveProvider is bool)) {
+        if (resolveProvider != null && resolveProvider is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -7472,8 +7602,8 @@
       try {
         final triggerCharacters = obj['triggerCharacters'];
         if (triggerCharacters != null &&
-            !((triggerCharacters is List<Object?> &&
-                (triggerCharacters.every((item) => item is String))))) {
+            (triggerCharacters is! List<Object?> ||
+                triggerCharacters.any((item) => item is! String))) {
           reporter.reportError('must be of type List<String>');
           return false;
         }
@@ -7483,7 +7613,7 @@
       reporter.push('workDoneProgress');
       try {
         final workDoneProgress = obj['workDoneProgress'];
-        if (workDoneProgress != null && !(workDoneProgress is bool)) {
+        if (workDoneProgress != null && workDoneProgress is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -7504,8 +7634,12 @@
       return listEqual(allCommitCharacters, other.allCommitCharacters,
               (String a, String b) => a == b) &&
           completionItem == other.completionItem &&
-          listEqual(documentSelector, other.documentSelector,
-              (TextDocumentFilter a, TextDocumentFilter b) => a == b) &&
+          listEqual(
+              documentSelector,
+              other.documentSelector,
+              (TextDocumentFilterWithScheme a,
+                      TextDocumentFilterWithScheme b) =>
+                  a == b) &&
           resolveProvider == other.resolveProvider &&
           listEqual(triggerCharacters, other.triggerCharacters,
               (String a, String b) => a == b) &&
@@ -7557,6 +7691,7 @@
   /// Completion was re-triggered as the current completion list is incomplete.
   static const TriggerForIncompleteCompletions = CompletionTriggerKind._(3);
 
+  @override
   Object toJson() => _value;
 
   @override
@@ -7565,6 +7700,7 @@
   @override
   int get hashCode => _value.hashCode;
 
+  @override
   bool operator ==(Object other) =>
       other is CompletionTriggerKind && other._value == _value;
 }
@@ -7596,6 +7732,7 @@
   /// The configuration section asked for.
   final String? section;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (scopeUri != null) {
@@ -7612,7 +7749,7 @@
       reporter.push('scopeUri');
       try {
         final scopeUri = obj['scopeUri'];
-        if (scopeUri != null && !(scopeUri is String)) {
+        if (scopeUri != null && scopeUri is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -7622,7 +7759,7 @@
       reporter.push('section');
       try {
         final section = obj['section'];
-        if (section != null && !(section is String)) {
+        if (section != null && section is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -7675,6 +7812,7 @@
 
   final List<ConfigurationItem> items;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['items'] = items.map((item) => item.toJson()).toList();
@@ -7694,9 +7832,8 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!((items is List<Object?> &&
-            (items.every(
-                (item) => ConfigurationItem.canParse(item, reporter)))))) {
+        if (items is! List<Object?> ||
+            items.any((item) => !ConfigurationItem.canParse(item, reporter))) {
           reporter.reportError('must be of type List<ConfigurationItem>');
           return false;
         }
@@ -7777,6 +7914,7 @@
   /// The resource to create.
   final String uri;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (annotationId != null) {
@@ -7795,7 +7933,7 @@
       reporter.push('annotationId');
       try {
         final annotationId = obj['annotationId'];
-        if (annotationId != null && !(annotationId is String)) {
+        if (annotationId != null && annotationId is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -7813,7 +7951,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(kind == 'create')) {
+        if (kind != 'create') {
           reporter.reportError('must be the literal \'create\'');
           return false;
         }
@@ -7823,8 +7961,7 @@
       reporter.push('options');
       try {
         final options = obj['options'];
-        if (options != null &&
-            !(CreateFileOptions.canParse(options, reporter))) {
+        if (options != null && !CreateFileOptions.canParse(options, reporter)) {
           reporter.reportError('must be of type CreateFileOptions');
           return false;
         }
@@ -7842,7 +7979,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(uri is String)) {
+        if (uri is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -7908,6 +8045,7 @@
   /// Overwrite existing file. Overwrite wins over `ignoreIfExists`
   final bool? overwrite;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (ignoreIfExists != null) {
@@ -7924,7 +8062,7 @@
       reporter.push('ignoreIfExists');
       try {
         final ignoreIfExists = obj['ignoreIfExists'];
-        if (ignoreIfExists != null && !(ignoreIfExists is bool)) {
+        if (ignoreIfExists != null && ignoreIfExists is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -7934,7 +8072,7 @@
       reporter.push('overwrite');
       try {
         final overwrite = obj['overwrite'];
-        if (overwrite != null && !(overwrite is bool)) {
+        if (overwrite != null && overwrite is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -7993,6 +8131,7 @@
   /// An array of all files/folders created in this operation.
   final List<FileCreate> files;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['files'] = files.map((item) => item.toJson()).toList();
@@ -8012,8 +8151,8 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!((files is List<Object?> &&
-            (files.every((item) => FileCreate.canParse(item, reporter)))))) {
+        if (files is! List<Object?> ||
+            files.any((item) => !FileCreate.canParse(item, reporter))) {
           reporter.reportError('must be of type List<FileCreate>');
           return false;
         }
@@ -8073,6 +8212,7 @@
   /// The client supports additional metadata in the form of declaration links.
   final bool? linkSupport;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (dynamicRegistration != null) {
@@ -8089,7 +8229,7 @@
       reporter.push('dynamicRegistration');
       try {
         final dynamicRegistration = obj['dynamicRegistration'];
-        if (dynamicRegistration != null && !(dynamicRegistration is bool)) {
+        if (dynamicRegistration != null && dynamicRegistration is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -8099,7 +8239,7 @@
       reporter.push('linkSupport');
       try {
         final linkSupport = obj['linkSupport'];
-        if (linkSupport != null && !(linkSupport is bool)) {
+        if (linkSupport != null && linkSupport is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -8154,8 +8294,10 @@
     );
   }
 
+  @override
   final bool? workDoneProgress;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (workDoneProgress != null) {
@@ -8169,7 +8311,7 @@
       reporter.push('workDoneProgress');
       try {
         final workDoneProgress = obj['workDoneProgress'];
-        if (workDoneProgress != null && !(workDoneProgress is bool)) {
+        if (workDoneProgress != null && workDoneProgress is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -8248,17 +8390,22 @@
 
   /// An optional token that a server can use to report partial results (e.g.
   /// streaming) to the client.
+  @override
   final Either2<int, String>? partialResultToken;
 
   /// The position inside the text document.
+  @override
   final Position position;
 
   /// The text document.
+  @override
   final TextDocumentIdentifier textDocument;
 
   /// An optional token that a server can use to report work done progress.
+  @override
   final Either2<int, String>? workDoneToken;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (partialResultToken != null) {
@@ -8278,7 +8425,8 @@
       try {
         final partialResultToken = obj['partialResultToken'];
         if (partialResultToken != null &&
-            !((partialResultToken is int || partialResultToken is String))) {
+            partialResultToken is! int &&
+            partialResultToken is! String) {
           reporter.reportError('must be of type Either2<int, String>');
           return false;
         }
@@ -8296,7 +8444,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(Position.canParse(position, reporter))) {
+        if (!Position.canParse(position, reporter)) {
           reporter.reportError('must be of type Position');
           return false;
         }
@@ -8314,7 +8462,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(TextDocumentIdentifier.canParse(textDocument, reporter))) {
+        if (!TextDocumentIdentifier.canParse(textDocument, reporter)) {
           reporter.reportError('must be of type TextDocumentIdentifier');
           return false;
         }
@@ -8325,7 +8473,8 @@
       try {
         final workDoneToken = obj['workDoneToken'];
         if (workDoneToken != null &&
-            !((workDoneToken is int || workDoneToken is String))) {
+            workDoneToken is! int &&
+            workDoneToken is! String) {
           reporter.reportError('must be of type Either2<int, String>');
           return false;
         }
@@ -8382,8 +8531,8 @@
   static DeclarationRegistrationOptions fromJson(Map<String, Object?> json) {
     final documentSelectorJson = json['documentSelector'];
     final documentSelector = (documentSelectorJson as List<Object?>?)
-        ?.map(
-            (item) => TextDocumentFilter.fromJson(item as Map<String, Object?>))
+        ?.map((item) =>
+            TextDocumentFilterWithScheme.fromJson(item as Map<String, Object?>))
         .toList();
     final idJson = json['id'];
     final id = idJson as String?;
@@ -8398,13 +8547,17 @@
 
   /// A document selector to identify the scope of the registration. If set to
   /// null the document selector provided on the client side will be used.
-  final List<TextDocumentFilter>? documentSelector;
+  @override
+  final List<TextDocumentFilterWithScheme>? documentSelector;
 
   /// The id used to register the request. The id can be used to deregister the
   /// request again. See also Registration#id.
+  @override
   final String? id;
+  @override
   final bool? workDoneProgress;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['documentSelector'] = documentSelector;
@@ -8427,10 +8580,11 @@
         }
         final documentSelector = obj['documentSelector'];
         if (documentSelector != null &&
-            !((documentSelector is List<Object?> &&
-                (documentSelector.every(
-                    (item) => TextDocumentFilter.canParse(item, reporter)))))) {
-          reporter.reportError('must be of type List<TextDocumentFilter>');
+            (documentSelector is! List<Object?> ||
+                documentSelector.any((item) =>
+                    !TextDocumentFilterWithScheme.canParse(item, reporter)))) {
+          reporter.reportError(
+              'must be of type List<TextDocumentFilterWithScheme>');
           return false;
         }
       } finally {
@@ -8439,7 +8593,7 @@
       reporter.push('id');
       try {
         final id = obj['id'];
-        if (id != null && !(id is String)) {
+        if (id != null && id is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -8449,7 +8603,7 @@
       reporter.push('workDoneProgress');
       try {
         final workDoneProgress = obj['workDoneProgress'];
-        if (workDoneProgress != null && !(workDoneProgress is bool)) {
+        if (workDoneProgress != null && workDoneProgress is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -8467,8 +8621,12 @@
   bool operator ==(Object other) {
     if (other is DeclarationRegistrationOptions &&
         other.runtimeType == DeclarationRegistrationOptions) {
-      return listEqual(documentSelector, other.documentSelector,
-              (TextDocumentFilter a, TextDocumentFilter b) => a == b) &&
+      return listEqual(
+              documentSelector,
+              other.documentSelector,
+              (TextDocumentFilterWithScheme a,
+                      TextDocumentFilterWithScheme b) =>
+                  a == b) &&
           id == other.id &&
           workDoneProgress == other.workDoneProgress &&
           true;
@@ -8515,6 +8673,7 @@
   ///  @since 3.14.0
   final bool? linkSupport;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (dynamicRegistration != null) {
@@ -8531,7 +8690,7 @@
       reporter.push('dynamicRegistration');
       try {
         final dynamicRegistration = obj['dynamicRegistration'];
-        if (dynamicRegistration != null && !(dynamicRegistration is bool)) {
+        if (dynamicRegistration != null && dynamicRegistration is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -8541,7 +8700,7 @@
       reporter.push('linkSupport');
       try {
         final linkSupport = obj['linkSupport'];
-        if (linkSupport != null && !(linkSupport is bool)) {
+        if (linkSupport != null && linkSupport is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -8596,8 +8755,10 @@
     );
   }
 
+  @override
   final bool? workDoneProgress;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (workDoneProgress != null) {
@@ -8611,7 +8772,7 @@
       reporter.push('workDoneProgress');
       try {
         final workDoneProgress = obj['workDoneProgress'];
-        if (workDoneProgress != null && !(workDoneProgress is bool)) {
+        if (workDoneProgress != null && workDoneProgress is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -8689,17 +8850,22 @@
 
   /// An optional token that a server can use to report partial results (e.g.
   /// streaming) to the client.
+  @override
   final Either2<int, String>? partialResultToken;
 
   /// The position inside the text document.
+  @override
   final Position position;
 
   /// The text document.
+  @override
   final TextDocumentIdentifier textDocument;
 
   /// An optional token that a server can use to report work done progress.
+  @override
   final Either2<int, String>? workDoneToken;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (partialResultToken != null) {
@@ -8719,7 +8885,8 @@
       try {
         final partialResultToken = obj['partialResultToken'];
         if (partialResultToken != null &&
-            !((partialResultToken is int || partialResultToken is String))) {
+            partialResultToken is! int &&
+            partialResultToken is! String) {
           reporter.reportError('must be of type Either2<int, String>');
           return false;
         }
@@ -8737,7 +8904,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(Position.canParse(position, reporter))) {
+        if (!Position.canParse(position, reporter)) {
           reporter.reportError('must be of type Position');
           return false;
         }
@@ -8755,7 +8922,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(TextDocumentIdentifier.canParse(textDocument, reporter))) {
+        if (!TextDocumentIdentifier.canParse(textDocument, reporter)) {
           reporter.reportError('must be of type TextDocumentIdentifier');
           return false;
         }
@@ -8766,7 +8933,8 @@
       try {
         final workDoneToken = obj['workDoneToken'];
         if (workDoneToken != null &&
-            !((workDoneToken is int || workDoneToken is String))) {
+            workDoneToken is! int &&
+            workDoneToken is! String) {
           reporter.reportError('must be of type Either2<int, String>');
           return false;
         }
@@ -8818,8 +8986,8 @@
   static DefinitionRegistrationOptions fromJson(Map<String, Object?> json) {
     final documentSelectorJson = json['documentSelector'];
     final documentSelector = (documentSelectorJson as List<Object?>?)
-        ?.map(
-            (item) => TextDocumentFilter.fromJson(item as Map<String, Object?>))
+        ?.map((item) =>
+            TextDocumentFilterWithScheme.fromJson(item as Map<String, Object?>))
         .toList();
     final workDoneProgressJson = json['workDoneProgress'];
     final workDoneProgress = workDoneProgressJson as bool?;
@@ -8831,9 +8999,12 @@
 
   /// A document selector to identify the scope of the registration. If set to
   /// null the document selector provided on the client side will be used.
-  final List<TextDocumentFilter>? documentSelector;
+  @override
+  final List<TextDocumentFilterWithScheme>? documentSelector;
+  @override
   final bool? workDoneProgress;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['documentSelector'] = documentSelector;
@@ -8853,10 +9024,11 @@
         }
         final documentSelector = obj['documentSelector'];
         if (documentSelector != null &&
-            !((documentSelector is List<Object?> &&
-                (documentSelector.every(
-                    (item) => TextDocumentFilter.canParse(item, reporter)))))) {
-          reporter.reportError('must be of type List<TextDocumentFilter>');
+            (documentSelector is! List<Object?> ||
+                documentSelector.any((item) =>
+                    !TextDocumentFilterWithScheme.canParse(item, reporter)))) {
+          reporter.reportError(
+              'must be of type List<TextDocumentFilterWithScheme>');
           return false;
         }
       } finally {
@@ -8865,7 +9037,7 @@
       reporter.push('workDoneProgress');
       try {
         final workDoneProgress = obj['workDoneProgress'];
-        if (workDoneProgress != null && !(workDoneProgress is bool)) {
+        if (workDoneProgress != null && workDoneProgress is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -8883,8 +9055,12 @@
   bool operator ==(Object other) {
     if (other is DefinitionRegistrationOptions &&
         other.runtimeType == DefinitionRegistrationOptions) {
-      return listEqual(documentSelector, other.documentSelector,
-              (TextDocumentFilter a, TextDocumentFilter b) => a == b) &&
+      return listEqual(
+              documentSelector,
+              other.documentSelector,
+              (TextDocumentFilterWithScheme a,
+                      TextDocumentFilterWithScheme b) =>
+                  a == b) &&
           workDoneProgress == other.workDoneProgress &&
           true;
     }
@@ -8950,6 +9126,7 @@
   /// The file to delete.
   final String uri;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (annotationId != null) {
@@ -8968,7 +9145,7 @@
       reporter.push('annotationId');
       try {
         final annotationId = obj['annotationId'];
-        if (annotationId != null && !(annotationId is String)) {
+        if (annotationId != null && annotationId is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -8986,7 +9163,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(kind == 'delete')) {
+        if (kind != 'delete') {
           reporter.reportError('must be the literal \'delete\'');
           return false;
         }
@@ -8996,8 +9173,7 @@
       reporter.push('options');
       try {
         final options = obj['options'];
-        if (options != null &&
-            !(DeleteFileOptions.canParse(options, reporter))) {
+        if (options != null && !DeleteFileOptions.canParse(options, reporter)) {
           reporter.reportError('must be of type DeleteFileOptions');
           return false;
         }
@@ -9015,7 +9191,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(uri is String)) {
+        if (uri is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -9081,6 +9257,7 @@
   /// Delete the content recursively if a folder is denoted.
   final bool? recursive;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (ignoreIfNotExists != null) {
@@ -9097,7 +9274,7 @@
       reporter.push('ignoreIfNotExists');
       try {
         final ignoreIfNotExists = obj['ignoreIfNotExists'];
-        if (ignoreIfNotExists != null && !(ignoreIfNotExists is bool)) {
+        if (ignoreIfNotExists != null && ignoreIfNotExists is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -9107,7 +9284,7 @@
       reporter.push('recursive');
       try {
         final recursive = obj['recursive'];
-        if (recursive != null && !(recursive is bool)) {
+        if (recursive != null && recursive is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -9166,6 +9343,7 @@
   /// An array of all files/folders deleted in this operation.
   final List<FileDelete> files;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['files'] = files.map((item) => item.toJson()).toList();
@@ -9185,8 +9363,8 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!((files is List<Object?> &&
-            (files.every((item) => FileDelete.canParse(item, reporter)))))) {
+        if (files is! List<Object?> ||
+            files.any((item) => !FileDelete.canParse(item, reporter))) {
           reporter.reportError('must be of type List<FileDelete>');
           return false;
         }
@@ -9310,6 +9488,7 @@
   ///  @since 3.15.0
   final List<DiagnosticTag>? tags;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (code != null) {
@@ -9344,7 +9523,7 @@
       reporter.push('code');
       try {
         final code = obj['code'];
-        if (code != null && !(code is String)) {
+        if (code != null && code is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -9355,7 +9534,7 @@
       try {
         final codeDescription = obj['codeDescription'];
         if (codeDescription != null &&
-            !(CodeDescription.canParse(codeDescription, reporter))) {
+            !CodeDescription.canParse(codeDescription, reporter)) {
           reporter.reportError('must be of type CodeDescription');
           return false;
         }
@@ -9373,7 +9552,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(message is String)) {
+        if (message is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -9391,7 +9570,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(Range.canParse(range, reporter))) {
+        if (!Range.canParse(range, reporter)) {
           reporter.reportError('must be of type Range');
           return false;
         }
@@ -9402,9 +9581,9 @@
       try {
         final relatedInformation = obj['relatedInformation'];
         if (relatedInformation != null &&
-            !((relatedInformation is List<Object?> &&
-                (relatedInformation.every((item) =>
-                    DiagnosticRelatedInformation.canParse(item, reporter)))))) {
+            (relatedInformation is! List<Object?> ||
+                relatedInformation.any((item) =>
+                    !DiagnosticRelatedInformation.canParse(item, reporter)))) {
           reporter.reportError(
               'must be of type List<DiagnosticRelatedInformation>');
           return false;
@@ -9416,7 +9595,7 @@
       try {
         final severity = obj['severity'];
         if (severity != null &&
-            !(DiagnosticSeverity.canParse(severity, reporter))) {
+            !DiagnosticSeverity.canParse(severity, reporter)) {
           reporter.reportError('must be of type DiagnosticSeverity');
           return false;
         }
@@ -9426,7 +9605,7 @@
       reporter.push('source');
       try {
         final source = obj['source'];
-        if (source != null && !(source is String)) {
+        if (source != null && source is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -9437,9 +9616,8 @@
       try {
         final tags = obj['tags'];
         if (tags != null &&
-            !((tags is List<Object?> &&
-                (tags.every(
-                    (item) => DiagnosticTag.canParse(item, reporter)))))) {
+            (tags is! List<Object?> ||
+                tags.any((item) => !DiagnosticTag.canParse(item, reporter)))) {
           reporter.reportError('must be of type List<DiagnosticTag>');
           return false;
         }
@@ -9526,6 +9704,7 @@
   /// pulls.
   final bool? relatedDocumentSupport;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (dynamicRegistration != null) {
@@ -9542,7 +9721,7 @@
       reporter.push('dynamicRegistration');
       try {
         final dynamicRegistration = obj['dynamicRegistration'];
-        if (dynamicRegistration != null && !(dynamicRegistration is bool)) {
+        if (dynamicRegistration != null && dynamicRegistration is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -9552,8 +9731,7 @@
       reporter.push('relatedDocumentSupport');
       try {
         final relatedDocumentSupport = obj['relatedDocumentSupport'];
-        if (relatedDocumentSupport != null &&
-            !(relatedDocumentSupport is bool)) {
+        if (relatedDocumentSupport != null && relatedDocumentSupport is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -9631,11 +9809,13 @@
   /// Inter file dependencies are common for most programming languages and
   /// typically uncommon for linters.
   final bool interFileDependencies;
+  @override
   final bool? workDoneProgress;
 
   /// The server provides support for workspace diagnostics as well.
   final bool workspaceDiagnostics;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (identifier != null) {
@@ -9654,7 +9834,7 @@
       reporter.push('identifier');
       try {
         final identifier = obj['identifier'];
-        if (identifier != null && !(identifier is String)) {
+        if (identifier != null && identifier is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -9672,7 +9852,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(interFileDependencies is bool)) {
+        if (interFileDependencies is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -9682,7 +9862,7 @@
       reporter.push('workDoneProgress');
       try {
         final workDoneProgress = obj['workDoneProgress'];
-        if (workDoneProgress != null && !(workDoneProgress is bool)) {
+        if (workDoneProgress != null && workDoneProgress is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -9700,7 +9880,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(workspaceDiagnostics is bool)) {
+        if (workspaceDiagnostics is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -9762,8 +9942,8 @@
   static DiagnosticRegistrationOptions fromJson(Map<String, Object?> json) {
     final documentSelectorJson = json['documentSelector'];
     final documentSelector = (documentSelectorJson as List<Object?>?)
-        ?.map(
-            (item) => TextDocumentFilter.fromJson(item as Map<String, Object?>))
+        ?.map((item) =>
+            TextDocumentFilterWithScheme.fromJson(item as Map<String, Object?>))
         .toList();
     final idJson = json['id'];
     final id = idJson as String?;
@@ -9787,26 +9967,33 @@
 
   /// A document selector to identify the scope of the registration. If set to
   /// null the document selector provided on the client side will be used.
-  final List<TextDocumentFilter>? documentSelector;
+  @override
+  final List<TextDocumentFilterWithScheme>? documentSelector;
 
   /// The id used to register the request. The id can be used to deregister the
   /// request again. See also Registration#id.
+  @override
   final String? id;
 
   /// An optional identifier under which the diagnostics are managed by the
   /// client.
+  @override
   final String? identifier;
 
   /// Whether the language has inter file dependencies meaning that editing code
   /// in one file can result in a different diagnostic set in another file.
   /// Inter file dependencies are common for most programming languages and
   /// typically uncommon for linters.
+  @override
   final bool interFileDependencies;
+  @override
   final bool? workDoneProgress;
 
   /// The server provides support for workspace diagnostics as well.
+  @override
   final bool workspaceDiagnostics;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['documentSelector'] = documentSelector;
@@ -9834,10 +10021,11 @@
         }
         final documentSelector = obj['documentSelector'];
         if (documentSelector != null &&
-            !((documentSelector is List<Object?> &&
-                (documentSelector.every(
-                    (item) => TextDocumentFilter.canParse(item, reporter)))))) {
-          reporter.reportError('must be of type List<TextDocumentFilter>');
+            (documentSelector is! List<Object?> ||
+                documentSelector.any((item) =>
+                    !TextDocumentFilterWithScheme.canParse(item, reporter)))) {
+          reporter.reportError(
+              'must be of type List<TextDocumentFilterWithScheme>');
           return false;
         }
       } finally {
@@ -9846,7 +10034,7 @@
       reporter.push('id');
       try {
         final id = obj['id'];
-        if (id != null && !(id is String)) {
+        if (id != null && id is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -9856,7 +10044,7 @@
       reporter.push('identifier');
       try {
         final identifier = obj['identifier'];
-        if (identifier != null && !(identifier is String)) {
+        if (identifier != null && identifier is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -9874,7 +10062,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(interFileDependencies is bool)) {
+        if (interFileDependencies is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -9884,7 +10072,7 @@
       reporter.push('workDoneProgress');
       try {
         final workDoneProgress = obj['workDoneProgress'];
-        if (workDoneProgress != null && !(workDoneProgress is bool)) {
+        if (workDoneProgress != null && workDoneProgress is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -9902,7 +10090,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(workspaceDiagnostics is bool)) {
+        if (workspaceDiagnostics is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -9920,8 +10108,12 @@
   bool operator ==(Object other) {
     if (other is DiagnosticRegistrationOptions &&
         other.runtimeType == DiagnosticRegistrationOptions) {
-      return listEqual(documentSelector, other.documentSelector,
-              (TextDocumentFilter a, TextDocumentFilter b) => a == b) &&
+      return listEqual(
+              documentSelector,
+              other.documentSelector,
+              (TextDocumentFilterWithScheme a,
+                      TextDocumentFilterWithScheme b) =>
+                  a == b) &&
           id == other.id &&
           identifier == other.identifier &&
           interFileDependencies == other.interFileDependencies &&
@@ -9976,6 +10168,7 @@
   /// The message of this related diagnostic information.
   final String message;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['location'] = location.toJson();
@@ -9996,7 +10189,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(Location.canParse(location, reporter))) {
+        if (!Location.canParse(location, reporter)) {
           reporter.reportError('must be of type Location');
           return false;
         }
@@ -10014,7 +10207,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(message is String)) {
+        if (message is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -10068,6 +10261,7 @@
 
   final bool retriggerRequest;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['retriggerRequest'] = retriggerRequest;
@@ -10087,7 +10281,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(retriggerRequest is bool)) {
+        if (retriggerRequest is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -10139,6 +10333,7 @@
   /// Reports a warning.
   static const Warning = DiagnosticSeverity(2);
 
+  @override
   Object toJson() => _value;
 
   @override
@@ -10147,6 +10342,7 @@
   @override
   int get hashCode => _value.hashCode;
 
+  @override
   bool operator ==(Object other) =>
       other is DiagnosticSeverity && other._value == _value;
 }
@@ -10174,6 +10370,7 @@
   /// of having an error squiggle.
   static const Unnecessary = DiagnosticTag(1);
 
+  @override
   Object toJson() => _value;
 
   @override
@@ -10182,6 +10379,7 @@
   @override
   int get hashCode => _value.hashCode;
 
+  @override
   bool operator ==(Object other) =>
       other is DiagnosticTag && other._value == _value;
 }
@@ -10215,6 +10413,7 @@
   /// wide change that requires such a calculation.
   final bool? refreshSupport;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (refreshSupport != null) {
@@ -10228,7 +10427,7 @@
       reporter.push('refreshSupport');
       try {
         final refreshSupport = obj['refreshSupport'];
-        if (refreshSupport != null && !(refreshSupport is bool)) {
+        if (refreshSupport != null && refreshSupport is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -10280,6 +10479,7 @@
   /// Did change configuration notification supports dynamic registration.
   final bool? dynamicRegistration;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (dynamicRegistration != null) {
@@ -10293,7 +10493,7 @@
       reporter.push('dynamicRegistration');
       try {
         final dynamicRegistration = obj['dynamicRegistration'];
-        if (dynamicRegistration != null && !(dynamicRegistration is bool)) {
+        if (dynamicRegistration != null && dynamicRegistration is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -10344,6 +10544,7 @@
   /// The actual changed settings
   final Object? settings;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['settings'] = settings;
@@ -10417,6 +10618,7 @@
   /// version after all provided changes have been applied.
   final VersionedNotebookDocumentIdentifier notebookDocument;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['change'] = change.toJson();
@@ -10437,7 +10639,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(NotebookDocumentChangeEvent.canParse(change, reporter))) {
+        if (!NotebookDocumentChangeEvent.canParse(change, reporter)) {
           reporter.reportError('must be of type NotebookDocumentChangeEvent');
           return false;
         }
@@ -10455,8 +10657,8 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(VersionedNotebookDocumentIdentifier.canParse(
-            notebookDocument, reporter))) {
+        if (!VersionedNotebookDocumentIdentifier.canParse(
+            notebookDocument, reporter)) {
           reporter.reportError(
               'must be of type VersionedNotebookDocumentIdentifier');
           return false;
@@ -10546,6 +10748,7 @@
   /// after all provided content changes have been applied.
   final VersionedTextDocumentIdentifier textDocument;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['contentChanges'] = contentChanges;
@@ -10566,11 +10769,10 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!((contentChanges is List<Object?> &&
-            (contentChanges.every((item) =>
-                (TextDocumentContentChangeEvent1.canParse(item, reporter) ||
-                    TextDocumentContentChangeEvent2.canParse(
-                        item, reporter))))))) {
+        if (contentChanges is! List<Object?> ||
+            contentChanges.any((item) =>
+                !TextDocumentContentChangeEvent1.canParse(item, reporter) &&
+                !TextDocumentContentChangeEvent2.canParse(item, reporter))) {
           reporter.reportError(
               'must be of type List<Either2<TextDocumentContentChangeEvent1, TextDocumentContentChangeEvent2>>');
           return false;
@@ -10589,8 +10791,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(VersionedTextDocumentIdentifier.canParse(
-            textDocument, reporter))) {
+        if (!VersionedTextDocumentIdentifier.canParse(textDocument, reporter)) {
           reporter
               .reportError('must be of type VersionedTextDocumentIdentifier');
           return false;
@@ -10666,6 +10867,7 @@
   ///  @since 3.17.0
   final bool? relativePatternSupport;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (dynamicRegistration != null) {
@@ -10682,7 +10884,7 @@
       reporter.push('dynamicRegistration');
       try {
         final dynamicRegistration = obj['dynamicRegistration'];
-        if (dynamicRegistration != null && !(dynamicRegistration is bool)) {
+        if (dynamicRegistration != null && dynamicRegistration is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -10692,8 +10894,7 @@
       reporter.push('relativePatternSupport');
       try {
         final relativePatternSupport = obj['relativePatternSupport'];
-        if (relativePatternSupport != null &&
-            !(relativePatternSupport is bool)) {
+        if (relativePatternSupport != null && relativePatternSupport is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -10751,6 +10952,7 @@
   /// The actual file events.
   final List<FileEvent> changes;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['changes'] = changes.map((item) => item.toJson()).toList();
@@ -10770,8 +10972,8 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!((changes is List<Object?> &&
-            (changes.every((item) => FileEvent.canParse(item, reporter)))))) {
+        if (changes is! List<Object?> ||
+            changes.any((item) => !FileEvent.canParse(item, reporter))) {
           reporter.reportError('must be of type List<FileEvent>');
           return false;
         }
@@ -10827,6 +11029,7 @@
   /// The watchers to register.
   final List<FileSystemWatcher> watchers;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['watchers'] = watchers.map((item) => item.toJson()).toList();
@@ -10846,9 +11049,9 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!((watchers is List<Object?> &&
-            (watchers.every(
-                (item) => FileSystemWatcher.canParse(item, reporter)))))) {
+        if (watchers is! List<Object?> ||
+            watchers
+                .any((item) => !FileSystemWatcher.canParse(item, reporter))) {
           reporter.reportError('must be of type List<FileSystemWatcher>');
           return false;
         }
@@ -10902,6 +11105,7 @@
   /// The actual workspace folder change event.
   final WorkspaceFoldersChangeEvent event;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['event'] = event.toJson();
@@ -10921,7 +11125,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(WorkspaceFoldersChangeEvent.canParse(event, reporter))) {
+        if (!WorkspaceFoldersChangeEvent.canParse(event, reporter)) {
           reporter.reportError('must be of type WorkspaceFoldersChangeEvent');
           return false;
         }
@@ -10985,6 +11189,7 @@
   /// The notebook document that got closed.
   final NotebookDocumentIdentifier notebookDocument;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['cellTextDocuments'] =
@@ -11006,9 +11211,9 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!((cellTextDocuments is List<Object?> &&
-            (cellTextDocuments.every(
-                (item) => TextDocumentIdentifier.canParse(item, reporter)))))) {
+        if (cellTextDocuments is! List<Object?> ||
+            cellTextDocuments.any(
+                (item) => !TextDocumentIdentifier.canParse(item, reporter))) {
           reporter.reportError('must be of type List<TextDocumentIdentifier>');
           return false;
         }
@@ -11026,8 +11231,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(NotebookDocumentIdentifier.canParse(
-            notebookDocument, reporter))) {
+        if (!NotebookDocumentIdentifier.canParse(notebookDocument, reporter)) {
           reporter.reportError('must be of type NotebookDocumentIdentifier');
           return false;
         }
@@ -11084,6 +11288,7 @@
   /// The document that was closed.
   final TextDocumentIdentifier textDocument;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['textDocument'] = textDocument.toJson();
@@ -11103,7 +11308,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(TextDocumentIdentifier.canParse(textDocument, reporter))) {
+        if (!TextDocumentIdentifier.canParse(textDocument, reporter)) {
           reporter.reportError('must be of type TextDocumentIdentifier');
           return false;
         }
@@ -11165,6 +11370,7 @@
   /// The notebook document that got opened.
   final NotebookDocument notebookDocument;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['cellTextDocuments'] =
@@ -11186,9 +11392,9 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!((cellTextDocuments is List<Object?> &&
-            (cellTextDocuments.every(
-                (item) => TextDocumentItem.canParse(item, reporter)))))) {
+        if (cellTextDocuments is! List<Object?> ||
+            cellTextDocuments
+                .any((item) => !TextDocumentItem.canParse(item, reporter))) {
           reporter.reportError('must be of type List<TextDocumentItem>');
           return false;
         }
@@ -11206,7 +11412,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(NotebookDocument.canParse(notebookDocument, reporter))) {
+        if (!NotebookDocument.canParse(notebookDocument, reporter)) {
           reporter.reportError('must be of type NotebookDocument');
           return false;
         }
@@ -11263,6 +11469,7 @@
   /// The document that was opened.
   final TextDocumentItem textDocument;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['textDocument'] = textDocument.toJson();
@@ -11282,7 +11489,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(TextDocumentItem.canParse(textDocument, reporter))) {
+        if (!TextDocumentItem.canParse(textDocument, reporter)) {
           reporter.reportError('must be of type TextDocumentItem');
           return false;
         }
@@ -11335,6 +11542,7 @@
   /// The notebook document that got saved.
   final NotebookDocumentIdentifier notebookDocument;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['notebookDocument'] = notebookDocument.toJson();
@@ -11354,8 +11562,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(NotebookDocumentIdentifier.canParse(
-            notebookDocument, reporter))) {
+        if (!NotebookDocumentIdentifier.canParse(notebookDocument, reporter)) {
           reporter.reportError('must be of type NotebookDocumentIdentifier');
           return false;
         }
@@ -11414,6 +11621,7 @@
   /// The document that was saved.
   final TextDocumentIdentifier textDocument;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (text != null) {
@@ -11428,7 +11636,7 @@
       reporter.push('text');
       try {
         final text = obj['text'];
-        if (text != null && !(text is String)) {
+        if (text != null && text is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -11446,7 +11654,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(TextDocumentIdentifier.canParse(textDocument, reporter))) {
+        if (!TextDocumentIdentifier.canParse(textDocument, reporter)) {
           reporter.reportError('must be of type TextDocumentIdentifier');
           return false;
         }
@@ -11499,6 +11707,7 @@
   /// Whether document color supports dynamic registration.
   final bool? dynamicRegistration;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (dynamicRegistration != null) {
@@ -11512,7 +11721,7 @@
       reporter.push('dynamicRegistration');
       try {
         final dynamicRegistration = obj['dynamicRegistration'];
-        if (dynamicRegistration != null && !(dynamicRegistration is bool)) {
+        if (dynamicRegistration != null && dynamicRegistration is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -11562,8 +11771,10 @@
     );
   }
 
+  @override
   final bool? workDoneProgress;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (workDoneProgress != null) {
@@ -11577,7 +11788,7 @@
       reporter.push('workDoneProgress');
       try {
         final workDoneProgress = obj['workDoneProgress'];
-        if (workDoneProgress != null && !(workDoneProgress is bool)) {
+        if (workDoneProgress != null && workDoneProgress is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -11648,14 +11859,17 @@
 
   /// An optional token that a server can use to report partial results (e.g.
   /// streaming) to the client.
+  @override
   final Either2<int, String>? partialResultToken;
 
   /// The text document.
   final TextDocumentIdentifier textDocument;
 
   /// An optional token that a server can use to report work done progress.
+  @override
   final Either2<int, String>? workDoneToken;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (partialResultToken != null) {
@@ -11674,7 +11888,8 @@
       try {
         final partialResultToken = obj['partialResultToken'];
         if (partialResultToken != null &&
-            !((partialResultToken is int || partialResultToken is String))) {
+            partialResultToken is! int &&
+            partialResultToken is! String) {
           reporter.reportError('must be of type Either2<int, String>');
           return false;
         }
@@ -11692,7 +11907,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(TextDocumentIdentifier.canParse(textDocument, reporter))) {
+        if (!TextDocumentIdentifier.canParse(textDocument, reporter)) {
           reporter.reportError('must be of type TextDocumentIdentifier');
           return false;
         }
@@ -11703,7 +11918,8 @@
       try {
         final workDoneToken = obj['workDoneToken'];
         if (workDoneToken != null &&
-            !((workDoneToken is int || workDoneToken is String))) {
+            workDoneToken is! int &&
+            workDoneToken is! String) {
           reporter.reportError('must be of type Either2<int, String>');
           return false;
         }
@@ -11759,8 +11975,8 @@
   static DocumentColorRegistrationOptions fromJson(Map<String, Object?> json) {
     final documentSelectorJson = json['documentSelector'];
     final documentSelector = (documentSelectorJson as List<Object?>?)
-        ?.map(
-            (item) => TextDocumentFilter.fromJson(item as Map<String, Object?>))
+        ?.map((item) =>
+            TextDocumentFilterWithScheme.fromJson(item as Map<String, Object?>))
         .toList();
     final idJson = json['id'];
     final id = idJson as String?;
@@ -11775,13 +11991,17 @@
 
   /// A document selector to identify the scope of the registration. If set to
   /// null the document selector provided on the client side will be used.
-  final List<TextDocumentFilter>? documentSelector;
+  @override
+  final List<TextDocumentFilterWithScheme>? documentSelector;
 
   /// The id used to register the request. The id can be used to deregister the
   /// request again. See also Registration#id.
+  @override
   final String? id;
+  @override
   final bool? workDoneProgress;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['documentSelector'] = documentSelector;
@@ -11804,10 +12024,11 @@
         }
         final documentSelector = obj['documentSelector'];
         if (documentSelector != null &&
-            !((documentSelector is List<Object?> &&
-                (documentSelector.every(
-                    (item) => TextDocumentFilter.canParse(item, reporter)))))) {
-          reporter.reportError('must be of type List<TextDocumentFilter>');
+            (documentSelector is! List<Object?> ||
+                documentSelector.any((item) =>
+                    !TextDocumentFilterWithScheme.canParse(item, reporter)))) {
+          reporter.reportError(
+              'must be of type List<TextDocumentFilterWithScheme>');
           return false;
         }
       } finally {
@@ -11816,7 +12037,7 @@
       reporter.push('id');
       try {
         final id = obj['id'];
-        if (id != null && !(id is String)) {
+        if (id != null && id is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -11826,7 +12047,7 @@
       reporter.push('workDoneProgress');
       try {
         final workDoneProgress = obj['workDoneProgress'];
-        if (workDoneProgress != null && !(workDoneProgress is bool)) {
+        if (workDoneProgress != null && workDoneProgress is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -11844,8 +12065,12 @@
   bool operator ==(Object other) {
     if (other is DocumentColorRegistrationOptions &&
         other.runtimeType == DocumentColorRegistrationOptions) {
-      return listEqual(documentSelector, other.documentSelector,
-              (TextDocumentFilter a, TextDocumentFilter b) => a == b) &&
+      return listEqual(
+              documentSelector,
+              other.documentSelector,
+              (TextDocumentFilterWithScheme a,
+                      TextDocumentFilterWithScheme b) =>
+                  a == b) &&
           id == other.id &&
           workDoneProgress == other.workDoneProgress &&
           true;
@@ -11918,6 +12143,7 @@
 
   /// An optional token that a server can use to report partial results (e.g.
   /// streaming) to the client.
+  @override
   final Either2<int, String>? partialResultToken;
 
   /// The result id of a previous response if provided.
@@ -11927,8 +12153,10 @@
   final TextDocumentIdentifier textDocument;
 
   /// An optional token that a server can use to report work done progress.
+  @override
   final Either2<int, String>? workDoneToken;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (identifier != null) {
@@ -11952,7 +12180,7 @@
       reporter.push('identifier');
       try {
         final identifier = obj['identifier'];
-        if (identifier != null && !(identifier is String)) {
+        if (identifier != null && identifier is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -11963,7 +12191,8 @@
       try {
         final partialResultToken = obj['partialResultToken'];
         if (partialResultToken != null &&
-            !((partialResultToken is int || partialResultToken is String))) {
+            partialResultToken is! int &&
+            partialResultToken is! String) {
           reporter.reportError('must be of type Either2<int, String>');
           return false;
         }
@@ -11973,7 +12202,7 @@
       reporter.push('previousResultId');
       try {
         final previousResultId = obj['previousResultId'];
-        if (previousResultId != null && !(previousResultId is String)) {
+        if (previousResultId != null && previousResultId is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -11991,7 +12220,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(TextDocumentIdentifier.canParse(textDocument, reporter))) {
+        if (!TextDocumentIdentifier.canParse(textDocument, reporter)) {
           reporter.reportError('must be of type TextDocumentIdentifier');
           return false;
         }
@@ -12002,7 +12231,8 @@
       try {
         final workDoneToken = obj['workDoneToken'];
         if (workDoneToken != null &&
-            !((workDoneToken is int || workDoneToken is String))) {
+            workDoneToken is! int &&
+            workDoneToken is! String) {
           reporter.reportError('must be of type Either2<int, String>');
           return false;
         }
@@ -12061,6 +12291,7 @@
   /// A report indicating that the last returned report is still accurate.
   static const Unchanged = DocumentDiagnosticReportKind('unchanged');
 
+  @override
   Object toJson() => _value;
 
   @override
@@ -12069,6 +12300,7 @@
   @override
   int get hashCode => _value.hashCode;
 
+  @override
   bool operator ==(Object other) =>
       other is DocumentDiagnosticReportKind && other._value == _value;
 }
@@ -12110,6 +12342,7 @@
       Either2<FullDocumentDiagnosticReport,
           UnchangedDocumentDiagnosticReport>> relatedDocuments;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['relatedDocuments'] = relatedDocuments;
@@ -12129,13 +12362,13 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!((relatedDocuments is Map &&
-            (relatedDocuments.keys.every((item) =>
-                item is String &&
-                relatedDocuments.values.every((item) =>
-                    (FullDocumentDiagnosticReport.canParse(item, reporter) ||
-                        UnchangedDocumentDiagnosticReport.canParse(
-                            item, reporter)))))))) {
+        if (relatedDocuments is! Map ||
+            (relatedDocuments.keys.any((item) =>
+                item is! String ||
+                relatedDocuments.values.any((item) =>
+                    !FullDocumentDiagnosticReport.canParse(item, reporter) &&
+                    !UnchangedDocumentDiagnosticReport.canParse(
+                        item, reporter))))) {
           reporter.reportError(
               'must be of type Map<String, Either2<FullDocumentDiagnosticReport, UnchangedDocumentDiagnosticReport>>');
           return false;
@@ -12198,6 +12431,7 @@
   /// Whether formatting supports dynamic registration.
   final bool? dynamicRegistration;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (dynamicRegistration != null) {
@@ -12211,7 +12445,7 @@
       reporter.push('dynamicRegistration');
       try {
         final dynamicRegistration = obj['dynamicRegistration'];
-        if (dynamicRegistration != null && !(dynamicRegistration is bool)) {
+        if (dynamicRegistration != null && dynamicRegistration is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -12263,8 +12497,10 @@
     );
   }
 
+  @override
   final bool? workDoneProgress;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (workDoneProgress != null) {
@@ -12278,7 +12514,7 @@
       reporter.push('workDoneProgress');
       try {
         final workDoneProgress = obj['workDoneProgress'];
-        if (workDoneProgress != null && !(workDoneProgress is bool)) {
+        if (workDoneProgress != null && workDoneProgress is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -12348,8 +12584,10 @@
   final TextDocumentIdentifier textDocument;
 
   /// An optional token that a server can use to report work done progress.
+  @override
   final Either2<int, String>? workDoneToken;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['options'] = options.toJson();
@@ -12373,7 +12611,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(FormattingOptions.canParse(options, reporter))) {
+        if (!FormattingOptions.canParse(options, reporter)) {
           reporter.reportError('must be of type FormattingOptions');
           return false;
         }
@@ -12391,7 +12629,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(TextDocumentIdentifier.canParse(textDocument, reporter))) {
+        if (!TextDocumentIdentifier.canParse(textDocument, reporter)) {
           reporter.reportError('must be of type TextDocumentIdentifier');
           return false;
         }
@@ -12402,7 +12640,8 @@
       try {
         final workDoneToken = obj['workDoneToken'];
         if (workDoneToken != null &&
-            !((workDoneToken is int || workDoneToken is String))) {
+            workDoneToken is! int &&
+            workDoneToken is! String) {
           reporter.reportError('must be of type Either2<int, String>');
           return false;
         }
@@ -12457,8 +12696,8 @@
       Map<String, Object?> json) {
     final documentSelectorJson = json['documentSelector'];
     final documentSelector = (documentSelectorJson as List<Object?>?)
-        ?.map(
-            (item) => TextDocumentFilter.fromJson(item as Map<String, Object?>))
+        ?.map((item) =>
+            TextDocumentFilterWithScheme.fromJson(item as Map<String, Object?>))
         .toList();
     final workDoneProgressJson = json['workDoneProgress'];
     final workDoneProgress = workDoneProgressJson as bool?;
@@ -12470,9 +12709,12 @@
 
   /// A document selector to identify the scope of the registration. If set to
   /// null the document selector provided on the client side will be used.
-  final List<TextDocumentFilter>? documentSelector;
+  @override
+  final List<TextDocumentFilterWithScheme>? documentSelector;
+  @override
   final bool? workDoneProgress;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['documentSelector'] = documentSelector;
@@ -12492,10 +12734,11 @@
         }
         final documentSelector = obj['documentSelector'];
         if (documentSelector != null &&
-            !((documentSelector is List<Object?> &&
-                (documentSelector.every(
-                    (item) => TextDocumentFilter.canParse(item, reporter)))))) {
-          reporter.reportError('must be of type List<TextDocumentFilter>');
+            (documentSelector is! List<Object?> ||
+                documentSelector.any((item) =>
+                    !TextDocumentFilterWithScheme.canParse(item, reporter)))) {
+          reporter.reportError(
+              'must be of type List<TextDocumentFilterWithScheme>');
           return false;
         }
       } finally {
@@ -12504,7 +12747,7 @@
       reporter.push('workDoneProgress');
       try {
         final workDoneProgress = obj['workDoneProgress'];
-        if (workDoneProgress != null && !(workDoneProgress is bool)) {
+        if (workDoneProgress != null && workDoneProgress is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -12523,8 +12766,12 @@
   bool operator ==(Object other) {
     if (other is DocumentFormattingRegistrationOptions &&
         other.runtimeType == DocumentFormattingRegistrationOptions) {
-      return listEqual(documentSelector, other.documentSelector,
-              (TextDocumentFilter a, TextDocumentFilter b) => a == b) &&
+      return listEqual(
+              documentSelector,
+              other.documentSelector,
+              (TextDocumentFilterWithScheme a,
+                      TextDocumentFilterWithScheme b) =>
+                  a == b) &&
           workDoneProgress == other.workDoneProgress &&
           true;
     }
@@ -12573,6 +12820,7 @@
   /// The range this highlight applies to.
   final Range range;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (kind != null) {
@@ -12587,7 +12835,7 @@
       reporter.push('kind');
       try {
         final kind = obj['kind'];
-        if (kind != null && !(DocumentHighlightKind.canParse(kind, reporter))) {
+        if (kind != null && !DocumentHighlightKind.canParse(kind, reporter)) {
           reporter.reportError('must be of type DocumentHighlightKind');
           return false;
         }
@@ -12605,7 +12853,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(Range.canParse(range, reporter))) {
+        if (!Range.canParse(range, reporter)) {
           reporter.reportError('must be of type Range');
           return false;
         }
@@ -12658,6 +12906,7 @@
   /// Whether document highlight supports dynamic registration.
   final bool? dynamicRegistration;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (dynamicRegistration != null) {
@@ -12671,7 +12920,7 @@
       reporter.push('dynamicRegistration');
       try {
         final dynamicRegistration = obj['dynamicRegistration'];
-        if (dynamicRegistration != null && !(dynamicRegistration is bool)) {
+        if (dynamicRegistration != null && dynamicRegistration is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -12722,6 +12971,7 @@
   /// Write-access of a symbol, like writing to a variable.
   static const Write = DocumentHighlightKind(3);
 
+  @override
   Object toJson() => _value;
 
   @override
@@ -12730,6 +12980,7 @@
   @override
   int get hashCode => _value.hashCode;
 
+  @override
   bool operator ==(Object other) =>
       other is DocumentHighlightKind && other._value == _value;
 }
@@ -12755,8 +13006,10 @@
     );
   }
 
+  @override
   final bool? workDoneProgress;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (workDoneProgress != null) {
@@ -12770,7 +13023,7 @@
       reporter.push('workDoneProgress');
       try {
         final workDoneProgress = obj['workDoneProgress'];
-        if (workDoneProgress != null && !(workDoneProgress is bool)) {
+        if (workDoneProgress != null && workDoneProgress is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -12849,17 +13102,22 @@
 
   /// An optional token that a server can use to report partial results (e.g.
   /// streaming) to the client.
+  @override
   final Either2<int, String>? partialResultToken;
 
   /// The position inside the text document.
+  @override
   final Position position;
 
   /// The text document.
+  @override
   final TextDocumentIdentifier textDocument;
 
   /// An optional token that a server can use to report work done progress.
+  @override
   final Either2<int, String>? workDoneToken;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (partialResultToken != null) {
@@ -12879,7 +13137,8 @@
       try {
         final partialResultToken = obj['partialResultToken'];
         if (partialResultToken != null &&
-            !((partialResultToken is int || partialResultToken is String))) {
+            partialResultToken is! int &&
+            partialResultToken is! String) {
           reporter.reportError('must be of type Either2<int, String>');
           return false;
         }
@@ -12897,7 +13156,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(Position.canParse(position, reporter))) {
+        if (!Position.canParse(position, reporter)) {
           reporter.reportError('must be of type Position');
           return false;
         }
@@ -12915,7 +13174,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(TextDocumentIdentifier.canParse(textDocument, reporter))) {
+        if (!TextDocumentIdentifier.canParse(textDocument, reporter)) {
           reporter.reportError('must be of type TextDocumentIdentifier');
           return false;
         }
@@ -12926,7 +13185,8 @@
       try {
         final workDoneToken = obj['workDoneToken'];
         if (workDoneToken != null &&
-            !((workDoneToken is int || workDoneToken is String))) {
+            workDoneToken is! int &&
+            workDoneToken is! String) {
           reporter.reportError('must be of type Either2<int, String>');
           return false;
         }
@@ -12983,8 +13243,8 @@
       Map<String, Object?> json) {
     final documentSelectorJson = json['documentSelector'];
     final documentSelector = (documentSelectorJson as List<Object?>?)
-        ?.map(
-            (item) => TextDocumentFilter.fromJson(item as Map<String, Object?>))
+        ?.map((item) =>
+            TextDocumentFilterWithScheme.fromJson(item as Map<String, Object?>))
         .toList();
     final workDoneProgressJson = json['workDoneProgress'];
     final workDoneProgress = workDoneProgressJson as bool?;
@@ -12996,9 +13256,12 @@
 
   /// A document selector to identify the scope of the registration. If set to
   /// null the document selector provided on the client side will be used.
-  final List<TextDocumentFilter>? documentSelector;
+  @override
+  final List<TextDocumentFilterWithScheme>? documentSelector;
+  @override
   final bool? workDoneProgress;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['documentSelector'] = documentSelector;
@@ -13018,10 +13281,11 @@
         }
         final documentSelector = obj['documentSelector'];
         if (documentSelector != null &&
-            !((documentSelector is List<Object?> &&
-                (documentSelector.every(
-                    (item) => TextDocumentFilter.canParse(item, reporter)))))) {
-          reporter.reportError('must be of type List<TextDocumentFilter>');
+            (documentSelector is! List<Object?> ||
+                documentSelector.any((item) =>
+                    !TextDocumentFilterWithScheme.canParse(item, reporter)))) {
+          reporter.reportError(
+              'must be of type List<TextDocumentFilterWithScheme>');
           return false;
         }
       } finally {
@@ -13030,7 +13294,7 @@
       reporter.push('workDoneProgress');
       try {
         final workDoneProgress = obj['workDoneProgress'];
-        if (workDoneProgress != null && !(workDoneProgress is bool)) {
+        if (workDoneProgress != null && workDoneProgress is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -13049,8 +13313,12 @@
   bool operator ==(Object other) {
     if (other is DocumentHighlightRegistrationOptions &&
         other.runtimeType == DocumentHighlightRegistrationOptions) {
-      return listEqual(documentSelector, other.documentSelector,
-              (TextDocumentFilter a, TextDocumentFilter b) => a == b) &&
+      return listEqual(
+              documentSelector,
+              other.documentSelector,
+              (TextDocumentFilterWithScheme a,
+                      TextDocumentFilterWithScheme b) =>
+                  a == b) &&
           workDoneProgress == other.workDoneProgress &&
           true;
     }
@@ -13117,6 +13385,7 @@
   ///  @since 3.15.0
   final String? tooltip;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (data != null) {
@@ -13145,7 +13414,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(Range.canParse(range, reporter))) {
+        if (!Range.canParse(range, reporter)) {
           reporter.reportError('must be of type Range');
           return false;
         }
@@ -13155,7 +13424,7 @@
       reporter.push('target');
       try {
         final target = obj['target'];
-        if (target != null && !(target is String)) {
+        if (target != null && target is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -13165,7 +13434,7 @@
       reporter.push('tooltip');
       try {
         final tooltip = obj['tooltip'];
-        if (tooltip != null && !(tooltip is String)) {
+        if (tooltip != null && tooltip is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -13231,6 +13500,7 @@
   ///  @since 3.15.0
   final bool? tooltipSupport;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (dynamicRegistration != null) {
@@ -13247,7 +13517,7 @@
       reporter.push('dynamicRegistration');
       try {
         final dynamicRegistration = obj['dynamicRegistration'];
-        if (dynamicRegistration != null && !(dynamicRegistration is bool)) {
+        if (dynamicRegistration != null && dynamicRegistration is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -13257,7 +13527,7 @@
       reporter.push('tooltipSupport');
       try {
         final tooltipSupport = obj['tooltipSupport'];
-        if (tooltipSupport != null && !(tooltipSupport is bool)) {
+        if (tooltipSupport != null && tooltipSupport is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -13318,8 +13588,10 @@
 
   /// Document links have a resolve provider as well.
   final bool? resolveProvider;
+  @override
   final bool? workDoneProgress;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (resolveProvider != null) {
@@ -13336,7 +13608,7 @@
       reporter.push('resolveProvider');
       try {
         final resolveProvider = obj['resolveProvider'];
-        if (resolveProvider != null && !(resolveProvider is bool)) {
+        if (resolveProvider != null && resolveProvider is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -13346,7 +13618,7 @@
       reporter.push('workDoneProgress');
       try {
         final workDoneProgress = obj['workDoneProgress'];
-        if (workDoneProgress != null && !(workDoneProgress is bool)) {
+        if (workDoneProgress != null && workDoneProgress is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -13422,14 +13694,17 @@
 
   /// An optional token that a server can use to report partial results (e.g.
   /// streaming) to the client.
+  @override
   final Either2<int, String>? partialResultToken;
 
   /// The document to provide document links for.
   final TextDocumentIdentifier textDocument;
 
   /// An optional token that a server can use to report work done progress.
+  @override
   final Either2<int, String>? workDoneToken;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (partialResultToken != null) {
@@ -13448,7 +13723,8 @@
       try {
         final partialResultToken = obj['partialResultToken'];
         if (partialResultToken != null &&
-            !((partialResultToken is int || partialResultToken is String))) {
+            partialResultToken is! int &&
+            partialResultToken is! String) {
           reporter.reportError('must be of type Either2<int, String>');
           return false;
         }
@@ -13466,7 +13742,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(TextDocumentIdentifier.canParse(textDocument, reporter))) {
+        if (!TextDocumentIdentifier.canParse(textDocument, reporter)) {
           reporter.reportError('must be of type TextDocumentIdentifier');
           return false;
         }
@@ -13477,7 +13753,8 @@
       try {
         final workDoneToken = obj['workDoneToken'];
         if (workDoneToken != null &&
-            !((workDoneToken is int || workDoneToken is String))) {
+            workDoneToken is! int &&
+            workDoneToken is! String) {
           reporter.reportError('must be of type Either2<int, String>');
           return false;
         }
@@ -13532,8 +13809,8 @@
   static DocumentLinkRegistrationOptions fromJson(Map<String, Object?> json) {
     final documentSelectorJson = json['documentSelector'];
     final documentSelector = (documentSelectorJson as List<Object?>?)
-        ?.map(
-            (item) => TextDocumentFilter.fromJson(item as Map<String, Object?>))
+        ?.map((item) =>
+            TextDocumentFilterWithScheme.fromJson(item as Map<String, Object?>))
         .toList();
     final resolveProviderJson = json['resolveProvider'];
     final resolveProvider = resolveProviderJson as bool?;
@@ -13548,12 +13825,16 @@
 
   /// A document selector to identify the scope of the registration. If set to
   /// null the document selector provided on the client side will be used.
-  final List<TextDocumentFilter>? documentSelector;
+  @override
+  final List<TextDocumentFilterWithScheme>? documentSelector;
 
   /// Document links have a resolve provider as well.
+  @override
   final bool? resolveProvider;
+  @override
   final bool? workDoneProgress;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['documentSelector'] = documentSelector;
@@ -13576,10 +13857,11 @@
         }
         final documentSelector = obj['documentSelector'];
         if (documentSelector != null &&
-            !((documentSelector is List<Object?> &&
-                (documentSelector.every(
-                    (item) => TextDocumentFilter.canParse(item, reporter)))))) {
-          reporter.reportError('must be of type List<TextDocumentFilter>');
+            (documentSelector is! List<Object?> ||
+                documentSelector.any((item) =>
+                    !TextDocumentFilterWithScheme.canParse(item, reporter)))) {
+          reporter.reportError(
+              'must be of type List<TextDocumentFilterWithScheme>');
           return false;
         }
       } finally {
@@ -13588,7 +13870,7 @@
       reporter.push('resolveProvider');
       try {
         final resolveProvider = obj['resolveProvider'];
-        if (resolveProvider != null && !(resolveProvider is bool)) {
+        if (resolveProvider != null && resolveProvider is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -13598,7 +13880,7 @@
       reporter.push('workDoneProgress');
       try {
         final workDoneProgress = obj['workDoneProgress'];
-        if (workDoneProgress != null && !(workDoneProgress is bool)) {
+        if (workDoneProgress != null && workDoneProgress is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -13616,8 +13898,12 @@
   bool operator ==(Object other) {
     if (other is DocumentLinkRegistrationOptions &&
         other.runtimeType == DocumentLinkRegistrationOptions) {
-      return listEqual(documentSelector, other.documentSelector,
-              (TextDocumentFilter a, TextDocumentFilter b) => a == b) &&
+      return listEqual(
+              documentSelector,
+              other.documentSelector,
+              (TextDocumentFilterWithScheme a,
+                      TextDocumentFilterWithScheme b) =>
+                  a == b) &&
           resolveProvider == other.resolveProvider &&
           workDoneProgress == other.workDoneProgress &&
           true;
@@ -13657,6 +13943,7 @@
   /// Whether on type formatting supports dynamic registration.
   final bool? dynamicRegistration;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (dynamicRegistration != null) {
@@ -13670,7 +13957,7 @@
       reporter.push('dynamicRegistration');
       try {
         final dynamicRegistration = obj['dynamicRegistration'];
-        if (dynamicRegistration != null && !(dynamicRegistration is bool)) {
+        if (dynamicRegistration != null && dynamicRegistration is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -13734,6 +14021,7 @@
   /// More trigger characters.
   final List<String>? moreTriggerCharacter;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['firstTriggerCharacter'] = firstTriggerCharacter;
@@ -13756,7 +14044,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(firstTriggerCharacter is String)) {
+        if (firstTriggerCharacter is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -13767,8 +14055,8 @@
       try {
         final moreTriggerCharacter = obj['moreTriggerCharacter'];
         if (moreTriggerCharacter != null &&
-            !((moreTriggerCharacter is List<Object?> &&
-                (moreTriggerCharacter.every((item) => item is String))))) {
+            (moreTriggerCharacter is! List<Object?> ||
+                moreTriggerCharacter.any((item) => item is! String))) {
           reporter.reportError('must be of type List<String>');
           return false;
         }
@@ -13852,6 +14140,7 @@
   /// The document to format.
   final TextDocumentIdentifier textDocument;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['ch'] = ch;
@@ -13874,7 +14163,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(ch is String)) {
+        if (ch is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -13892,7 +14181,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(FormattingOptions.canParse(options, reporter))) {
+        if (!FormattingOptions.canParse(options, reporter)) {
           reporter.reportError('must be of type FormattingOptions');
           return false;
         }
@@ -13910,7 +14199,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(Position.canParse(position, reporter))) {
+        if (!Position.canParse(position, reporter)) {
           reporter.reportError('must be of type Position');
           return false;
         }
@@ -13928,7 +14217,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(TextDocumentIdentifier.canParse(textDocument, reporter))) {
+        if (!TextDocumentIdentifier.canParse(textDocument, reporter)) {
           reporter.reportError('must be of type TextDocumentIdentifier');
           return false;
         }
@@ -13986,8 +14275,8 @@
       Map<String, Object?> json) {
     final documentSelectorJson = json['documentSelector'];
     final documentSelector = (documentSelectorJson as List<Object?>?)
-        ?.map(
-            (item) => TextDocumentFilter.fromJson(item as Map<String, Object?>))
+        ?.map((item) =>
+            TextDocumentFilterWithScheme.fromJson(item as Map<String, Object?>))
         .toList();
     final firstTriggerCharacterJson = json['firstTriggerCharacter'];
     final firstTriggerCharacter = firstTriggerCharacterJson as String;
@@ -14004,14 +14293,18 @@
 
   /// A document selector to identify the scope of the registration. If set to
   /// null the document selector provided on the client side will be used.
-  final List<TextDocumentFilter>? documentSelector;
+  @override
+  final List<TextDocumentFilterWithScheme>? documentSelector;
 
   /// A character on which formatting should be triggered, like `{`.
+  @override
   final String firstTriggerCharacter;
 
   /// More trigger characters.
+  @override
   final List<String>? moreTriggerCharacter;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['documentSelector'] = documentSelector;
@@ -14032,10 +14325,11 @@
         }
         final documentSelector = obj['documentSelector'];
         if (documentSelector != null &&
-            !((documentSelector is List<Object?> &&
-                (documentSelector.every(
-                    (item) => TextDocumentFilter.canParse(item, reporter)))))) {
-          reporter.reportError('must be of type List<TextDocumentFilter>');
+            (documentSelector is! List<Object?> ||
+                documentSelector.any((item) =>
+                    !TextDocumentFilterWithScheme.canParse(item, reporter)))) {
+          reporter.reportError(
+              'must be of type List<TextDocumentFilterWithScheme>');
           return false;
         }
       } finally {
@@ -14052,7 +14346,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(firstTriggerCharacter is String)) {
+        if (firstTriggerCharacter is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -14063,8 +14357,8 @@
       try {
         final moreTriggerCharacter = obj['moreTriggerCharacter'];
         if (moreTriggerCharacter != null &&
-            !((moreTriggerCharacter is List<Object?> &&
-                (moreTriggerCharacter.every((item) => item is String))))) {
+            (moreTriggerCharacter is! List<Object?> ||
+                moreTriggerCharacter.any((item) => item is! String))) {
           reporter.reportError('must be of type List<String>');
           return false;
         }
@@ -14083,8 +14377,12 @@
   bool operator ==(Object other) {
     if (other is DocumentOnTypeFormattingRegistrationOptions &&
         other.runtimeType == DocumentOnTypeFormattingRegistrationOptions) {
-      return listEqual(documentSelector, other.documentSelector,
-              (TextDocumentFilter a, TextDocumentFilter b) => a == b) &&
+      return listEqual(
+              documentSelector,
+              other.documentSelector,
+              (TextDocumentFilterWithScheme a,
+                      TextDocumentFilterWithScheme b) =>
+                  a == b) &&
           firstTriggerCharacter == other.firstTriggerCharacter &&
           listEqual(moreTriggerCharacter, other.moreTriggerCharacter,
               (String a, String b) => a == b) &&
@@ -14125,6 +14423,7 @@
   /// Whether formatting supports dynamic registration.
   final bool? dynamicRegistration;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (dynamicRegistration != null) {
@@ -14138,7 +14437,7 @@
       reporter.push('dynamicRegistration');
       try {
         final dynamicRegistration = obj['dynamicRegistration'];
-        if (dynamicRegistration != null && !(dynamicRegistration is bool)) {
+        if (dynamicRegistration != null && dynamicRegistration is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -14191,8 +14490,10 @@
     );
   }
 
+  @override
   final bool? workDoneProgress;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (workDoneProgress != null) {
@@ -14206,7 +14507,7 @@
       reporter.push('workDoneProgress');
       try {
         final workDoneProgress = obj['workDoneProgress'];
-        if (workDoneProgress != null && !(workDoneProgress is bool)) {
+        if (workDoneProgress != null && workDoneProgress is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -14284,8 +14585,10 @@
   final TextDocumentIdentifier textDocument;
 
   /// An optional token that a server can use to report work done progress.
+  @override
   final Either2<int, String>? workDoneToken;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['options'] = options.toJson();
@@ -14310,7 +14613,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(FormattingOptions.canParse(options, reporter))) {
+        if (!FormattingOptions.canParse(options, reporter)) {
           reporter.reportError('must be of type FormattingOptions');
           return false;
         }
@@ -14328,7 +14631,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(Range.canParse(range, reporter))) {
+        if (!Range.canParse(range, reporter)) {
           reporter.reportError('must be of type Range');
           return false;
         }
@@ -14346,7 +14649,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(TextDocumentIdentifier.canParse(textDocument, reporter))) {
+        if (!TextDocumentIdentifier.canParse(textDocument, reporter)) {
           reporter.reportError('must be of type TextDocumentIdentifier');
           return false;
         }
@@ -14357,7 +14660,8 @@
       try {
         final workDoneToken = obj['workDoneToken'];
         if (workDoneToken != null &&
-            !((workDoneToken is int || workDoneToken is String))) {
+            workDoneToken is! int &&
+            workDoneToken is! String) {
           reporter.reportError('must be of type Either2<int, String>');
           return false;
         }
@@ -14414,8 +14718,8 @@
       Map<String, Object?> json) {
     final documentSelectorJson = json['documentSelector'];
     final documentSelector = (documentSelectorJson as List<Object?>?)
-        ?.map(
-            (item) => TextDocumentFilter.fromJson(item as Map<String, Object?>))
+        ?.map((item) =>
+            TextDocumentFilterWithScheme.fromJson(item as Map<String, Object?>))
         .toList();
     final workDoneProgressJson = json['workDoneProgress'];
     final workDoneProgress = workDoneProgressJson as bool?;
@@ -14427,9 +14731,12 @@
 
   /// A document selector to identify the scope of the registration. If set to
   /// null the document selector provided on the client side will be used.
-  final List<TextDocumentFilter>? documentSelector;
+  @override
+  final List<TextDocumentFilterWithScheme>? documentSelector;
+  @override
   final bool? workDoneProgress;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['documentSelector'] = documentSelector;
@@ -14449,10 +14756,11 @@
         }
         final documentSelector = obj['documentSelector'];
         if (documentSelector != null &&
-            !((documentSelector is List<Object?> &&
-                (documentSelector.every(
-                    (item) => TextDocumentFilter.canParse(item, reporter)))))) {
-          reporter.reportError('must be of type List<TextDocumentFilter>');
+            (documentSelector is! List<Object?> ||
+                documentSelector.any((item) =>
+                    !TextDocumentFilterWithScheme.canParse(item, reporter)))) {
+          reporter.reportError(
+              'must be of type List<TextDocumentFilterWithScheme>');
           return false;
         }
       } finally {
@@ -14461,7 +14769,7 @@
       reporter.push('workDoneProgress');
       try {
         final workDoneProgress = obj['workDoneProgress'];
-        if (workDoneProgress != null && !(workDoneProgress is bool)) {
+        if (workDoneProgress != null && workDoneProgress is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -14480,8 +14788,12 @@
   bool operator ==(Object other) {
     if (other is DocumentRangeFormattingRegistrationOptions &&
         other.runtimeType == DocumentRangeFormattingRegistrationOptions) {
-      return listEqual(documentSelector, other.documentSelector,
-              (TextDocumentFilter a, TextDocumentFilter b) => a == b) &&
+      return listEqual(
+              documentSelector,
+              other.documentSelector,
+              (TextDocumentFilterWithScheme a,
+                      TextDocumentFilterWithScheme b) =>
+                  a == b) &&
           workDoneProgress == other.workDoneProgress &&
           true;
     }
@@ -14584,6 +14896,7 @@
   ///  @since 3.16.0
   final List<SymbolTag>? tags;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (children != null) {
@@ -14611,9 +14924,9 @@
       try {
         final children = obj['children'];
         if (children != null &&
-            !((children is List<Object?> &&
-                (children.every(
-                    (item) => DocumentSymbol.canParse(item, reporter)))))) {
+            (children is! List<Object?> ||
+                children
+                    .any((item) => !DocumentSymbol.canParse(item, reporter)))) {
           reporter.reportError('must be of type List<DocumentSymbol>');
           return false;
         }
@@ -14623,7 +14936,7 @@
       reporter.push('deprecated');
       try {
         final deprecated = obj['deprecated'];
-        if (deprecated != null && !(deprecated is bool)) {
+        if (deprecated != null && deprecated is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -14633,7 +14946,7 @@
       reporter.push('detail');
       try {
         final detail = obj['detail'];
-        if (detail != null && !(detail is String)) {
+        if (detail != null && detail is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -14651,7 +14964,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(SymbolKind.canParse(kind, reporter))) {
+        if (!SymbolKind.canParse(kind, reporter)) {
           reporter.reportError('must be of type SymbolKind');
           return false;
         }
@@ -14669,7 +14982,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(name is String)) {
+        if (name is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -14687,7 +15000,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(Range.canParse(range, reporter))) {
+        if (!Range.canParse(range, reporter)) {
           reporter.reportError('must be of type Range');
           return false;
         }
@@ -14705,7 +15018,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(Range.canParse(selectionRange, reporter))) {
+        if (!Range.canParse(selectionRange, reporter)) {
           reporter.reportError('must be of type Range');
           return false;
         }
@@ -14716,8 +15029,8 @@
       try {
         final tags = obj['tags'];
         if (tags != null &&
-            !((tags is List<Object?> &&
-                (tags.every((item) => SymbolTag.canParse(item, reporter)))))) {
+            (tags is! List<Object?> ||
+                tags.any((item) => !SymbolTag.canParse(item, reporter)))) {
           reporter.reportError('must be of type List<SymbolTag>');
           return false;
         }
@@ -14826,6 +15139,7 @@
   ///  @since 3.16.0
   final DocumentSymbolClientCapabilitiesTagSupport? tagSupport;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (dynamicRegistration != null) {
@@ -14852,7 +15166,7 @@
       reporter.push('dynamicRegistration');
       try {
         final dynamicRegistration = obj['dynamicRegistration'];
-        if (dynamicRegistration != null && !(dynamicRegistration is bool)) {
+        if (dynamicRegistration != null && dynamicRegistration is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -14864,7 +15178,7 @@
         final hierarchicalDocumentSymbolSupport =
             obj['hierarchicalDocumentSymbolSupport'];
         if (hierarchicalDocumentSymbolSupport != null &&
-            !(hierarchicalDocumentSymbolSupport is bool)) {
+            hierarchicalDocumentSymbolSupport is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -14874,7 +15188,7 @@
       reporter.push('labelSupport');
       try {
         final labelSupport = obj['labelSupport'];
-        if (labelSupport != null && !(labelSupport is bool)) {
+        if (labelSupport != null && labelSupport is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -14885,8 +15199,8 @@
       try {
         final symbolKind = obj['symbolKind'];
         if (symbolKind != null &&
-            !(DocumentSymbolClientCapabilitiesSymbolKind.canParse(
-                symbolKind, reporter))) {
+            !DocumentSymbolClientCapabilitiesSymbolKind.canParse(
+                symbolKind, reporter)) {
           reporter.reportError(
               'must be of type DocumentSymbolClientCapabilitiesSymbolKind');
           return false;
@@ -14898,8 +15212,8 @@
       try {
         final tagSupport = obj['tagSupport'];
         if (tagSupport != null &&
-            !(DocumentSymbolClientCapabilitiesTagSupport.canParse(
-                tagSupport, reporter))) {
+            !DocumentSymbolClientCapabilitiesTagSupport.canParse(
+                tagSupport, reporter)) {
           reporter.reportError(
               'must be of type DocumentSymbolClientCapabilitiesTagSupport');
           return false;
@@ -14970,6 +15284,7 @@
   /// from `File` to `Array` as defined in the initial version of the protocol.
   final List<SymbolKind>? valueSet;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (valueSet != null) {
@@ -14984,9 +15299,8 @@
       try {
         final valueSet = obj['valueSet'];
         if (valueSet != null &&
-            !((valueSet is List<Object?> &&
-                (valueSet
-                    .every((item) => SymbolKind.canParse(item, reporter)))))) {
+            (valueSet is! List<Object?> ||
+                valueSet.any((item) => !SymbolKind.canParse(item, reporter)))) {
           reporter.reportError('must be of type List<SymbolKind>');
           return false;
         }
@@ -15042,6 +15356,7 @@
   /// The tags supported by the client.
   final List<SymbolTag> valueSet;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['valueSet'] = valueSet.map((item) => item.toJson()).toList();
@@ -15061,8 +15376,8 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!((valueSet is List<Object?> &&
-            (valueSet.every((item) => SymbolTag.canParse(item, reporter)))))) {
+        if (valueSet is! List<Object?> ||
+            valueSet.any((item) => !SymbolTag.canParse(item, reporter))) {
           reporter.reportError('must be of type List<SymbolTag>');
           return false;
         }
@@ -15123,8 +15438,10 @@
   /// shown for the same document.
   ///  @since 3.16.0
   final String? label;
+  @override
   final bool? workDoneProgress;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (label != null) {
@@ -15141,7 +15458,7 @@
       reporter.push('label');
       try {
         final label = obj['label'];
-        if (label != null && !(label is String)) {
+        if (label != null && label is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -15151,7 +15468,7 @@
       reporter.push('workDoneProgress');
       try {
         final workDoneProgress = obj['workDoneProgress'];
-        if (workDoneProgress != null && !(workDoneProgress is bool)) {
+        if (workDoneProgress != null && workDoneProgress is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -15227,14 +15544,17 @@
 
   /// An optional token that a server can use to report partial results (e.g.
   /// streaming) to the client.
+  @override
   final Either2<int, String>? partialResultToken;
 
   /// The text document.
   final TextDocumentIdentifier textDocument;
 
   /// An optional token that a server can use to report work done progress.
+  @override
   final Either2<int, String>? workDoneToken;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (partialResultToken != null) {
@@ -15253,7 +15573,8 @@
       try {
         final partialResultToken = obj['partialResultToken'];
         if (partialResultToken != null &&
-            !((partialResultToken is int || partialResultToken is String))) {
+            partialResultToken is! int &&
+            partialResultToken is! String) {
           reporter.reportError('must be of type Either2<int, String>');
           return false;
         }
@@ -15271,7 +15592,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(TextDocumentIdentifier.canParse(textDocument, reporter))) {
+        if (!TextDocumentIdentifier.canParse(textDocument, reporter)) {
           reporter.reportError('must be of type TextDocumentIdentifier');
           return false;
         }
@@ -15282,7 +15603,8 @@
       try {
         final workDoneToken = obj['workDoneToken'];
         if (workDoneToken != null &&
-            !((workDoneToken is int || workDoneToken is String))) {
+            workDoneToken is! int &&
+            workDoneToken is! String) {
           reporter.reportError('must be of type Either2<int, String>');
           return false;
         }
@@ -15337,8 +15659,8 @@
   static DocumentSymbolRegistrationOptions fromJson(Map<String, Object?> json) {
     final documentSelectorJson = json['documentSelector'];
     final documentSelector = (documentSelectorJson as List<Object?>?)
-        ?.map(
-            (item) => TextDocumentFilter.fromJson(item as Map<String, Object?>))
+        ?.map((item) =>
+            TextDocumentFilterWithScheme.fromJson(item as Map<String, Object?>))
         .toList();
     final labelJson = json['label'];
     final label = labelJson as String?;
@@ -15353,14 +15675,18 @@
 
   /// A document selector to identify the scope of the registration. If set to
   /// null the document selector provided on the client side will be used.
-  final List<TextDocumentFilter>? documentSelector;
+  @override
+  final List<TextDocumentFilterWithScheme>? documentSelector;
 
   /// A human-readable string that is shown when multiple outlines trees are
   /// shown for the same document.
   ///  @since 3.16.0
+  @override
   final String? label;
+  @override
   final bool? workDoneProgress;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['documentSelector'] = documentSelector;
@@ -15383,10 +15709,11 @@
         }
         final documentSelector = obj['documentSelector'];
         if (documentSelector != null &&
-            !((documentSelector is List<Object?> &&
-                (documentSelector.every(
-                    (item) => TextDocumentFilter.canParse(item, reporter)))))) {
-          reporter.reportError('must be of type List<TextDocumentFilter>');
+            (documentSelector is! List<Object?> ||
+                documentSelector.any((item) =>
+                    !TextDocumentFilterWithScheme.canParse(item, reporter)))) {
+          reporter.reportError(
+              'must be of type List<TextDocumentFilterWithScheme>');
           return false;
         }
       } finally {
@@ -15395,7 +15722,7 @@
       reporter.push('label');
       try {
         final label = obj['label'];
-        if (label != null && !(label is String)) {
+        if (label != null && label is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -15405,7 +15732,7 @@
       reporter.push('workDoneProgress');
       try {
         final workDoneProgress = obj['workDoneProgress'];
-        if (workDoneProgress != null && !(workDoneProgress is bool)) {
+        if (workDoneProgress != null && workDoneProgress is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -15423,8 +15750,12 @@
   bool operator ==(Object other) {
     if (other is DocumentSymbolRegistrationOptions &&
         other.runtimeType == DocumentSymbolRegistrationOptions) {
-      return listEqual(documentSelector, other.documentSelector,
-              (TextDocumentFilter a, TextDocumentFilter b) => a == b) &&
+      return listEqual(
+              documentSelector,
+              other.documentSelector,
+              (TextDocumentFilterWithScheme a,
+                      TextDocumentFilterWithScheme b) =>
+                  a == b) &&
           label == other.label &&
           workDoneProgress == other.workDoneProgress &&
           true;
@@ -15510,6 +15841,7 @@
   static const ServerNotInitialized = ErrorCodes(-32002);
   static const UnknownErrorCode = ErrorCodes(-32001);
 
+  @override
   Object toJson() => _value;
 
   @override
@@ -15518,6 +15850,7 @@
   @override
   int get hashCode => _value.hashCode;
 
+  @override
   bool operator ==(Object other) =>
       other is ErrorCodes && other._value == _value;
 }
@@ -15542,6 +15875,7 @@
   /// Execute command supports dynamic registration.
   final bool? dynamicRegistration;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (dynamicRegistration != null) {
@@ -15555,7 +15889,7 @@
       reporter.push('dynamicRegistration');
       try {
         final dynamicRegistration = obj['dynamicRegistration'];
-        if (dynamicRegistration != null && !(dynamicRegistration is bool)) {
+        if (dynamicRegistration != null && dynamicRegistration is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -15612,8 +15946,10 @@
 
   /// The commands to be executed on the server
   final List<String> commands;
+  @override
   final bool? workDoneProgress;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['commands'] = commands;
@@ -15636,8 +15972,8 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!((commands is List<Object?> &&
-            (commands.every((item) => item is String))))) {
+        if (commands is! List<Object?> ||
+            commands.any((item) => item is! String)) {
           reporter.reportError('must be of type List<String>');
           return false;
         }
@@ -15647,7 +15983,7 @@
       reporter.push('workDoneProgress');
       try {
         final workDoneProgress = obj['workDoneProgress'];
-        if (workDoneProgress != null && !(workDoneProgress is bool)) {
+        if (workDoneProgress != null && workDoneProgress is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -15722,8 +16058,10 @@
   final String command;
 
   /// An optional token that a server can use to report work done progress.
+  @override
   final Either2<int, String>? workDoneToken;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (arguments != null) {
@@ -15742,8 +16080,7 @@
       try {
         final arguments = obj['arguments'];
         if (arguments != null &&
-            !((arguments is List<Object?> &&
-                (arguments.every((item) => true))))) {
+            (arguments is! List<Object?> || arguments.any((item) => false))) {
           reporter.reportError('must be of type List<Object?>');
           return false;
         }
@@ -15761,7 +16098,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(command is String)) {
+        if (command is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -15772,7 +16109,8 @@
       try {
         final workDoneToken = obj['workDoneToken'];
         if (workDoneToken != null &&
-            !((workDoneToken is int || workDoneToken is String))) {
+            workDoneToken is! int &&
+            workDoneToken is! String) {
           reporter.reportError('must be of type Either2<int, String>');
           return false;
         }
@@ -15835,9 +16173,12 @@
   }
 
   /// The commands to be executed on the server
+  @override
   final List<String> commands;
+  @override
   final bool? workDoneProgress;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['commands'] = commands;
@@ -15860,8 +16201,8 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!((commands is List<Object?> &&
-            (commands.every((item) => item is String))))) {
+        if (commands is! List<Object?> ||
+            commands.any((item) => item is! String)) {
           reporter.reportError('must be of type List<String>');
           return false;
         }
@@ -15871,7 +16212,7 @@
       reporter.push('workDoneProgress');
       try {
         final workDoneProgress = obj['workDoneProgress'];
-        if (workDoneProgress != null && !(workDoneProgress is bool)) {
+        if (workDoneProgress != null && workDoneProgress is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -15935,6 +16276,7 @@
   /// Whether the execution was successful or not if known by the client.
   final bool? success;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['executionOrder'] = executionOrder;
@@ -15957,7 +16299,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(executionOrder is int)) {
+        if (executionOrder is! int) {
           reporter.reportError('must be of type int');
           return false;
         }
@@ -15967,7 +16309,7 @@
       reporter.push('success');
       try {
         final success = obj['success'];
-        if (success != null && !(success is bool)) {
+        if (success != null && success is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -16037,6 +16379,7 @@
   /// guarantee that this is succeeding.
   static const Undo = FailureHandlingKind._('undo');
 
+  @override
   Object toJson() => _value;
 
   @override
@@ -16045,6 +16388,7 @@
   @override
   int get hashCode => _value.hashCode;
 
+  @override
   bool operator ==(Object other) =>
       other is FailureHandlingKind && other._value == _value;
 }
@@ -16069,6 +16413,7 @@
   /// The file got deleted.
   static const Deleted = FileChangeType(3);
 
+  @override
   Object toJson() => _value;
 
   @override
@@ -16077,6 +16422,7 @@
   @override
   int get hashCode => _value.hashCode;
 
+  @override
   bool operator ==(Object other) =>
       other is FileChangeType && other._value == _value;
 }
@@ -16103,6 +16449,7 @@
   /// A file:// URI for the location of the file/folder being created.
   final String uri;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['uri'] = uri;
@@ -16122,7 +16469,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(uri is String)) {
+        if (uri is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -16173,6 +16520,7 @@
   /// A file:// URI for the location of the file/folder being deleted.
   final String uri;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['uri'] = uri;
@@ -16192,7 +16540,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(uri is String)) {
+        if (uri is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -16249,6 +16597,7 @@
   /// The file's URI.
   final String uri;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['type'] = type;
@@ -16269,7 +16618,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(type is int)) {
+        if (type is! int) {
           reporter.reportError('must be of type int');
           return false;
         }
@@ -16287,7 +16636,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(uri is String)) {
+        if (uri is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -16382,6 +16731,7 @@
   /// The client has support for sending willRenameFiles requests.
   final bool? willRename;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (didCreate != null) {
@@ -16413,7 +16763,7 @@
       reporter.push('didCreate');
       try {
         final didCreate = obj['didCreate'];
-        if (didCreate != null && !(didCreate is bool)) {
+        if (didCreate != null && didCreate is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -16423,7 +16773,7 @@
       reporter.push('didDelete');
       try {
         final didDelete = obj['didDelete'];
-        if (didDelete != null && !(didDelete is bool)) {
+        if (didDelete != null && didDelete is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -16433,7 +16783,7 @@
       reporter.push('didRename');
       try {
         final didRename = obj['didRename'];
-        if (didRename != null && !(didRename is bool)) {
+        if (didRename != null && didRename is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -16443,7 +16793,7 @@
       reporter.push('dynamicRegistration');
       try {
         final dynamicRegistration = obj['dynamicRegistration'];
-        if (dynamicRegistration != null && !(dynamicRegistration is bool)) {
+        if (dynamicRegistration != null && dynamicRegistration is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -16453,7 +16803,7 @@
       reporter.push('willCreate');
       try {
         final willCreate = obj['willCreate'];
-        if (willCreate != null && !(willCreate is bool)) {
+        if (willCreate != null && willCreate is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -16463,7 +16813,7 @@
       reporter.push('willDelete');
       try {
         final willDelete = obj['willDelete'];
-        if (willDelete != null && !(willDelete is bool)) {
+        if (willDelete != null && willDelete is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -16473,7 +16823,7 @@
       reporter.push('willRename');
       try {
         final willRename = obj['willRename'];
-        if (willRename != null && !(willRename is bool)) {
+        if (willRename != null && willRename is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -16549,6 +16899,7 @@
   /// A Uri like `file` or `untitled`.
   final String? scheme;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['pattern'] = pattern.toJson();
@@ -16571,7 +16922,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(FileOperationPattern.canParse(pattern, reporter))) {
+        if (!FileOperationPattern.canParse(pattern, reporter)) {
           reporter.reportError('must be of type FileOperationPattern');
           return false;
         }
@@ -16581,7 +16932,7 @@
       reporter.push('scheme');
       try {
         final scheme = obj['scheme'];
-        if (scheme != null && !(scheme is String)) {
+        if (scheme != null && scheme is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -16687,6 +17038,7 @@
   /// The server is interested in receiving willRenameFiles requests.
   final FileOperationRegistrationOptions? willRename;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (didCreate != null) {
@@ -16716,7 +17068,7 @@
       try {
         final didCreate = obj['didCreate'];
         if (didCreate != null &&
-            !(FileOperationRegistrationOptions.canParse(didCreate, reporter))) {
+            !FileOperationRegistrationOptions.canParse(didCreate, reporter)) {
           reporter
               .reportError('must be of type FileOperationRegistrationOptions');
           return false;
@@ -16728,7 +17080,7 @@
       try {
         final didDelete = obj['didDelete'];
         if (didDelete != null &&
-            !(FileOperationRegistrationOptions.canParse(didDelete, reporter))) {
+            !FileOperationRegistrationOptions.canParse(didDelete, reporter)) {
           reporter
               .reportError('must be of type FileOperationRegistrationOptions');
           return false;
@@ -16740,7 +17092,7 @@
       try {
         final didRename = obj['didRename'];
         if (didRename != null &&
-            !(FileOperationRegistrationOptions.canParse(didRename, reporter))) {
+            !FileOperationRegistrationOptions.canParse(didRename, reporter)) {
           reporter
               .reportError('must be of type FileOperationRegistrationOptions');
           return false;
@@ -16752,8 +17104,7 @@
       try {
         final willCreate = obj['willCreate'];
         if (willCreate != null &&
-            !(FileOperationRegistrationOptions.canParse(
-                willCreate, reporter))) {
+            !FileOperationRegistrationOptions.canParse(willCreate, reporter)) {
           reporter
               .reportError('must be of type FileOperationRegistrationOptions');
           return false;
@@ -16765,8 +17116,7 @@
       try {
         final willDelete = obj['willDelete'];
         if (willDelete != null &&
-            !(FileOperationRegistrationOptions.canParse(
-                willDelete, reporter))) {
+            !FileOperationRegistrationOptions.canParse(willDelete, reporter)) {
           reporter
               .reportError('must be of type FileOperationRegistrationOptions');
           return false;
@@ -16778,8 +17128,7 @@
       try {
         final willRename = obj['willRename'];
         if (willRename != null &&
-            !(FileOperationRegistrationOptions.canParse(
-                willRename, reporter))) {
+            !FileOperationRegistrationOptions.canParse(willRename, reporter)) {
           reporter
               .reportError('must be of type FileOperationRegistrationOptions');
           return false;
@@ -16877,6 +17226,7 @@
   /// Additional options used during matching.
   final FileOperationPatternOptions? options;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['glob'] = glob;
@@ -16902,7 +17252,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(glob is String)) {
+        if (glob is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -16913,7 +17263,7 @@
       try {
         final matches = obj['matches'];
         if (matches != null &&
-            !(FileOperationPatternKind.canParse(matches, reporter))) {
+            !FileOperationPatternKind.canParse(matches, reporter)) {
           reporter.reportError('must be of type FileOperationPatternKind');
           return false;
         }
@@ -16924,7 +17274,7 @@
       try {
         final options = obj['options'];
         if (options != null &&
-            !(FileOperationPatternOptions.canParse(options, reporter))) {
+            !FileOperationPatternOptions.canParse(options, reporter)) {
           reporter.reportError('must be of type FileOperationPatternOptions');
           return false;
         }
@@ -16979,6 +17329,7 @@
   /// The pattern matches a folder only.
   static const folder = FileOperationPatternKind('folder');
 
+  @override
   Object toJson() => _value;
 
   @override
@@ -16987,6 +17338,7 @@
   @override
   int get hashCode => _value.hashCode;
 
+  @override
   bool operator ==(Object other) =>
       other is FileOperationPatternKind && other._value == _value;
 }
@@ -17013,6 +17365,7 @@
   /// The pattern should be matched ignoring casing.
   final bool? ignoreCase;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (ignoreCase != null) {
@@ -17026,7 +17379,7 @@
       reporter.push('ignoreCase');
       try {
         final ignoreCase = obj['ignoreCase'];
-        if (ignoreCase != null && !(ignoreCase is bool)) {
+        if (ignoreCase != null && ignoreCase is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -17081,6 +17434,7 @@
   /// The actual filters.
   final List<FileOperationFilter> filters;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['filters'] = filters.map((item) => item.toJson()).toList();
@@ -17100,9 +17454,9 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!((filters is List<Object?> &&
-            (filters.every(
-                (item) => FileOperationFilter.canParse(item, reporter)))))) {
+        if (filters is! List<Object?> ||
+            filters
+                .any((item) => !FileOperationFilter.canParse(item, reporter))) {
           reporter.reportError('must be of type List<FileOperationFilter>');
           return false;
         }
@@ -17163,6 +17517,7 @@
   /// A file:// URI for the original location of the file/folder being renamed.
   final String oldUri;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['newUri'] = newUri;
@@ -17183,7 +17538,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(newUri is String)) {
+        if (newUri is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -17201,7 +17556,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(oldUri is String)) {
+        if (oldUri is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -17268,6 +17623,7 @@
   /// | WatchKind.Change | WatchKind.Delete which is 7.
   final WatchKind? kind;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['globPattern'] = globPattern;
@@ -17290,8 +17646,8 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!((globPattern is String ||
-            RelativePattern.canParse(globPattern, reporter)))) {
+        if (globPattern is! String &&
+            !RelativePattern.canParse(globPattern, reporter)) {
           reporter
               .reportError('must be of type Either2<String, RelativePattern>');
           return false;
@@ -17302,7 +17658,7 @@
       reporter.push('kind');
       try {
         final kind = obj['kind'];
-        if (kind != null && !(WatchKind.canParse(kind, reporter))) {
+        if (kind != null && !WatchKind.canParse(kind, reporter)) {
           reporter.reportError('must be of type WatchKind');
           return false;
         }
@@ -17405,6 +17761,7 @@
   /// larger and smaller than the number of lines in the document.
   final int startLine;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (collapsedText != null) {
@@ -17429,7 +17786,7 @@
       reporter.push('collapsedText');
       try {
         final collapsedText = obj['collapsedText'];
-        if (collapsedText != null && !(collapsedText is String)) {
+        if (collapsedText != null && collapsedText is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -17439,7 +17796,7 @@
       reporter.push('endCharacter');
       try {
         final endCharacter = obj['endCharacter'];
-        if (endCharacter != null && !(endCharacter is int)) {
+        if (endCharacter != null && endCharacter is! int) {
           reporter.reportError('must be of type int');
           return false;
         }
@@ -17457,7 +17814,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(endLine is int)) {
+        if (endLine is! int) {
           reporter.reportError('must be of type int');
           return false;
         }
@@ -17467,7 +17824,7 @@
       reporter.push('kind');
       try {
         final kind = obj['kind'];
-        if (kind != null && !(FoldingRangeKind.canParse(kind, reporter))) {
+        if (kind != null && !FoldingRangeKind.canParse(kind, reporter)) {
           reporter.reportError('must be of type FoldingRangeKind');
           return false;
         }
@@ -17477,7 +17834,7 @@
       reporter.push('startCharacter');
       try {
         final startCharacter = obj['startCharacter'];
-        if (startCharacter != null && !(startCharacter is int)) {
+        if (startCharacter != null && startCharacter is! int) {
           reporter.reportError('must be of type int');
           return false;
         }
@@ -17495,7 +17852,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(startLine is int)) {
+        if (startLine is! int) {
           reporter.reportError('must be of type int');
           return false;
         }
@@ -17599,6 +17956,7 @@
   /// limit.
   final int? rangeLimit;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (dynamicRegistration != null) {
@@ -17624,7 +17982,7 @@
       reporter.push('dynamicRegistration');
       try {
         final dynamicRegistration = obj['dynamicRegistration'];
-        if (dynamicRegistration != null && !(dynamicRegistration is bool)) {
+        if (dynamicRegistration != null && dynamicRegistration is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -17635,8 +17993,8 @@
       try {
         final foldingRange = obj['foldingRange'];
         if (foldingRange != null &&
-            !(FoldingRangeClientCapabilitiesFoldingRange.canParse(
-                foldingRange, reporter))) {
+            !FoldingRangeClientCapabilitiesFoldingRange.canParse(
+                foldingRange, reporter)) {
           reporter.reportError(
               'must be of type FoldingRangeClientCapabilitiesFoldingRange');
           return false;
@@ -17648,8 +18006,8 @@
       try {
         final foldingRangeKind = obj['foldingRangeKind'];
         if (foldingRangeKind != null &&
-            !(FoldingRangeClientCapabilitiesFoldingRangeKind.canParse(
-                foldingRangeKind, reporter))) {
+            !FoldingRangeClientCapabilitiesFoldingRangeKind.canParse(
+                foldingRangeKind, reporter)) {
           reporter.reportError(
               'must be of type FoldingRangeClientCapabilitiesFoldingRangeKind');
           return false;
@@ -17660,7 +18018,7 @@
       reporter.push('lineFoldingOnly');
       try {
         final lineFoldingOnly = obj['lineFoldingOnly'];
-        if (lineFoldingOnly != null && !(lineFoldingOnly is bool)) {
+        if (lineFoldingOnly != null && lineFoldingOnly is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -17670,7 +18028,7 @@
       reporter.push('rangeLimit');
       try {
         final rangeLimit = obj['rangeLimit'];
-        if (rangeLimit != null && !(rangeLimit is int)) {
+        if (rangeLimit != null && rangeLimit is! int) {
           reporter.reportError('must be of type int');
           return false;
         }
@@ -17734,6 +18092,7 @@
   ///  @since 3.17.0
   final bool? collapsedText;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (collapsedText != null) {
@@ -17747,7 +18106,7 @@
       reporter.push('collapsedText');
       try {
         final collapsedText = obj['collapsedText'];
-        if (collapsedText != null && !(collapsedText is bool)) {
+        if (collapsedText != null && collapsedText is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -17803,6 +18162,7 @@
   /// set gracefully and falls back to a default value when unknown.
   final List<FoldingRangeKind>? valueSet;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (valueSet != null) {
@@ -17817,9 +18177,9 @@
       try {
         final valueSet = obj['valueSet'];
         if (valueSet != null &&
-            !((valueSet is List<Object?> &&
-                (valueSet.every(
-                    (item) => FoldingRangeKind.canParse(item, reporter)))))) {
+            (valueSet is! List<Object?> ||
+                valueSet.any(
+                    (item) => !FoldingRangeKind.canParse(item, reporter)))) {
           reporter.reportError('must be of type List<FoldingRangeKind>');
           return false;
         }
@@ -17872,6 +18232,7 @@
   /// Folding range for a region (e.g. `#region`)
   static const Region = FoldingRangeKind('region');
 
+  @override
   Object toJson() => _value;
 
   @override
@@ -17880,6 +18241,7 @@
   @override
   int get hashCode => _value.hashCode;
 
+  @override
   bool operator ==(Object other) =>
       other is FoldingRangeKind && other._value == _value;
 }
@@ -17904,8 +18266,10 @@
     );
   }
 
+  @override
   final bool? workDoneProgress;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (workDoneProgress != null) {
@@ -17919,7 +18283,7 @@
       reporter.push('workDoneProgress');
       try {
         final workDoneProgress = obj['workDoneProgress'];
-        if (workDoneProgress != null && !(workDoneProgress is bool)) {
+        if (workDoneProgress != null && workDoneProgress is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -17990,14 +18354,17 @@
 
   /// An optional token that a server can use to report partial results (e.g.
   /// streaming) to the client.
+  @override
   final Either2<int, String>? partialResultToken;
 
   /// The text document.
   final TextDocumentIdentifier textDocument;
 
   /// An optional token that a server can use to report work done progress.
+  @override
   final Either2<int, String>? workDoneToken;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (partialResultToken != null) {
@@ -18016,7 +18383,8 @@
       try {
         final partialResultToken = obj['partialResultToken'];
         if (partialResultToken != null &&
-            !((partialResultToken is int || partialResultToken is String))) {
+            partialResultToken is! int &&
+            partialResultToken is! String) {
           reporter.reportError('must be of type Either2<int, String>');
           return false;
         }
@@ -18034,7 +18402,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(TextDocumentIdentifier.canParse(textDocument, reporter))) {
+        if (!TextDocumentIdentifier.canParse(textDocument, reporter)) {
           reporter.reportError('must be of type TextDocumentIdentifier');
           return false;
         }
@@ -18045,7 +18413,8 @@
       try {
         final workDoneToken = obj['workDoneToken'];
         if (workDoneToken != null &&
-            !((workDoneToken is int || workDoneToken is String))) {
+            workDoneToken is! int &&
+            workDoneToken is! String) {
           reporter.reportError('must be of type Either2<int, String>');
           return false;
         }
@@ -18101,8 +18470,8 @@
   static FoldingRangeRegistrationOptions fromJson(Map<String, Object?> json) {
     final documentSelectorJson = json['documentSelector'];
     final documentSelector = (documentSelectorJson as List<Object?>?)
-        ?.map(
-            (item) => TextDocumentFilter.fromJson(item as Map<String, Object?>))
+        ?.map((item) =>
+            TextDocumentFilterWithScheme.fromJson(item as Map<String, Object?>))
         .toList();
     final idJson = json['id'];
     final id = idJson as String?;
@@ -18117,13 +18486,17 @@
 
   /// A document selector to identify the scope of the registration. If set to
   /// null the document selector provided on the client side will be used.
-  final List<TextDocumentFilter>? documentSelector;
+  @override
+  final List<TextDocumentFilterWithScheme>? documentSelector;
 
   /// The id used to register the request. The id can be used to deregister the
   /// request again. See also Registration#id.
+  @override
   final String? id;
+  @override
   final bool? workDoneProgress;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['documentSelector'] = documentSelector;
@@ -18146,10 +18519,11 @@
         }
         final documentSelector = obj['documentSelector'];
         if (documentSelector != null &&
-            !((documentSelector is List<Object?> &&
-                (documentSelector.every(
-                    (item) => TextDocumentFilter.canParse(item, reporter)))))) {
-          reporter.reportError('must be of type List<TextDocumentFilter>');
+            (documentSelector is! List<Object?> ||
+                documentSelector.any((item) =>
+                    !TextDocumentFilterWithScheme.canParse(item, reporter)))) {
+          reporter.reportError(
+              'must be of type List<TextDocumentFilterWithScheme>');
           return false;
         }
       } finally {
@@ -18158,7 +18532,7 @@
       reporter.push('id');
       try {
         final id = obj['id'];
-        if (id != null && !(id is String)) {
+        if (id != null && id is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -18168,7 +18542,7 @@
       reporter.push('workDoneProgress');
       try {
         final workDoneProgress = obj['workDoneProgress'];
-        if (workDoneProgress != null && !(workDoneProgress is bool)) {
+        if (workDoneProgress != null && workDoneProgress is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -18186,8 +18560,12 @@
   bool operator ==(Object other) {
     if (other is FoldingRangeRegistrationOptions &&
         other.runtimeType == FoldingRangeRegistrationOptions) {
-      return listEqual(documentSelector, other.documentSelector,
-              (TextDocumentFilter a, TextDocumentFilter b) => a == b) &&
+      return listEqual(
+              documentSelector,
+              other.documentSelector,
+              (TextDocumentFilterWithScheme a,
+                      TextDocumentFilterWithScheme b) =>
+                  a == b) &&
           id == other.id &&
           workDoneProgress == other.workDoneProgress &&
           true;
@@ -18258,6 +18636,7 @@
   ///  @since 3.15.0
   final bool? trimTrailingWhitespace;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (insertFinalNewline != null) {
@@ -18279,7 +18658,7 @@
       reporter.push('insertFinalNewline');
       try {
         final insertFinalNewline = obj['insertFinalNewline'];
-        if (insertFinalNewline != null && !(insertFinalNewline is bool)) {
+        if (insertFinalNewline != null && insertFinalNewline is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -18297,7 +18676,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(insertSpaces is bool)) {
+        if (insertSpaces is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -18315,7 +18694,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(tabSize is int)) {
+        if (tabSize is! int) {
           reporter.reportError('must be of type int');
           return false;
         }
@@ -18325,7 +18704,7 @@
       reporter.push('trimFinalNewlines');
       try {
         final trimFinalNewlines = obj['trimFinalNewlines'];
-        if (trimFinalNewlines != null && !(trimFinalNewlines is bool)) {
+        if (trimFinalNewlines != null && trimFinalNewlines is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -18335,8 +18714,7 @@
       reporter.push('trimTrailingWhitespace');
       try {
         final trimTrailingWhitespace = obj['trimTrailingWhitespace'];
-        if (trimTrailingWhitespace != null &&
-            !(trimTrailingWhitespace is bool)) {
+        if (trimTrailingWhitespace != null && trimTrailingWhitespace is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -18427,6 +18805,7 @@
   /// request for the same document.
   final String? resultId;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['items'] = items.map((item) => item.toJson()).toList();
@@ -18450,8 +18829,8 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!((items is List<Object?> &&
-            (items.every((item) => Diagnostic.canParse(item, reporter)))))) {
+        if (items is! List<Object?> ||
+            items.any((item) => !Diagnostic.canParse(item, reporter))) {
           reporter.reportError('must be of type List<Diagnostic>');
           return false;
         }
@@ -18469,7 +18848,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(kind == 'full')) {
+        if (kind != 'full') {
           reporter.reportError('must be the literal \'full\'');
           return false;
         }
@@ -18479,7 +18858,7 @@
       reporter.push('resultId');
       try {
         final resultId = obj['resultId'];
-        if (resultId != null && !(resultId is String)) {
+        if (resultId != null && resultId is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -18588,6 +18967,7 @@
   ///  @since 3.17.0
   final GeneralClientCapabilitiesStaleRequestSupport? staleRequestSupport;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (markdown != null) {
@@ -18612,7 +18992,7 @@
       try {
         final markdown = obj['markdown'];
         if (markdown != null &&
-            !(MarkdownClientCapabilities.canParse(markdown, reporter))) {
+            !MarkdownClientCapabilities.canParse(markdown, reporter)) {
           reporter.reportError('must be of type MarkdownClientCapabilities');
           return false;
         }
@@ -18623,9 +19003,9 @@
       try {
         final positionEncodings = obj['positionEncodings'];
         if (positionEncodings != null &&
-            !((positionEncodings is List<Object?> &&
-                (positionEncodings.every((item) =>
-                    PositionEncodingKind.canParse(item, reporter)))))) {
+            (positionEncodings is! List<Object?> ||
+                positionEncodings.any((item) =>
+                    !PositionEncodingKind.canParse(item, reporter)))) {
           reporter.reportError('must be of type List<PositionEncodingKind>');
           return false;
         }
@@ -18636,8 +19016,8 @@
       try {
         final regularExpressions = obj['regularExpressions'];
         if (regularExpressions != null &&
-            !(RegularExpressionsClientCapabilities.canParse(
-                regularExpressions, reporter))) {
+            !RegularExpressionsClientCapabilities.canParse(
+                regularExpressions, reporter)) {
           reporter.reportError(
               'must be of type RegularExpressionsClientCapabilities');
           return false;
@@ -18649,8 +19029,8 @@
       try {
         final staleRequestSupport = obj['staleRequestSupport'];
         if (staleRequestSupport != null &&
-            !(GeneralClientCapabilitiesStaleRequestSupport.canParse(
-                staleRequestSupport, reporter))) {
+            !GeneralClientCapabilitiesStaleRequestSupport.canParse(
+                staleRequestSupport, reporter)) {
           reporter.reportError(
               'must be of type GeneralClientCapabilitiesStaleRequestSupport');
           return false;
@@ -18722,6 +19102,7 @@
   /// receives a response with error code `ContentModified``
   final List<String> retryOnContentModified;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['cancel'] = cancel;
@@ -18742,7 +19123,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(cancel is bool)) {
+        if (cancel is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -18760,8 +19141,8 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!((retryOnContentModified is List<Object?> &&
-            (retryOnContentModified.every((item) => item is String))))) {
+        if (retryOnContentModified is! List<Object?> ||
+            retryOnContentModified.any((item) => item is! String)) {
           reporter.reportError('must be of type List<String>');
           return false;
         }
@@ -18834,6 +19215,7 @@
   /// visualize a hover, e.g. by changing the background color.
   final Range? range;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['contents'] = contents;
@@ -18856,8 +19238,8 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!((MarkupContent.canParse(contents, reporter) ||
-            contents is String))) {
+        if (!MarkupContent.canParse(contents, reporter) &&
+            contents is! String) {
           reporter
               .reportError('must be of type Either2<MarkupContent, String>');
           return false;
@@ -18868,7 +19250,7 @@
       reporter.push('range');
       try {
         final range = obj['range'];
-        if (range != null && !(Range.canParse(range, reporter))) {
+        if (range != null && !Range.canParse(range, reporter)) {
           reporter.reportError('must be of type Range');
           return false;
         }
@@ -18931,6 +19313,7 @@
   /// Whether hover supports dynamic registration.
   final bool? dynamicRegistration;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (contentFormat != null) {
@@ -18949,9 +19332,9 @@
       try {
         final contentFormat = obj['contentFormat'];
         if (contentFormat != null &&
-            !((contentFormat is List<Object?> &&
-                (contentFormat
-                    .every((item) => MarkupKind.canParse(item, reporter)))))) {
+            (contentFormat is! List<Object?> ||
+                contentFormat
+                    .any((item) => !MarkupKind.canParse(item, reporter)))) {
           reporter.reportError('must be of type List<MarkupKind>');
           return false;
         }
@@ -18961,7 +19344,7 @@
       reporter.push('dynamicRegistration');
       try {
         final dynamicRegistration = obj['dynamicRegistration'];
-        if (dynamicRegistration != null && !(dynamicRegistration is bool)) {
+        if (dynamicRegistration != null && dynamicRegistration is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -19017,8 +19400,10 @@
     );
   }
 
+  @override
   final bool? workDoneProgress;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (workDoneProgress != null) {
@@ -19032,7 +19417,7 @@
       reporter.push('workDoneProgress');
       try {
         final workDoneProgress = obj['workDoneProgress'];
-        if (workDoneProgress != null && !(workDoneProgress is bool)) {
+        if (workDoneProgress != null && workDoneProgress is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -19095,14 +19480,18 @@
   }
 
   /// The position inside the text document.
+  @override
   final Position position;
 
   /// The text document.
+  @override
   final TextDocumentIdentifier textDocument;
 
   /// An optional token that a server can use to report work done progress.
+  @override
   final Either2<int, String>? workDoneToken;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['position'] = position.toJson();
@@ -19126,7 +19515,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(Position.canParse(position, reporter))) {
+        if (!Position.canParse(position, reporter)) {
           reporter.reportError('must be of type Position');
           return false;
         }
@@ -19144,7 +19533,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(TextDocumentIdentifier.canParse(textDocument, reporter))) {
+        if (!TextDocumentIdentifier.canParse(textDocument, reporter)) {
           reporter.reportError('must be of type TextDocumentIdentifier');
           return false;
         }
@@ -19155,7 +19544,8 @@
       try {
         final workDoneToken = obj['workDoneToken'];
         if (workDoneToken != null &&
-            !((workDoneToken is int || workDoneToken is String))) {
+            workDoneToken is! int &&
+            workDoneToken is! String) {
           reporter.reportError('must be of type Either2<int, String>');
           return false;
         }
@@ -19205,8 +19595,8 @@
   static HoverRegistrationOptions fromJson(Map<String, Object?> json) {
     final documentSelectorJson = json['documentSelector'];
     final documentSelector = (documentSelectorJson as List<Object?>?)
-        ?.map(
-            (item) => TextDocumentFilter.fromJson(item as Map<String, Object?>))
+        ?.map((item) =>
+            TextDocumentFilterWithScheme.fromJson(item as Map<String, Object?>))
         .toList();
     final workDoneProgressJson = json['workDoneProgress'];
     final workDoneProgress = workDoneProgressJson as bool?;
@@ -19218,9 +19608,12 @@
 
   /// A document selector to identify the scope of the registration. If set to
   /// null the document selector provided on the client side will be used.
-  final List<TextDocumentFilter>? documentSelector;
+  @override
+  final List<TextDocumentFilterWithScheme>? documentSelector;
+  @override
   final bool? workDoneProgress;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['documentSelector'] = documentSelector;
@@ -19240,10 +19633,11 @@
         }
         final documentSelector = obj['documentSelector'];
         if (documentSelector != null &&
-            !((documentSelector is List<Object?> &&
-                (documentSelector.every(
-                    (item) => TextDocumentFilter.canParse(item, reporter)))))) {
-          reporter.reportError('must be of type List<TextDocumentFilter>');
+            (documentSelector is! List<Object?> ||
+                documentSelector.any((item) =>
+                    !TextDocumentFilterWithScheme.canParse(item, reporter)))) {
+          reporter.reportError(
+              'must be of type List<TextDocumentFilterWithScheme>');
           return false;
         }
       } finally {
@@ -19252,7 +19646,7 @@
       reporter.push('workDoneProgress');
       try {
         final workDoneProgress = obj['workDoneProgress'];
-        if (workDoneProgress != null && !(workDoneProgress is bool)) {
+        if (workDoneProgress != null && workDoneProgress is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -19270,8 +19664,12 @@
   bool operator ==(Object other) {
     if (other is HoverRegistrationOptions &&
         other.runtimeType == HoverRegistrationOptions) {
-      return listEqual(documentSelector, other.documentSelector,
-              (TextDocumentFilter a, TextDocumentFilter b) => a == b) &&
+      return listEqual(
+              documentSelector,
+              other.documentSelector,
+              (TextDocumentFilterWithScheme a,
+                      TextDocumentFilterWithScheme b) =>
+                  a == b) &&
           workDoneProgress == other.workDoneProgress &&
           true;
     }
@@ -19318,6 +19716,7 @@
   ///  @since 3.14.0
   final bool? linkSupport;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (dynamicRegistration != null) {
@@ -19334,7 +19733,7 @@
       reporter.push('dynamicRegistration');
       try {
         final dynamicRegistration = obj['dynamicRegistration'];
-        if (dynamicRegistration != null && !(dynamicRegistration is bool)) {
+        if (dynamicRegistration != null && dynamicRegistration is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -19344,7 +19743,7 @@
       reporter.push('linkSupport');
       try {
         final linkSupport = obj['linkSupport'];
-        if (linkSupport != null && !(linkSupport is bool)) {
+        if (linkSupport != null && linkSupport is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -19399,8 +19798,10 @@
     );
   }
 
+  @override
   final bool? workDoneProgress;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (workDoneProgress != null) {
@@ -19414,7 +19815,7 @@
       reporter.push('workDoneProgress');
       try {
         final workDoneProgress = obj['workDoneProgress'];
-        if (workDoneProgress != null && !(workDoneProgress is bool)) {
+        if (workDoneProgress != null && workDoneProgress is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -19493,17 +19894,22 @@
 
   /// An optional token that a server can use to report partial results (e.g.
   /// streaming) to the client.
+  @override
   final Either2<int, String>? partialResultToken;
 
   /// The position inside the text document.
+  @override
   final Position position;
 
   /// The text document.
+  @override
   final TextDocumentIdentifier textDocument;
 
   /// An optional token that a server can use to report work done progress.
+  @override
   final Either2<int, String>? workDoneToken;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (partialResultToken != null) {
@@ -19523,7 +19929,8 @@
       try {
         final partialResultToken = obj['partialResultToken'];
         if (partialResultToken != null &&
-            !((partialResultToken is int || partialResultToken is String))) {
+            partialResultToken is! int &&
+            partialResultToken is! String) {
           reporter.reportError('must be of type Either2<int, String>');
           return false;
         }
@@ -19541,7 +19948,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(Position.canParse(position, reporter))) {
+        if (!Position.canParse(position, reporter)) {
           reporter.reportError('must be of type Position');
           return false;
         }
@@ -19559,7 +19966,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(TextDocumentIdentifier.canParse(textDocument, reporter))) {
+        if (!TextDocumentIdentifier.canParse(textDocument, reporter)) {
           reporter.reportError('must be of type TextDocumentIdentifier');
           return false;
         }
@@ -19570,7 +19977,8 @@
       try {
         final workDoneToken = obj['workDoneToken'];
         if (workDoneToken != null &&
-            !((workDoneToken is int || workDoneToken is String))) {
+            workDoneToken is! int &&
+            workDoneToken is! String) {
           reporter.reportError('must be of type Either2<int, String>');
           return false;
         }
@@ -19628,8 +20036,8 @@
   static ImplementationRegistrationOptions fromJson(Map<String, Object?> json) {
     final documentSelectorJson = json['documentSelector'];
     final documentSelector = (documentSelectorJson as List<Object?>?)
-        ?.map(
-            (item) => TextDocumentFilter.fromJson(item as Map<String, Object?>))
+        ?.map((item) =>
+            TextDocumentFilterWithScheme.fromJson(item as Map<String, Object?>))
         .toList();
     final idJson = json['id'];
     final id = idJson as String?;
@@ -19644,13 +20052,17 @@
 
   /// A document selector to identify the scope of the registration. If set to
   /// null the document selector provided on the client side will be used.
-  final List<TextDocumentFilter>? documentSelector;
+  @override
+  final List<TextDocumentFilterWithScheme>? documentSelector;
 
   /// The id used to register the request. The id can be used to deregister the
   /// request again. See also Registration#id.
+  @override
   final String? id;
+  @override
   final bool? workDoneProgress;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['documentSelector'] = documentSelector;
@@ -19673,10 +20085,11 @@
         }
         final documentSelector = obj['documentSelector'];
         if (documentSelector != null &&
-            !((documentSelector is List<Object?> &&
-                (documentSelector.every(
-                    (item) => TextDocumentFilter.canParse(item, reporter)))))) {
-          reporter.reportError('must be of type List<TextDocumentFilter>');
+            (documentSelector is! List<Object?> ||
+                documentSelector.any((item) =>
+                    !TextDocumentFilterWithScheme.canParse(item, reporter)))) {
+          reporter.reportError(
+              'must be of type List<TextDocumentFilterWithScheme>');
           return false;
         }
       } finally {
@@ -19685,7 +20098,7 @@
       reporter.push('id');
       try {
         final id = obj['id'];
-        if (id != null && !(id is String)) {
+        if (id != null && id is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -19695,7 +20108,7 @@
       reporter.push('workDoneProgress');
       try {
         final workDoneProgress = obj['workDoneProgress'];
-        if (workDoneProgress != null && !(workDoneProgress is bool)) {
+        if (workDoneProgress != null && workDoneProgress is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -19713,8 +20126,12 @@
   bool operator ==(Object other) {
     if (other is ImplementationRegistrationOptions &&
         other.runtimeType == ImplementationRegistrationOptions) {
-      return listEqual(documentSelector, other.documentSelector,
-              (TextDocumentFilter a, TextDocumentFilter b) => a == b) &&
+      return listEqual(
+              documentSelector,
+              other.documentSelector,
+              (TextDocumentFilterWithScheme a,
+                      TextDocumentFilterWithScheme b) =>
+                  a == b) &&
           id == other.id &&
           workDoneProgress == other.workDoneProgress &&
           true;
@@ -19837,6 +20254,7 @@
   final String? trace;
 
   /// An optional token that a server can use to report work done progress.
+  @override
   final Either2<int, String>? workDoneToken;
 
   /// The workspace folders configured in the client when the server starts.
@@ -19846,6 +20264,7 @@
   ///  @since 3.6.0
   final List<WorkspaceFolder>? workspaceFolders;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['capabilities'] = capabilities.toJson();
@@ -19889,7 +20308,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(ClientCapabilities.canParse(capabilities, reporter))) {
+        if (!ClientCapabilities.canParse(capabilities, reporter)) {
           reporter.reportError('must be of type ClientCapabilities');
           return false;
         }
@@ -19900,7 +20319,7 @@
       try {
         final clientInfo = obj['clientInfo'];
         if (clientInfo != null &&
-            !(InitializeParamsClientInfo.canParse(clientInfo, reporter))) {
+            !InitializeParamsClientInfo.canParse(clientInfo, reporter)) {
           reporter.reportError('must be of type InitializeParamsClientInfo');
           return false;
         }
@@ -19910,7 +20329,7 @@
       reporter.push('locale');
       try {
         final locale = obj['locale'];
-        if (locale != null && !(locale is String)) {
+        if (locale != null && locale is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -19924,7 +20343,7 @@
           return false;
         }
         final processId = obj['processId'];
-        if (processId != null && !(processId is int)) {
+        if (processId != null && processId is! int) {
           reporter.reportError('must be of type int');
           return false;
         }
@@ -19934,7 +20353,7 @@
       reporter.push('rootPath');
       try {
         final rootPath = obj['rootPath'];
-        if (rootPath != null && !(rootPath is String)) {
+        if (rootPath != null && rootPath is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -19948,7 +20367,7 @@
           return false;
         }
         final rootUri = obj['rootUri'];
-        if (rootUri != null && !(rootUri is String)) {
+        if (rootUri != null && rootUri is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -19959,7 +20378,9 @@
       try {
         final trace = obj['trace'];
         if (trace != null &&
-            !((trace == 'off' || trace == 'messages' || trace == 'verbose'))) {
+            trace != 'off' &&
+            trace != 'messages' &&
+            trace != 'verbose') {
           reporter.reportError(
               'must be one of the literals \'off\', \'messages\', \'verbose\'');
           return false;
@@ -19971,7 +20392,8 @@
       try {
         final workDoneToken = obj['workDoneToken'];
         if (workDoneToken != null &&
-            !((workDoneToken is int || workDoneToken is String))) {
+            workDoneToken is! int &&
+            workDoneToken is! String) {
           reporter.reportError('must be of type Either2<int, String>');
           return false;
         }
@@ -19982,9 +20404,9 @@
       try {
         final workspaceFolders = obj['workspaceFolders'];
         if (workspaceFolders != null &&
-            !((workspaceFolders is List<Object?> &&
-                (workspaceFolders.every(
-                    (item) => WorkspaceFolder.canParse(item, reporter)))))) {
+            (workspaceFolders is! List<Object?> ||
+                workspaceFolders.any(
+                    (item) => !WorkspaceFolder.canParse(item, reporter)))) {
           reporter.reportError('must be of type List<WorkspaceFolder>');
           return false;
         }
@@ -20062,6 +20484,7 @@
   /// The client's version as defined by the client.
   final String? version;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['name'] = name;
@@ -20084,7 +20507,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(name is String)) {
+        if (name is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -20094,7 +20517,7 @@
       reporter.push('version');
       try {
         final version = obj['version'];
-        if (version != null && !(version is String)) {
+        if (version != null && version is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -20159,6 +20582,7 @@
   ///  @since 3.15.0
   final InitializeResultServerInfo? serverInfo;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['capabilities'] = capabilities.toJson();
@@ -20181,7 +20605,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(ServerCapabilities.canParse(capabilities, reporter))) {
+        if (!ServerCapabilities.canParse(capabilities, reporter)) {
           reporter.reportError('must be of type ServerCapabilities');
           return false;
         }
@@ -20192,7 +20616,7 @@
       try {
         final serverInfo = obj['serverInfo'];
         if (serverInfo != null &&
-            !(InitializeResultServerInfo.canParse(serverInfo, reporter))) {
+            !InitializeResultServerInfo.canParse(serverInfo, reporter)) {
           reporter.reportError('must be of type InitializeResultServerInfo');
           return false;
         }
@@ -20253,6 +20677,7 @@
   /// The server's version as defined by the server.
   final String? version;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['name'] = name;
@@ -20275,7 +20700,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(name is String)) {
+        if (name is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -20285,7 +20710,7 @@
       reporter.push('version');
       try {
         final version = obj['version'];
-        if (version != null && !(version is String)) {
+        if (version != null && version is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -20328,10 +20753,8 @@
     return InitializedParams();
   }
 
-  Map<String, Object?> toJson() {
-    var result = <String, Object?>{};
-    return result;
-  }
+  @override
+  Map<String, Object?> toJson() => {};
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
@@ -20382,10 +20805,10 @@
     final kind =
         kindJson != null ? InlayHintKind.fromJson(kindJson as int) : null;
     final labelJson = json['label'];
-    final label = (labelJson is List<Object?> &&
-            (labelJson.every((item) =>
-                InlayHintLabelPart.canParse(item, nullLspJsonReporter))))
-        ? Either2<List<InlayHintLabelPart>, String>.t1((labelJson)
+    final label = labelJson is List<Object?> &&
+            labelJson.every((item) =>
+                InlayHintLabelPart.canParse(item, nullLspJsonReporter))
+        ? Either2<List<InlayHintLabelPart>, String>.t1(labelJson
             .map((item) =>
                 InlayHintLabelPart.fromJson(item as Map<String, Object?>))
             .toList())
@@ -20470,6 +20893,7 @@
   /// might resolve this property late using the resolve request.
   final Either2<MarkupContent, String>? tooltip;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (data != null) {
@@ -20500,7 +20924,7 @@
       reporter.push('kind');
       try {
         final kind = obj['kind'];
-        if (kind != null && !(InlayHintKind.canParse(kind, reporter))) {
+        if (kind != null && !InlayHintKind.canParse(kind, reporter)) {
           reporter.reportError('must be of type InlayHintKind');
           return false;
         }
@@ -20518,10 +20942,9 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(((label is List<Object?> &&
-                (label.every(
-                    (item) => InlayHintLabelPart.canParse(item, reporter)))) ||
-            label is String))) {
+        if (label is! List<Object?> ||
+            label.any((item) => !InlayHintLabelPart.canParse(item, reporter)) &&
+                label is! String) {
           reporter.reportError(
               'must be of type Either2<List<InlayHintLabelPart>, String>');
           return false;
@@ -20532,7 +20955,7 @@
       reporter.push('paddingLeft');
       try {
         final paddingLeft = obj['paddingLeft'];
-        if (paddingLeft != null && !(paddingLeft is bool)) {
+        if (paddingLeft != null && paddingLeft is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -20542,7 +20965,7 @@
       reporter.push('paddingRight');
       try {
         final paddingRight = obj['paddingRight'];
-        if (paddingRight != null && !(paddingRight is bool)) {
+        if (paddingRight != null && paddingRight is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -20560,7 +20983,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(Position.canParse(position, reporter))) {
+        if (!Position.canParse(position, reporter)) {
           reporter.reportError('must be of type Position');
           return false;
         }
@@ -20571,9 +20994,8 @@
       try {
         final textEdits = obj['textEdits'];
         if (textEdits != null &&
-            !((textEdits is List<Object?> &&
-                (textEdits
-                    .every((item) => TextEdit.canParse(item, reporter)))))) {
+            (textEdits is! List<Object?> ||
+                textEdits.any((item) => !TextEdit.canParse(item, reporter)))) {
           reporter.reportError('must be of type List<TextEdit>');
           return false;
         }
@@ -20584,8 +21006,8 @@
       try {
         final tooltip = obj['tooltip'];
         if (tooltip != null &&
-            !((MarkupContent.canParse(tooltip, reporter) ||
-                tooltip is String))) {
+            !MarkupContent.canParse(tooltip, reporter) &&
+            tooltip is! String) {
           reporter
               .reportError('must be of type Either2<MarkupContent, String>');
           return false;
@@ -20665,6 +21087,7 @@
   /// Indicates which properties a client can resolve lazily on a inlay hint.
   final InlayHintClientCapabilitiesResolveSupport? resolveSupport;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (dynamicRegistration != null) {
@@ -20681,7 +21104,7 @@
       reporter.push('dynamicRegistration');
       try {
         final dynamicRegistration = obj['dynamicRegistration'];
-        if (dynamicRegistration != null && !(dynamicRegistration is bool)) {
+        if (dynamicRegistration != null && dynamicRegistration is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -20692,8 +21115,8 @@
       try {
         final resolveSupport = obj['resolveSupport'];
         if (resolveSupport != null &&
-            !(InlayHintClientCapabilitiesResolveSupport.canParse(
-                resolveSupport, reporter))) {
+            !InlayHintClientCapabilitiesResolveSupport.canParse(
+                resolveSupport, reporter)) {
           reporter.reportError(
               'must be of type InlayHintClientCapabilitiesResolveSupport');
           return false;
@@ -20752,6 +21175,7 @@
   /// The properties that a client can resolve lazily.
   final List<String> properties;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['properties'] = properties;
@@ -20771,8 +21195,8 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!((properties is List<Object?> &&
-            (properties.every((item) => item is String))))) {
+        if (properties is! List<Object?> ||
+            properties.any((item) => item is! String)) {
           reporter.reportError('must be of type List<String>');
           return false;
         }
@@ -20823,6 +21247,7 @@
   /// An inlay hint that for a type annotation.
   static const Type = InlayHintKind(1);
 
+  @override
   Object toJson() => _value;
 
   @override
@@ -20831,6 +21256,7 @@
   @override
   int get hashCode => _value.hashCode;
 
+  @override
   bool operator ==(Object other) =>
       other is InlayHintKind && other._value == _value;
 }
@@ -20904,6 +21330,7 @@
   /// The value of this label part.
   final String value;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (command != null) {
@@ -20924,7 +21351,7 @@
       reporter.push('command');
       try {
         final command = obj['command'];
-        if (command != null && !(Command.canParse(command, reporter))) {
+        if (command != null && !Command.canParse(command, reporter)) {
           reporter.reportError('must be of type Command');
           return false;
         }
@@ -20934,7 +21361,7 @@
       reporter.push('location');
       try {
         final location = obj['location'];
-        if (location != null && !(Location.canParse(location, reporter))) {
+        if (location != null && !Location.canParse(location, reporter)) {
           reporter.reportError('must be of type Location');
           return false;
         }
@@ -20945,8 +21372,8 @@
       try {
         final tooltip = obj['tooltip'];
         if (tooltip != null &&
-            !((MarkupContent.canParse(tooltip, reporter) ||
-                tooltip is String))) {
+            !MarkupContent.canParse(tooltip, reporter) &&
+            tooltip is! String) {
           reporter
               .reportError('must be of type Either2<MarkupContent, String>');
           return false;
@@ -20965,7 +21392,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(value is String)) {
+        if (value is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -21033,8 +21460,10 @@
   /// The server provides support to resolve additional information for an inlay
   /// hint item.
   final bool? resolveProvider;
+  @override
   final bool? workDoneProgress;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (resolveProvider != null) {
@@ -21051,7 +21480,7 @@
       reporter.push('resolveProvider');
       try {
         final resolveProvider = obj['resolveProvider'];
-        if (resolveProvider != null && !(resolveProvider is bool)) {
+        if (resolveProvider != null && resolveProvider is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -21061,7 +21490,7 @@
       reporter.push('workDoneProgress');
       try {
         final workDoneProgress = obj['workDoneProgress'];
-        if (workDoneProgress != null && !(workDoneProgress is bool)) {
+        if (workDoneProgress != null && workDoneProgress is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -21136,8 +21565,10 @@
   final TextDocumentIdentifier textDocument;
 
   /// An optional token that a server can use to report work done progress.
+  @override
   final Either2<int, String>? workDoneToken;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['range'] = range.toJson();
@@ -21161,7 +21592,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(Range.canParse(range, reporter))) {
+        if (!Range.canParse(range, reporter)) {
           reporter.reportError('must be of type Range');
           return false;
         }
@@ -21179,7 +21610,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(TextDocumentIdentifier.canParse(textDocument, reporter))) {
+        if (!TextDocumentIdentifier.canParse(textDocument, reporter)) {
           reporter.reportError('must be of type TextDocumentIdentifier');
           return false;
         }
@@ -21190,7 +21621,8 @@
       try {
         final workDoneToken = obj['workDoneToken'];
         if (workDoneToken != null &&
-            !((workDoneToken is int || workDoneToken is String))) {
+            workDoneToken is! int &&
+            workDoneToken is! String) {
           reporter.reportError('must be of type Either2<int, String>');
           return false;
         }
@@ -21248,8 +21680,8 @@
   static InlayHintRegistrationOptions fromJson(Map<String, Object?> json) {
     final documentSelectorJson = json['documentSelector'];
     final documentSelector = (documentSelectorJson as List<Object?>?)
-        ?.map(
-            (item) => TextDocumentFilter.fromJson(item as Map<String, Object?>))
+        ?.map((item) =>
+            TextDocumentFilterWithScheme.fromJson(item as Map<String, Object?>))
         .toList();
     final idJson = json['id'];
     final id = idJson as String?;
@@ -21267,17 +21699,22 @@
 
   /// A document selector to identify the scope of the registration. If set to
   /// null the document selector provided on the client side will be used.
-  final List<TextDocumentFilter>? documentSelector;
+  @override
+  final List<TextDocumentFilterWithScheme>? documentSelector;
 
   /// The id used to register the request. The id can be used to deregister the
   /// request again. See also Registration#id.
+  @override
   final String? id;
 
   /// The server provides support to resolve additional information for an inlay
   /// hint item.
+  @override
   final bool? resolveProvider;
+  @override
   final bool? workDoneProgress;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['documentSelector'] = documentSelector;
@@ -21303,10 +21740,11 @@
         }
         final documentSelector = obj['documentSelector'];
         if (documentSelector != null &&
-            !((documentSelector is List<Object?> &&
-                (documentSelector.every(
-                    (item) => TextDocumentFilter.canParse(item, reporter)))))) {
-          reporter.reportError('must be of type List<TextDocumentFilter>');
+            (documentSelector is! List<Object?> ||
+                documentSelector.any((item) =>
+                    !TextDocumentFilterWithScheme.canParse(item, reporter)))) {
+          reporter.reportError(
+              'must be of type List<TextDocumentFilterWithScheme>');
           return false;
         }
       } finally {
@@ -21315,7 +21753,7 @@
       reporter.push('id');
       try {
         final id = obj['id'];
-        if (id != null && !(id is String)) {
+        if (id != null && id is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -21325,7 +21763,7 @@
       reporter.push('resolveProvider');
       try {
         final resolveProvider = obj['resolveProvider'];
-        if (resolveProvider != null && !(resolveProvider is bool)) {
+        if (resolveProvider != null && resolveProvider is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -21335,7 +21773,7 @@
       reporter.push('workDoneProgress');
       try {
         final workDoneProgress = obj['workDoneProgress'];
-        if (workDoneProgress != null && !(workDoneProgress is bool)) {
+        if (workDoneProgress != null && workDoneProgress is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -21353,8 +21791,12 @@
   bool operator ==(Object other) {
     if (other is InlayHintRegistrationOptions &&
         other.runtimeType == InlayHintRegistrationOptions) {
-      return listEqual(documentSelector, other.documentSelector,
-              (TextDocumentFilter a, TextDocumentFilter b) => a == b) &&
+      return listEqual(
+              documentSelector,
+              other.documentSelector,
+              (TextDocumentFilterWithScheme a,
+                      TextDocumentFilterWithScheme b) =>
+                  a == b) &&
           id == other.id &&
           resolveProvider == other.resolveProvider &&
           workDoneProgress == other.workDoneProgress &&
@@ -21404,6 +21846,7 @@
   /// change that requires such a calculation.
   final bool? refreshSupport;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (refreshSupport != null) {
@@ -21417,7 +21860,7 @@
       reporter.push('refreshSupport');
       try {
         final refreshSupport = obj['refreshSupport'];
-        if (refreshSupport != null && !(refreshSupport is bool)) {
+        if (refreshSupport != null && refreshSupport is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -21471,6 +21914,7 @@
   /// providers.
   final bool? dynamicRegistration;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (dynamicRegistration != null) {
@@ -21484,7 +21928,7 @@
       reporter.push('dynamicRegistration');
       try {
         final dynamicRegistration = obj['dynamicRegistration'];
-        if (dynamicRegistration != null && !(dynamicRegistration is bool)) {
+        if (dynamicRegistration != null && dynamicRegistration is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -21544,6 +21988,7 @@
   /// of the range denotes the line where the inline values are shown.
   final Range stoppedLocation;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['frameId'] = frameId;
@@ -21564,7 +22009,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(frameId is int)) {
+        if (frameId is! int) {
           reporter.reportError('must be of type int');
           return false;
         }
@@ -21582,7 +22027,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(Range.canParse(stoppedLocation, reporter))) {
+        if (!Range.canParse(stoppedLocation, reporter)) {
           reporter.reportError('must be of type Range');
           return false;
         }
@@ -21652,6 +22097,7 @@
   /// to extract the evaluatable expression from the underlying document.
   final Range range;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (expression != null) {
@@ -21666,7 +22112,7 @@
       reporter.push('expression');
       try {
         final expression = obj['expression'];
-        if (expression != null && !(expression is String)) {
+        if (expression != null && expression is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -21684,7 +22130,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(Range.canParse(range, reporter))) {
+        if (!Range.canParse(range, reporter)) {
           reporter.reportError('must be of type Range');
           return false;
         }
@@ -21739,8 +22185,10 @@
     );
   }
 
+  @override
   final bool? workDoneProgress;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (workDoneProgress != null) {
@@ -21754,7 +22202,7 @@
       reporter.push('workDoneProgress');
       try {
         final workDoneProgress = obj['workDoneProgress'];
-        if (workDoneProgress != null && !(workDoneProgress is bool)) {
+        if (workDoneProgress != null && workDoneProgress is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -21834,8 +22282,10 @@
   final TextDocumentIdentifier textDocument;
 
   /// An optional token that a server can use to report work done progress.
+  @override
   final Either2<int, String>? workDoneToken;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['context'] = context.toJson();
@@ -21860,7 +22310,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(InlineValueContext.canParse(context, reporter))) {
+        if (!InlineValueContext.canParse(context, reporter)) {
           reporter.reportError('must be of type InlineValueContext');
           return false;
         }
@@ -21878,7 +22328,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(Range.canParse(range, reporter))) {
+        if (!Range.canParse(range, reporter)) {
           reporter.reportError('must be of type Range');
           return false;
         }
@@ -21896,7 +22346,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(TextDocumentIdentifier.canParse(textDocument, reporter))) {
+        if (!TextDocumentIdentifier.canParse(textDocument, reporter)) {
           reporter.reportError('must be of type TextDocumentIdentifier');
           return false;
         }
@@ -21907,7 +22357,8 @@
       try {
         final workDoneToken = obj['workDoneToken'];
         if (workDoneToken != null &&
-            !((workDoneToken is int || workDoneToken is String))) {
+            workDoneToken is! int &&
+            workDoneToken is! String) {
           reporter.reportError('must be of type Either2<int, String>');
           return false;
         }
@@ -21966,8 +22417,8 @@
   static InlineValueRegistrationOptions fromJson(Map<String, Object?> json) {
     final documentSelectorJson = json['documentSelector'];
     final documentSelector = (documentSelectorJson as List<Object?>?)
-        ?.map(
-            (item) => TextDocumentFilter.fromJson(item as Map<String, Object?>))
+        ?.map((item) =>
+            TextDocumentFilterWithScheme.fromJson(item as Map<String, Object?>))
         .toList();
     final idJson = json['id'];
     final id = idJson as String?;
@@ -21982,13 +22433,17 @@
 
   /// A document selector to identify the scope of the registration. If set to
   /// null the document selector provided on the client side will be used.
-  final List<TextDocumentFilter>? documentSelector;
+  @override
+  final List<TextDocumentFilterWithScheme>? documentSelector;
 
   /// The id used to register the request. The id can be used to deregister the
   /// request again. See also Registration#id.
+  @override
   final String? id;
+  @override
   final bool? workDoneProgress;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['documentSelector'] = documentSelector;
@@ -22011,10 +22466,11 @@
         }
         final documentSelector = obj['documentSelector'];
         if (documentSelector != null &&
-            !((documentSelector is List<Object?> &&
-                (documentSelector.every(
-                    (item) => TextDocumentFilter.canParse(item, reporter)))))) {
-          reporter.reportError('must be of type List<TextDocumentFilter>');
+            (documentSelector is! List<Object?> ||
+                documentSelector.any((item) =>
+                    !TextDocumentFilterWithScheme.canParse(item, reporter)))) {
+          reporter.reportError(
+              'must be of type List<TextDocumentFilterWithScheme>');
           return false;
         }
       } finally {
@@ -22023,7 +22479,7 @@
       reporter.push('id');
       try {
         final id = obj['id'];
-        if (id != null && !(id is String)) {
+        if (id != null && id is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -22033,7 +22489,7 @@
       reporter.push('workDoneProgress');
       try {
         final workDoneProgress = obj['workDoneProgress'];
-        if (workDoneProgress != null && !(workDoneProgress is bool)) {
+        if (workDoneProgress != null && workDoneProgress is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -22051,8 +22507,12 @@
   bool operator ==(Object other) {
     if (other is InlineValueRegistrationOptions &&
         other.runtimeType == InlineValueRegistrationOptions) {
-      return listEqual(documentSelector, other.documentSelector,
-              (TextDocumentFilter a, TextDocumentFilter b) => a == b) &&
+      return listEqual(
+              documentSelector,
+              other.documentSelector,
+              (TextDocumentFilterWithScheme a,
+                      TextDocumentFilterWithScheme b) =>
+                  a == b) &&
           id == other.id &&
           workDoneProgress == other.workDoneProgress &&
           true;
@@ -22100,6 +22560,7 @@
   /// The text of the inline value.
   final String text;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['range'] = range.toJson();
@@ -22120,7 +22581,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(Range.canParse(range, reporter))) {
+        if (!Range.canParse(range, reporter)) {
           reporter.reportError('must be of type Range');
           return false;
         }
@@ -22138,7 +22599,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(text is String)) {
+        if (text is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -22212,6 +22673,7 @@
   /// If specified the name of the variable to look up.
   final String? variableName;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['caseSensitiveLookup'] = caseSensitiveLookup;
@@ -22235,7 +22697,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(caseSensitiveLookup is bool)) {
+        if (caseSensitiveLookup is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -22253,7 +22715,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(Range.canParse(range, reporter))) {
+        if (!Range.canParse(range, reporter)) {
           reporter.reportError('must be of type Range');
           return false;
         }
@@ -22263,7 +22725,7 @@
       reporter.push('variableName');
       try {
         final variableName = obj['variableName'];
-        if (variableName != null && !(variableName is String)) {
+        if (variableName != null && variableName is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -22329,6 +22791,7 @@
   /// change that requires such a calculation.
   final bool? refreshSupport;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (refreshSupport != null) {
@@ -22342,7 +22805,7 @@
       reporter.push('refreshSupport');
       try {
         final refreshSupport = obj['refreshSupport'];
-        if (refreshSupport != null && !(refreshSupport is bool)) {
+        if (refreshSupport != null && refreshSupport is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -22409,6 +22872,7 @@
   /// The range if the replace is requested.
   final Range replace;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['insert'] = insert.toJson();
@@ -22430,7 +22894,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(Range.canParse(insert, reporter))) {
+        if (!Range.canParse(insert, reporter)) {
           reporter.reportError('must be of type Range');
           return false;
         }
@@ -22448,7 +22912,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(newText is String)) {
+        if (newText is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -22466,7 +22930,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(Range.canParse(replace, reporter))) {
+        if (!Range.canParse(replace, reporter)) {
           reporter.reportError('must be of type Range');
           return false;
         }
@@ -22530,6 +22994,7 @@
   /// one will update others too.
   static const Snippet = InsertTextFormat._(2);
 
+  @override
   Object toJson() => _value;
 
   @override
@@ -22538,6 +23003,7 @@
   @override
   int get hashCode => _value.hashCode;
 
+  @override
   bool operator ==(Object other) =>
       other is InsertTextFormat && other._value == _value;
 }
@@ -22568,6 +23034,7 @@
   /// adjustments to the string.
   static const asIs = InsertTextMode(1);
 
+  @override
   Object toJson() => _value;
 
   @override
@@ -22576,6 +23043,7 @@
   @override
   int get hashCode => _value.hashCode;
 
+  @override
   bool operator ==(Object other) =>
       other is InsertTextMode && other._value == _value;
 }
@@ -22604,6 +23072,7 @@
   /// capability as well.
   final bool? dynamicRegistration;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (dynamicRegistration != null) {
@@ -22617,7 +23086,7 @@
       reporter.push('dynamicRegistration');
       try {
         final dynamicRegistration = obj['dynamicRegistration'];
-        if (dynamicRegistration != null && !(dynamicRegistration is bool)) {
+        if (dynamicRegistration != null && dynamicRegistration is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -22669,8 +23138,10 @@
     );
   }
 
+  @override
   final bool? workDoneProgress;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (workDoneProgress != null) {
@@ -22684,7 +23155,7 @@
       reporter.push('workDoneProgress');
       try {
         final workDoneProgress = obj['workDoneProgress'];
-        if (workDoneProgress != null && !(workDoneProgress is bool)) {
+        if (workDoneProgress != null && workDoneProgress is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -22748,14 +23219,18 @@
   }
 
   /// The position inside the text document.
+  @override
   final Position position;
 
   /// The text document.
+  @override
   final TextDocumentIdentifier textDocument;
 
   /// An optional token that a server can use to report work done progress.
+  @override
   final Either2<int, String>? workDoneToken;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['position'] = position.toJson();
@@ -22779,7 +23254,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(Position.canParse(position, reporter))) {
+        if (!Position.canParse(position, reporter)) {
           reporter.reportError('must be of type Position');
           return false;
         }
@@ -22797,7 +23272,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(TextDocumentIdentifier.canParse(textDocument, reporter))) {
+        if (!TextDocumentIdentifier.canParse(textDocument, reporter)) {
           reporter.reportError('must be of type TextDocumentIdentifier');
           return false;
         }
@@ -22808,7 +23283,8 @@
       try {
         final workDoneToken = obj['workDoneToken'];
         if (workDoneToken != null &&
-            !((workDoneToken is int || workDoneToken is String))) {
+            workDoneToken is! int &&
+            workDoneToken is! String) {
           reporter.reportError('must be of type Either2<int, String>');
           return false;
         }
@@ -22865,8 +23341,8 @@
       Map<String, Object?> json) {
     final documentSelectorJson = json['documentSelector'];
     final documentSelector = (documentSelectorJson as List<Object?>?)
-        ?.map(
-            (item) => TextDocumentFilter.fromJson(item as Map<String, Object?>))
+        ?.map((item) =>
+            TextDocumentFilterWithScheme.fromJson(item as Map<String, Object?>))
         .toList();
     final idJson = json['id'];
     final id = idJson as String?;
@@ -22881,13 +23357,17 @@
 
   /// A document selector to identify the scope of the registration. If set to
   /// null the document selector provided on the client side will be used.
-  final List<TextDocumentFilter>? documentSelector;
+  @override
+  final List<TextDocumentFilterWithScheme>? documentSelector;
 
   /// The id used to register the request. The id can be used to deregister the
   /// request again. See also Registration#id.
+  @override
   final String? id;
+  @override
   final bool? workDoneProgress;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['documentSelector'] = documentSelector;
@@ -22910,10 +23390,11 @@
         }
         final documentSelector = obj['documentSelector'];
         if (documentSelector != null &&
-            !((documentSelector is List<Object?> &&
-                (documentSelector.every(
-                    (item) => TextDocumentFilter.canParse(item, reporter)))))) {
-          reporter.reportError('must be of type List<TextDocumentFilter>');
+            (documentSelector is! List<Object?> ||
+                documentSelector.any((item) =>
+                    !TextDocumentFilterWithScheme.canParse(item, reporter)))) {
+          reporter.reportError(
+              'must be of type List<TextDocumentFilterWithScheme>');
           return false;
         }
       } finally {
@@ -22922,7 +23403,7 @@
       reporter.push('id');
       try {
         final id = obj['id'];
-        if (id != null && !(id is String)) {
+        if (id != null && id is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -22932,7 +23413,7 @@
       reporter.push('workDoneProgress');
       try {
         final workDoneProgress = obj['workDoneProgress'];
-        if (workDoneProgress != null && !(workDoneProgress is bool)) {
+        if (workDoneProgress != null && workDoneProgress is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -22951,8 +23432,12 @@
   bool operator ==(Object other) {
     if (other is LinkedEditingRangeRegistrationOptions &&
         other.runtimeType == LinkedEditingRangeRegistrationOptions) {
-      return listEqual(documentSelector, other.documentSelector,
-              (TextDocumentFilter a, TextDocumentFilter b) => a == b) &&
+      return listEqual(
+              documentSelector,
+              other.documentSelector,
+              (TextDocumentFilterWithScheme a,
+                      TextDocumentFilterWithScheme b) =>
+                  a == b) &&
           id == other.id &&
           workDoneProgress == other.workDoneProgress &&
           true;
@@ -23004,6 +23489,7 @@
   /// configuration's word pattern will be used.
   final String? wordPattern;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['ranges'] = ranges.map((item) => item.toJson()).toList();
@@ -23026,8 +23512,8 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!((ranges is List<Object?> &&
-            (ranges.every((item) => Range.canParse(item, reporter)))))) {
+        if (ranges is! List<Object?> ||
+            ranges.any((item) => !Range.canParse(item, reporter))) {
           reporter.reportError('must be of type List<Range>');
           return false;
         }
@@ -23037,7 +23523,7 @@
       reporter.push('wordPattern');
       try {
         final wordPattern = obj['wordPattern'];
-        if (wordPattern != null && !(wordPattern is String)) {
+        if (wordPattern != null && wordPattern is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -23096,6 +23582,7 @@
   final Range range;
   final String uri;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['range'] = range.toJson();
@@ -23116,7 +23603,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(Range.canParse(range, reporter))) {
+        if (!Range.canParse(range, reporter)) {
           reporter.reportError('must be of type Range');
           return false;
         }
@@ -23134,7 +23621,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(uri is String)) {
+        if (uri is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -23218,6 +23705,7 @@
   /// The target resource identifier of this link.
   final String targetUri;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (originSelectionRange != null) {
@@ -23235,7 +23723,7 @@
       try {
         final originSelectionRange = obj['originSelectionRange'];
         if (originSelectionRange != null &&
-            !(Range.canParse(originSelectionRange, reporter))) {
+            !Range.canParse(originSelectionRange, reporter)) {
           reporter.reportError('must be of type Range');
           return false;
         }
@@ -23253,7 +23741,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(Range.canParse(targetRange, reporter))) {
+        if (!Range.canParse(targetRange, reporter)) {
           reporter.reportError('must be of type Range');
           return false;
         }
@@ -23271,7 +23759,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(Range.canParse(targetSelectionRange, reporter))) {
+        if (!Range.canParse(targetSelectionRange, reporter)) {
           reporter.reportError('must be of type Range');
           return false;
         }
@@ -23289,7 +23777,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(targetUri is String)) {
+        if (targetUri is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -23354,6 +23842,7 @@
   /// The message type.
   final MessageType type;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['message'] = message;
@@ -23374,7 +23863,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(message is String)) {
+        if (message is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -23392,7 +23881,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(MessageType.canParse(type, reporter))) {
+        if (!MessageType.canParse(type, reporter)) {
           reporter.reportError('must be of type MessageType');
           return false;
         }
@@ -23452,6 +23941,7 @@
   /// is set to `'verbose'`
   final String? verbose;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['message'] = message;
@@ -23474,7 +23964,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(message is String)) {
+        if (message is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -23484,7 +23974,7 @@
       reporter.push('verbose');
       try {
         final verbose = obj['verbose'];
-        if (verbose != null && !(verbose is String)) {
+        if (verbose != null && verbose is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -23555,6 +24045,7 @@
   /// The version of the parser.
   final String? version;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (allowedTags != null) {
@@ -23573,8 +24064,8 @@
       try {
         final allowedTags = obj['allowedTags'];
         if (allowedTags != null &&
-            !((allowedTags is List<Object?> &&
-                (allowedTags.every((item) => item is String))))) {
+            (allowedTags is! List<Object?> ||
+                allowedTags.any((item) => item is! String))) {
           reporter.reportError('must be of type List<String>');
           return false;
         }
@@ -23592,7 +24083,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(parser is String)) {
+        if (parser is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -23602,7 +24093,7 @@
       reporter.push('version');
       try {
         final version = obj['version'];
-        if (version != null && !(version is String)) {
+        if (version != null && version is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -23687,6 +24178,7 @@
   /// The content itself
   final String value;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['kind'] = kind.toJson();
@@ -23707,7 +24199,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(MarkupKind.canParse(kind, reporter))) {
+        if (!MarkupKind.canParse(kind, reporter)) {
           reporter.reportError('must be of type MarkupKind');
           return false;
         }
@@ -23725,7 +24217,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(value is String)) {
+        if (value is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -23783,6 +24275,7 @@
   /// Plain text is supported as a content format
   static const PlainText = MarkupKind._('plaintext');
 
+  @override
   Object toJson() => _value;
 
   @override
@@ -23791,6 +24284,7 @@
   @override
   int get hashCode => _value.hashCode;
 
+  @override
   bool operator ==(Object other) =>
       other is MarkupKind && other._value == _value;
 }
@@ -23815,6 +24309,7 @@
   /// A short title like 'Retry', 'Open Log' etc.
   final String title;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['title'] = title;
@@ -23834,7 +24329,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(title is String)) {
+        if (title is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -23885,6 +24380,7 @@
   /// A warning message.
   static const Warning = MessageType(2);
 
+  @override
   Object toJson() => _value;
 
   @override
@@ -23893,6 +24389,7 @@
   @override
   int get hashCode => _value.hashCode;
 
+  @override
   bool operator ==(Object other) =>
       other is MessageType && other._value == _value;
 }
@@ -24212,6 +24709,7 @@
   /// Constant for the 'workspaceSymbol/resolve' method.
   static const workspaceSymbol_resolve = Method('workspaceSymbol/resolve');
 
+  @override
   Object toJson() => _value;
 
   @override
@@ -24220,6 +24718,7 @@
   @override
   int get hashCode => _value.hashCode;
 
+  @override
   bool operator ==(Object other) => other is Method && other._value == _value;
 }
 
@@ -24267,6 +24766,7 @@
   /// The scope in which the moniker is unique
   final UniquenessLevel unique;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['identifier'] = identifier;
@@ -24291,7 +24791,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(identifier is String)) {
+        if (identifier is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -24301,7 +24801,7 @@
       reporter.push('kind');
       try {
         final kind = obj['kind'];
-        if (kind != null && !(MonikerKind.canParse(kind, reporter))) {
+        if (kind != null && !MonikerKind.canParse(kind, reporter)) {
           reporter.reportError('must be of type MonikerKind');
           return false;
         }
@@ -24319,7 +24819,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(scheme is String)) {
+        if (scheme is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -24337,7 +24837,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(UniquenessLevel.canParse(unique, reporter))) {
+        if (!UniquenessLevel.canParse(unique, reporter)) {
           reporter.reportError('must be of type UniquenessLevel');
           return false;
         }
@@ -24398,6 +24898,7 @@
   /// capability as well.
   final bool? dynamicRegistration;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (dynamicRegistration != null) {
@@ -24411,7 +24912,7 @@
       reporter.push('dynamicRegistration');
       try {
         final dynamicRegistration = obj['dynamicRegistration'];
-        if (dynamicRegistration != null && !(dynamicRegistration is bool)) {
+        if (dynamicRegistration != null && dynamicRegistration is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -24462,6 +24963,7 @@
   /// variable of a function, a class not visible outside the project, ...)
   static const local = MonikerKind('local');
 
+  @override
   Object toJson() => _value;
 
   @override
@@ -24470,6 +24972,7 @@
   @override
   int get hashCode => _value.hashCode;
 
+  @override
   bool operator ==(Object other) =>
       other is MonikerKind && other._value == _value;
 }
@@ -24494,8 +24997,10 @@
     );
   }
 
+  @override
   final bool? workDoneProgress;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (workDoneProgress != null) {
@@ -24509,7 +25014,7 @@
       reporter.push('workDoneProgress');
       try {
         final workDoneProgress = obj['workDoneProgress'];
-        if (workDoneProgress != null && !(workDoneProgress is bool)) {
+        if (workDoneProgress != null && workDoneProgress is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -24587,17 +25092,22 @@
 
   /// An optional token that a server can use to report partial results (e.g.
   /// streaming) to the client.
+  @override
   final Either2<int, String>? partialResultToken;
 
   /// The position inside the text document.
+  @override
   final Position position;
 
   /// The text document.
+  @override
   final TextDocumentIdentifier textDocument;
 
   /// An optional token that a server can use to report work done progress.
+  @override
   final Either2<int, String>? workDoneToken;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (partialResultToken != null) {
@@ -24617,7 +25127,8 @@
       try {
         final partialResultToken = obj['partialResultToken'];
         if (partialResultToken != null &&
-            !((partialResultToken is int || partialResultToken is String))) {
+            partialResultToken is! int &&
+            partialResultToken is! String) {
           reporter.reportError('must be of type Either2<int, String>');
           return false;
         }
@@ -24635,7 +25146,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(Position.canParse(position, reporter))) {
+        if (!Position.canParse(position, reporter)) {
           reporter.reportError('must be of type Position');
           return false;
         }
@@ -24653,7 +25164,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(TextDocumentIdentifier.canParse(textDocument, reporter))) {
+        if (!TextDocumentIdentifier.canParse(textDocument, reporter)) {
           reporter.reportError('must be of type TextDocumentIdentifier');
           return false;
         }
@@ -24664,7 +25175,8 @@
       try {
         final workDoneToken = obj['workDoneToken'];
         if (workDoneToken != null &&
-            !((workDoneToken is int || workDoneToken is String))) {
+            workDoneToken is! int &&
+            workDoneToken is! String) {
           reporter.reportError('must be of type Either2<int, String>');
           return false;
         }
@@ -24716,8 +25228,8 @@
   static MonikerRegistrationOptions fromJson(Map<String, Object?> json) {
     final documentSelectorJson = json['documentSelector'];
     final documentSelector = (documentSelectorJson as List<Object?>?)
-        ?.map(
-            (item) => TextDocumentFilter.fromJson(item as Map<String, Object?>))
+        ?.map((item) =>
+            TextDocumentFilterWithScheme.fromJson(item as Map<String, Object?>))
         .toList();
     final workDoneProgressJson = json['workDoneProgress'];
     final workDoneProgress = workDoneProgressJson as bool?;
@@ -24729,9 +25241,12 @@
 
   /// A document selector to identify the scope of the registration. If set to
   /// null the document selector provided on the client side will be used.
-  final List<TextDocumentFilter>? documentSelector;
+  @override
+  final List<TextDocumentFilterWithScheme>? documentSelector;
+  @override
   final bool? workDoneProgress;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['documentSelector'] = documentSelector;
@@ -24751,10 +25266,11 @@
         }
         final documentSelector = obj['documentSelector'];
         if (documentSelector != null &&
-            !((documentSelector is List<Object?> &&
-                (documentSelector.every(
-                    (item) => TextDocumentFilter.canParse(item, reporter)))))) {
-          reporter.reportError('must be of type List<TextDocumentFilter>');
+            (documentSelector is! List<Object?> ||
+                documentSelector.any((item) =>
+                    !TextDocumentFilterWithScheme.canParse(item, reporter)))) {
+          reporter.reportError(
+              'must be of type List<TextDocumentFilterWithScheme>');
           return false;
         }
       } finally {
@@ -24763,7 +25279,7 @@
       reporter.push('workDoneProgress');
       try {
         final workDoneProgress = obj['workDoneProgress'];
-        if (workDoneProgress != null && !(workDoneProgress is bool)) {
+        if (workDoneProgress != null && workDoneProgress is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -24781,8 +25297,12 @@
   bool operator ==(Object other) {
     if (other is MonikerRegistrationOptions &&
         other.runtimeType == MonikerRegistrationOptions) {
-      return listEqual(documentSelector, other.documentSelector,
-              (TextDocumentFilter a, TextDocumentFilter b) => a == b) &&
+      return listEqual(
+              documentSelector,
+              other.documentSelector,
+              (TextDocumentFilterWithScheme a,
+                      TextDocumentFilterWithScheme b) =>
+                  a == b) &&
           workDoneProgress == other.workDoneProgress &&
           true;
     }
@@ -24849,6 +25369,7 @@
   /// Additional metadata stored with the cell.
   final Object? metadata;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['document'] = document;
@@ -24875,7 +25396,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(document is String)) {
+        if (document is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -24886,7 +25407,7 @@
       try {
         final executionSummary = obj['executionSummary'];
         if (executionSummary != null &&
-            !(ExecutionSummary.canParse(executionSummary, reporter))) {
+            !ExecutionSummary.canParse(executionSummary, reporter)) {
           reporter.reportError('must be of type ExecutionSummary');
           return false;
         }
@@ -24904,7 +25425,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(NotebookCellKind.canParse(kind, reporter))) {
+        if (!NotebookCellKind.canParse(kind, reporter)) {
           reporter.reportError('must be of type NotebookCellKind');
           return false;
         }
@@ -24980,6 +25501,7 @@
   /// The start oftest of the cell that changed.
   final int start;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (cells != null) {
@@ -24996,9 +25518,8 @@
       try {
         final cells = obj['cells'];
         if (cells != null &&
-            !((cells is List<Object?> &&
-                (cells.every(
-                    (item) => NotebookCell.canParse(item, reporter)))))) {
+            (cells is! List<Object?> ||
+                cells.any((item) => !NotebookCell.canParse(item, reporter)))) {
           reporter.reportError('must be of type List<NotebookCell>');
           return false;
         }
@@ -25016,7 +25537,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(deleteCount is int)) {
+        if (deleteCount is! int) {
           reporter.reportError('must be of type int');
           return false;
         }
@@ -25034,7 +25555,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(start is int)) {
+        if (start is! int) {
           reporter.reportError('must be of type int');
           return false;
         }
@@ -25090,6 +25611,7 @@
   /// A markup-cell is formatted source that is used for display.
   static const Markup = NotebookCellKind(1);
 
+  @override
   Object toJson() => _value;
 
   @override
@@ -25098,6 +25620,7 @@
   @override
   int get hashCode => _value.hashCode;
 
+  @override
   bool operator ==(Object other) =>
       other is NotebookCellKind && other._value == _value;
 }
@@ -25119,10 +25642,10 @@
     final languageJson = json['language'];
     final language = languageJson as String?;
     final notebookJson = json['notebook'];
-    final notebook = (NotebookDocumentFilter1.canParse(notebookJson, nullLspJsonReporter) ||
+    final notebook = NotebookDocumentFilter1.canParse(notebookJson, nullLspJsonReporter) ||
             NotebookDocumentFilter2.canParse(
                 notebookJson, nullLspJsonReporter) ||
-            NotebookDocumentFilter3.canParse(notebookJson, nullLspJsonReporter))
+            NotebookDocumentFilter3.canParse(notebookJson, nullLspJsonReporter)
         ? Either2<Either3<NotebookDocumentFilter1, NotebookDocumentFilter2, NotebookDocumentFilter3>, String>.t1(
             NotebookDocumentFilter1.canParse(notebookJson, nullLspJsonReporter)
                 ? Either3<NotebookDocumentFilter1, NotebookDocumentFilter2, NotebookDocumentFilter3>.t1(NotebookDocumentFilter1.fromJson(
@@ -25154,6 +25677,7 @@
           NotebookDocumentFilter3>,
       String> notebook;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (language != null) {
@@ -25168,7 +25692,7 @@
       reporter.push('language');
       try {
         final language = obj['language'];
-        if (language != null && !(language is String)) {
+        if (language != null && language is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -25186,10 +25710,10 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(((NotebookDocumentFilter1.canParse(notebook, reporter) ||
-                NotebookDocumentFilter2.canParse(notebook, reporter) ||
-                NotebookDocumentFilter3.canParse(notebook, reporter)) ||
-            notebook is String))) {
+        if (!NotebookDocumentFilter1.canParse(notebook, reporter) &&
+            !NotebookDocumentFilter2.canParse(notebook, reporter) &&
+            !NotebookDocumentFilter3.canParse(notebook, reporter) &&
+            notebook is! String) {
           reporter.reportError(
               'must be of type Either2<Either3<NotebookDocumentFilter1, NotebookDocumentFilter2, NotebookDocumentFilter3>, String>');
           return false;
@@ -25276,6 +25800,7 @@
   /// including undo/redo).
   final int version;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['cells'] = cells.map((item) => item.toJson()).toList();
@@ -25301,8 +25826,8 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!((cells is List<Object?> &&
-            (cells.every((item) => NotebookCell.canParse(item, reporter)))))) {
+        if (cells is! List<Object?> ||
+            cells.any((item) => !NotebookCell.canParse(item, reporter))) {
           reporter.reportError('must be of type List<NotebookCell>');
           return false;
         }
@@ -25320,7 +25845,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(notebookType is String)) {
+        if (notebookType is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -25338,7 +25863,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(uri is String)) {
+        if (uri is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -25356,7 +25881,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(version is int)) {
+        if (version is! int) {
           reporter.reportError('must be of type int');
           return false;
         }
@@ -25429,6 +25954,7 @@
   /// The changed meta data if any.
   final Object? metadata;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (cells != null) {
@@ -25446,7 +25972,7 @@
       try {
         final cells = obj['cells'];
         if (cells != null &&
-            !(NotebookDocumentChangeEventCells.canParse(cells, reporter))) {
+            !NotebookDocumentChangeEventCells.canParse(cells, reporter)) {
           reporter
               .reportError('must be of type NotebookDocumentChangeEventCells');
           return false;
@@ -25503,7 +26029,7 @@
         : null;
     final textContentJson = json['textContent'];
     final textContent = (textContentJson as List<Object?>?)
-        ?.map((item) => NotebookDocumentChangeEventTextContent.fromJson(
+        ?.map((item) => NotebookDocumentChangeEventCellsTextContent.fromJson(
             item as Map<String, Object?>))
         .toList();
     return NotebookDocumentChangeEventCells(
@@ -25521,8 +26047,9 @@
   final NotebookDocumentChangeEventCellsStructure? structure;
 
   /// Changes to the text content of notebook cells.
-  final List<NotebookDocumentChangeEventTextContent>? textContent;
+  final List<NotebookDocumentChangeEventCellsTextContent>? textContent;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (data != null) {
@@ -25544,9 +26071,8 @@
       try {
         final data = obj['data'];
         if (data != null &&
-            !((data is List<Object?> &&
-                (data.every(
-                    (item) => NotebookCell.canParse(item, reporter)))))) {
+            (data is! List<Object?> ||
+                data.any((item) => !NotebookCell.canParse(item, reporter)))) {
           reporter.reportError('must be of type List<NotebookCell>');
           return false;
         }
@@ -25557,8 +26083,8 @@
       try {
         final structure = obj['structure'];
         if (structure != null &&
-            !(NotebookDocumentChangeEventCellsStructure.canParse(
-                structure, reporter))) {
+            !NotebookDocumentChangeEventCellsStructure.canParse(
+                structure, reporter)) {
           reporter.reportError(
               'must be of type NotebookDocumentChangeEventCellsStructure');
           return false;
@@ -25570,12 +26096,12 @@
       try {
         final textContent = obj['textContent'];
         if (textContent != null &&
-            !((textContent is List<Object?> &&
-                (textContent.every((item) =>
-                    NotebookDocumentChangeEventTextContent.canParse(
-                        item, reporter)))))) {
+            (textContent is! List<Object?> ||
+                textContent.any((item) =>
+                    !NotebookDocumentChangeEventCellsTextContent.canParse(
+                        item, reporter)))) {
           reporter.reportError(
-              'must be of type List<NotebookDocumentChangeEventTextContent>');
+              'must be of type List<NotebookDocumentChangeEventCellsTextContent>');
           return false;
         }
       } finally {
@@ -25598,8 +26124,8 @@
           listEqual(
               textContent,
               other.textContent,
-              (NotebookDocumentChangeEventTextContent a,
-                      NotebookDocumentChangeEventTextContent b) =>
+              (NotebookDocumentChangeEventCellsTextContent a,
+                      NotebookDocumentChangeEventCellsTextContent b) =>
                   a == b) &&
           true;
     }
@@ -25658,6 +26184,7 @@
   /// Additional opened cell text documents.
   final List<TextDocumentItem>? didOpen;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['array'] = array.toJson();
@@ -25683,7 +26210,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(NotebookCellArrayChange.canParse(array, reporter))) {
+        if (!NotebookCellArrayChange.canParse(array, reporter)) {
           reporter.reportError('must be of type NotebookCellArrayChange');
           return false;
         }
@@ -25694,9 +26221,9 @@
       try {
         final didClose = obj['didClose'];
         if (didClose != null &&
-            !((didClose is List<Object?> &&
-                (didClose.every((item) =>
-                    TextDocumentIdentifier.canParse(item, reporter)))))) {
+            (didClose is! List<Object?> ||
+                didClose.any((item) =>
+                    !TextDocumentIdentifier.canParse(item, reporter)))) {
           reporter.reportError('must be of type List<TextDocumentIdentifier>');
           return false;
         }
@@ -25707,9 +26234,9 @@
       try {
         final didOpen = obj['didOpen'];
         if (didOpen != null &&
-            !((didOpen is List<Object?> &&
-                (didOpen.every(
-                    (item) => TextDocumentItem.canParse(item, reporter)))))) {
+            (didOpen is! List<Object?> ||
+                didOpen.any(
+                    (item) => !TextDocumentItem.canParse(item, reporter)))) {
           reporter.reportError('must be of type List<TextDocumentItem>');
           return false;
         }
@@ -25749,17 +26276,17 @@
   String toString() => jsonEncoder.convert(toJson());
 }
 
-class NotebookDocumentChangeEventTextContent implements ToJsonable {
+class NotebookDocumentChangeEventCellsTextContent implements ToJsonable {
   static const jsonHandler = LspJsonHandler(
-    NotebookDocumentChangeEventTextContent.canParse,
-    NotebookDocumentChangeEventTextContent.fromJson,
+    NotebookDocumentChangeEventCellsTextContent.canParse,
+    NotebookDocumentChangeEventCellsTextContent.fromJson,
   );
 
-  NotebookDocumentChangeEventTextContent({
+  NotebookDocumentChangeEventCellsTextContent({
     required this.changes,
     required this.document,
   });
-  static NotebookDocumentChangeEventTextContent fromJson(
+  static NotebookDocumentChangeEventCellsTextContent fromJson(
       Map<String, Object?> json) {
     final changesJson = json['changes'];
     final changes = (changesJson as List<Object?>)
@@ -25777,7 +26304,7 @@
     final documentJson = json['document'];
     final document = VersionedTextDocumentIdentifier.fromJson(
         documentJson as Map<String, Object?>);
-    return NotebookDocumentChangeEventTextContent(
+    return NotebookDocumentChangeEventCellsTextContent(
       changes: changes,
       document: document,
     );
@@ -25788,6 +26315,7 @@
           TextDocumentContentChangeEvent2>> changes;
   final VersionedTextDocumentIdentifier document;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['changes'] = changes;
@@ -25808,10 +26336,10 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!((changes is List<Object?> &&
-            (changes.every((item) => (TextDocumentContentChangeEvent1.canParse(
-                    item, reporter) ||
-                TextDocumentContentChangeEvent2.canParse(item, reporter))))))) {
+        if (changes is! List<Object?> ||
+            changes.any((item) =>
+                !TextDocumentContentChangeEvent1.canParse(item, reporter) &&
+                !TextDocumentContentChangeEvent2.canParse(item, reporter))) {
           reporter.reportError(
               'must be of type List<Either2<TextDocumentContentChangeEvent1, TextDocumentContentChangeEvent2>>');
           return false;
@@ -25830,7 +26358,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(VersionedTextDocumentIdentifier.canParse(document, reporter))) {
+        if (!VersionedTextDocumentIdentifier.canParse(document, reporter)) {
           reporter
               .reportError('must be of type VersionedTextDocumentIdentifier');
           return false;
@@ -25841,15 +26369,15 @@
       return true;
     } else {
       reporter.reportError(
-          'must be of type NotebookDocumentChangeEventTextContent');
+          'must be of type NotebookDocumentChangeEventCellsTextContent');
       return false;
     }
   }
 
   @override
   bool operator ==(Object other) {
-    if (other is NotebookDocumentChangeEventTextContent &&
-        other.runtimeType == NotebookDocumentChangeEventTextContent) {
+    if (other is NotebookDocumentChangeEventCellsTextContent &&
+        other.runtimeType == NotebookDocumentChangeEventCellsTextContent) {
       return listEqual(
               changes,
               other.changes,
@@ -25901,6 +26429,7 @@
   ///  @since 3.17.0
   final NotebookDocumentSyncClientCapabilities synchronization;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['synchronization'] = synchronization.toJson();
@@ -25920,8 +26449,8 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(NotebookDocumentSyncClientCapabilities.canParse(
-            synchronization, reporter))) {
+        if (!NotebookDocumentSyncClientCapabilities.canParse(
+            synchronization, reporter)) {
           reporter.reportError(
               'must be of type NotebookDocumentSyncClientCapabilities');
           return false;
@@ -25987,6 +26516,7 @@
   /// A Uri [scheme](#Uri.scheme), like `file` or `untitled`.
   final String? scheme;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['notebookType'] = notebookType;
@@ -26012,7 +26542,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(notebookType is String)) {
+        if (notebookType is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -26022,7 +26552,7 @@
       reporter.push('pattern');
       try {
         final pattern = obj['pattern'];
-        if (pattern != null && !(pattern is String)) {
+        if (pattern != null && pattern is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -26032,7 +26562,7 @@
       reporter.push('scheme');
       try {
         final scheme = obj['scheme'];
-        if (scheme != null && !(scheme is String)) {
+        if (scheme != null && scheme is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -26103,6 +26633,7 @@
   /// A Uri [scheme](#Uri.scheme), like `file` or `untitled`.
   final String scheme;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (notebookType != null) {
@@ -26120,7 +26651,7 @@
       reporter.push('notebookType');
       try {
         final notebookType = obj['notebookType'];
-        if (notebookType != null && !(notebookType is String)) {
+        if (notebookType != null && notebookType is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -26130,7 +26661,7 @@
       reporter.push('pattern');
       try {
         final pattern = obj['pattern'];
-        if (pattern != null && !(pattern is String)) {
+        if (pattern != null && pattern is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -26148,7 +26679,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(scheme is String)) {
+        if (scheme is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -26219,6 +26750,7 @@
   /// A Uri [scheme](#Uri.scheme), like `file` or `untitled`.
   final String? scheme;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (notebookType != null) {
@@ -26236,7 +26768,7 @@
       reporter.push('notebookType');
       try {
         final notebookType = obj['notebookType'];
-        if (notebookType != null && !(notebookType is String)) {
+        if (notebookType != null && notebookType is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -26254,7 +26786,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(pattern is String)) {
+        if (pattern is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -26264,7 +26796,7 @@
       reporter.push('scheme');
       try {
         final scheme = obj['scheme'];
-        if (scheme != null && !(scheme is String)) {
+        if (scheme != null && scheme is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -26323,6 +26855,7 @@
   /// The notebook document's uri.
   final String uri;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['uri'] = uri;
@@ -26342,7 +26875,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(uri is String)) {
+        if (uri is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -26382,13 +26915,17 @@
 
   NotebookDocumentSyncClientCapabilities({
     this.dynamicRegistration,
+    this.executionSummarySupport,
   });
   static NotebookDocumentSyncClientCapabilities fromJson(
       Map<String, Object?> json) {
     final dynamicRegistrationJson = json['dynamicRegistration'];
     final dynamicRegistration = dynamicRegistrationJson as bool?;
+    final executionSummarySupportJson = json['executionSummarySupport'];
+    final executionSummarySupport = executionSummarySupportJson as bool?;
     return NotebookDocumentSyncClientCapabilities(
       dynamicRegistration: dynamicRegistration,
+      executionSummarySupport: executionSummarySupport,
     );
   }
 
@@ -26398,11 +26935,18 @@
   /// capability as well.
   final bool? dynamicRegistration;
 
+  /// The client supports sending execution summary data per cell.
+  final bool? executionSummarySupport;
+
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (dynamicRegistration != null) {
       result['dynamicRegistration'] = dynamicRegistration;
     }
+    if (executionSummarySupport != null) {
+      result['executionSummarySupport'] = executionSummarySupport;
+    }
     return result;
   }
 
@@ -26411,7 +26955,18 @@
       reporter.push('dynamicRegistration');
       try {
         final dynamicRegistration = obj['dynamicRegistration'];
-        if (dynamicRegistration != null && !(dynamicRegistration is bool)) {
+        if (dynamicRegistration != null && dynamicRegistration is! bool) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('executionSummarySupport');
+      try {
+        final executionSummarySupport = obj['executionSummarySupport'];
+        if (executionSummarySupport != null &&
+            executionSummarySupport is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -26430,13 +26985,18 @@
   bool operator ==(Object other) {
     if (other is NotebookDocumentSyncClientCapabilities &&
         other.runtimeType == NotebookDocumentSyncClientCapabilities) {
-      return dynamicRegistration == other.dynamicRegistration && true;
+      return dynamicRegistration == other.dynamicRegistration &&
+          executionSummarySupport == other.executionSummarySupport &&
+          true;
     }
     return false;
   }
 
   @override
-  int get hashCode => dynamicRegistration.hashCode;
+  int get hashCode => Object.hash(
+        dynamicRegistration,
+        executionSummarySupport,
+      );
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -26496,6 +27056,7 @@
   /// honored if mode === `notebook`.
   final bool? save;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['notebookSelector'] = notebookSelector;
@@ -26518,12 +27079,12 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!((notebookSelector is List<Object?> &&
-            (notebookSelector.every((item) =>
-                (NotebookDocumentSyncOptionsNotebookSelector.canParse(
-                        item, reporter) ||
-                    NotebookDocumentSyncOptionsNotebookSelector2.canParse(
-                        item, reporter))))))) {
+        if (notebookSelector is! List<Object?> ||
+            notebookSelector.any((item) =>
+                !NotebookDocumentSyncOptionsNotebookSelector.canParse(
+                    item, reporter) &&
+                !NotebookDocumentSyncOptionsNotebookSelector2.canParse(
+                    item, reporter))) {
           reporter.reportError(
               'must be of type List<Either2<NotebookDocumentSyncOptionsNotebookSelector, NotebookDocumentSyncOptionsNotebookSelector2>>');
           return false;
@@ -26534,7 +27095,7 @@
       reporter.push('save');
       try {
         final save = obj['save'];
-        if (save != null && !(save is bool)) {
+        if (save != null && save is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -26578,142 +27139,6 @@
   String toString() => jsonEncoder.convert(toJson());
 }
 
-class NotebookDocumentSyncOptionsCells implements ToJsonable {
-  static const jsonHandler = LspJsonHandler(
-    NotebookDocumentSyncOptionsCells.canParse,
-    NotebookDocumentSyncOptionsCells.fromJson,
-  );
-
-  NotebookDocumentSyncOptionsCells({
-    required this.language,
-  });
-  static NotebookDocumentSyncOptionsCells fromJson(Map<String, Object?> json) {
-    final languageJson = json['language'];
-    final language = languageJson as String;
-    return NotebookDocumentSyncOptionsCells(
-      language: language,
-    );
-  }
-
-  final String language;
-
-  Map<String, Object?> toJson() {
-    var result = <String, Object?>{};
-    result['language'] = language;
-    return result;
-  }
-
-  static bool canParse(Object? obj, LspJsonReporter reporter) {
-    if (obj is Map<String, Object?>) {
-      reporter.push('language');
-      try {
-        if (!obj.containsKey('language')) {
-          reporter.reportError('must not be undefined');
-          return false;
-        }
-        final language = obj['language'];
-        if (language == null) {
-          reporter.reportError('must not be null');
-          return false;
-        }
-        if (!(language is String)) {
-          reporter.reportError('must be of type String');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      return true;
-    } else {
-      reporter.reportError('must be of type NotebookDocumentSyncOptionsCells');
-      return false;
-    }
-  }
-
-  @override
-  bool operator ==(Object other) {
-    if (other is NotebookDocumentSyncOptionsCells &&
-        other.runtimeType == NotebookDocumentSyncOptionsCells) {
-      return language == other.language && true;
-    }
-    return false;
-  }
-
-  @override
-  int get hashCode => language.hashCode;
-
-  @override
-  String toString() => jsonEncoder.convert(toJson());
-}
-
-class NotebookDocumentSyncOptionsCells2 implements ToJsonable {
-  static const jsonHandler = LspJsonHandler(
-    NotebookDocumentSyncOptionsCells2.canParse,
-    NotebookDocumentSyncOptionsCells2.fromJson,
-  );
-
-  NotebookDocumentSyncOptionsCells2({
-    required this.language,
-  });
-  static NotebookDocumentSyncOptionsCells2 fromJson(Map<String, Object?> json) {
-    final languageJson = json['language'];
-    final language = languageJson as String;
-    return NotebookDocumentSyncOptionsCells2(
-      language: language,
-    );
-  }
-
-  final String language;
-
-  Map<String, Object?> toJson() {
-    var result = <String, Object?>{};
-    result['language'] = language;
-    return result;
-  }
-
-  static bool canParse(Object? obj, LspJsonReporter reporter) {
-    if (obj is Map<String, Object?>) {
-      reporter.push('language');
-      try {
-        if (!obj.containsKey('language')) {
-          reporter.reportError('must not be undefined');
-          return false;
-        }
-        final language = obj['language'];
-        if (language == null) {
-          reporter.reportError('must not be null');
-          return false;
-        }
-        if (!(language is String)) {
-          reporter.reportError('must be of type String');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      return true;
-    } else {
-      reporter.reportError('must be of type NotebookDocumentSyncOptionsCells2');
-      return false;
-    }
-  }
-
-  @override
-  bool operator ==(Object other) {
-    if (other is NotebookDocumentSyncOptionsCells2 &&
-        other.runtimeType == NotebookDocumentSyncOptionsCells2) {
-      return language == other.language && true;
-    }
-    return false;
-  }
-
-  @override
-  int get hashCode => language.hashCode;
-
-  @override
-  String toString() => jsonEncoder.convert(toJson());
-}
-
 class NotebookDocumentSyncOptionsNotebookSelector implements ToJsonable {
   static const jsonHandler = LspJsonHandler(
     NotebookDocumentSyncOptionsNotebookSelector.canParse,
@@ -26722,54 +27147,55 @@
 
   NotebookDocumentSyncOptionsNotebookSelector({
     this.cells,
-    required this.notebookDocument,
+    required this.notebook,
   });
   static NotebookDocumentSyncOptionsNotebookSelector fromJson(
       Map<String, Object?> json) {
     final cellsJson = json['cells'];
     final cells = (cellsJson as List<Object?>?)
-        ?.map((item) => NotebookDocumentSyncOptionsCells.fromJson(
-            item as Map<String, Object?>))
+        ?.map((item) =>
+            NotebookDocumentSyncOptionsNotebookSelectorCells.fromJson(
+                item as Map<String, Object?>))
         .toList();
-    final notebookDocumentJson = json['notebookDocument'];
-    final notebookDocument = (NotebookDocumentFilter1.canParse(
-                notebookDocumentJson, nullLspJsonReporter) ||
+    final notebookJson = json['notebook'];
+    final notebook = NotebookDocumentFilter1.canParse(notebookJson, nullLspJsonReporter) ||
             NotebookDocumentFilter2.canParse(
-                notebookDocumentJson, nullLspJsonReporter) ||
-            NotebookDocumentFilter3.canParse(
-                notebookDocumentJson, nullLspJsonReporter))
+                notebookJson, nullLspJsonReporter) ||
+            NotebookDocumentFilter3.canParse(notebookJson, nullLspJsonReporter)
         ? Either2<Either3<NotebookDocumentFilter1, NotebookDocumentFilter2, NotebookDocumentFilter3>, String>.t1(
-            NotebookDocumentFilter1.canParse(notebookDocumentJson, nullLspJsonReporter)
-                ? Either3<NotebookDocumentFilter1, NotebookDocumentFilter2, NotebookDocumentFilter3>.t1(
-                    NotebookDocumentFilter1.fromJson(
-                        notebookDocumentJson as Map<String, Object?>))
-                : (NotebookDocumentFilter2.canParse(notebookDocumentJson, nullLspJsonReporter)
-                    ? Either3<NotebookDocumentFilter1, NotebookDocumentFilter2, NotebookDocumentFilter3>.t2(
-                        NotebookDocumentFilter2.fromJson(notebookDocumentJson as Map<String, Object?>))
-                    : (NotebookDocumentFilter3.canParse(notebookDocumentJson, nullLspJsonReporter) ? Either3<NotebookDocumentFilter1, NotebookDocumentFilter2, NotebookDocumentFilter3>.t3(NotebookDocumentFilter3.fromJson(notebookDocumentJson as Map<String, Object?>)) : (throw '''$notebookDocumentJson was not one of (NotebookDocumentFilter1, NotebookDocumentFilter2, NotebookDocumentFilter3)'''))))
-        : (notebookDocumentJson is String ? Either2<Either3<NotebookDocumentFilter1, NotebookDocumentFilter2, NotebookDocumentFilter3>, String>.t2(notebookDocumentJson) : (throw '''$notebookDocumentJson was not one of (Either3<NotebookDocumentFilter1, NotebookDocumentFilter2, NotebookDocumentFilter3>, String)'''));
+            NotebookDocumentFilter1.canParse(notebookJson, nullLspJsonReporter)
+                ? Either3<NotebookDocumentFilter1, NotebookDocumentFilter2, NotebookDocumentFilter3>.t1(NotebookDocumentFilter1.fromJson(
+                    notebookJson as Map<String, Object?>))
+                : (NotebookDocumentFilter2.canParse(notebookJson, nullLspJsonReporter)
+                    ? Either3<NotebookDocumentFilter1, NotebookDocumentFilter2, NotebookDocumentFilter3>.t2(NotebookDocumentFilter2.fromJson(
+                        notebookJson as Map<String, Object?>))
+                    : (NotebookDocumentFilter3.canParse(notebookJson, nullLspJsonReporter)
+                        ? Either3<NotebookDocumentFilter1, NotebookDocumentFilter2, NotebookDocumentFilter3>.t3(NotebookDocumentFilter3.fromJson(notebookJson as Map<String, Object?>))
+                        : (throw '''$notebookJson was not one of (NotebookDocumentFilter1, NotebookDocumentFilter2, NotebookDocumentFilter3)'''))))
+        : (notebookJson is String ? Either2<Either3<NotebookDocumentFilter1, NotebookDocumentFilter2, NotebookDocumentFilter3>, String>.t2(notebookJson) : (throw '''$notebookJson was not one of (Either3<NotebookDocumentFilter1, NotebookDocumentFilter2, NotebookDocumentFilter3>, String)'''));
     return NotebookDocumentSyncOptionsNotebookSelector(
       cells: cells,
-      notebookDocument: notebookDocument,
+      notebook: notebook,
     );
   }
 
   /// The cells of the matching notebook to be synced.
-  final List<NotebookDocumentSyncOptionsCells>? cells;
+  final List<NotebookDocumentSyncOptionsNotebookSelectorCells>? cells;
 
   /// The notebook to be synced If a string value is provided it matches against
   /// the notebook type. '*' matches every notebook.
   final Either2<
       Either3<NotebookDocumentFilter1, NotebookDocumentFilter2,
           NotebookDocumentFilter3>,
-      String> notebookDocument;
+      String> notebook;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (cells != null) {
       result['cells'] = cells?.map((item) => item.toJson()).toList();
     }
-    result['notebookDocument'] = notebookDocument;
+    result['notebook'] = notebook;
     return result;
   }
 
@@ -26779,32 +27205,32 @@
       try {
         final cells = obj['cells'];
         if (cells != null &&
-            !((cells is List<Object?> &&
-                (cells.every((item) =>
-                    NotebookDocumentSyncOptionsCells.canParse(
-                        item, reporter)))))) {
+            (cells is! List<Object?> ||
+                cells.any((item) =>
+                    !NotebookDocumentSyncOptionsNotebookSelectorCells.canParse(
+                        item, reporter)))) {
           reporter.reportError(
-              'must be of type List<NotebookDocumentSyncOptionsCells>');
+              'must be of type List<NotebookDocumentSyncOptionsNotebookSelectorCells>');
           return false;
         }
       } finally {
         reporter.pop();
       }
-      reporter.push('notebookDocument');
+      reporter.push('notebook');
       try {
-        if (!obj.containsKey('notebookDocument')) {
+        if (!obj.containsKey('notebook')) {
           reporter.reportError('must not be undefined');
           return false;
         }
-        final notebookDocument = obj['notebookDocument'];
-        if (notebookDocument == null) {
+        final notebook = obj['notebook'];
+        if (notebook == null) {
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(((NotebookDocumentFilter1.canParse(notebookDocument, reporter) ||
-                NotebookDocumentFilter2.canParse(notebookDocument, reporter) ||
-                NotebookDocumentFilter3.canParse(notebookDocument, reporter)) ||
-            notebookDocument is String))) {
+        if (!NotebookDocumentFilter1.canParse(notebook, reporter) &&
+            !NotebookDocumentFilter2.canParse(notebook, reporter) &&
+            !NotebookDocumentFilter3.canParse(notebook, reporter) &&
+            notebook is! String) {
           reporter.reportError(
               'must be of type Either2<Either3<NotebookDocumentFilter1, NotebookDocumentFilter2, NotebookDocumentFilter3>, String>');
           return false;
@@ -26827,10 +27253,10 @@
       return listEqual(
               cells,
               other.cells,
-              (NotebookDocumentSyncOptionsCells a,
-                      NotebookDocumentSyncOptionsCells b) =>
+              (NotebookDocumentSyncOptionsNotebookSelectorCells a,
+                      NotebookDocumentSyncOptionsNotebookSelectorCells b) =>
                   a == b) &&
-          notebookDocument == other.notebookDocument &&
+          notebook == other.notebook &&
           true;
     }
     return false;
@@ -26839,7 +27265,7 @@
   @override
   int get hashCode => Object.hash(
         lspHashCode(cells),
-        notebookDocument,
+        notebook,
       );
 
   @override
@@ -26854,54 +27280,56 @@
 
   NotebookDocumentSyncOptionsNotebookSelector2({
     required this.cells,
-    this.notebookDocument,
+    this.notebook,
   });
   static NotebookDocumentSyncOptionsNotebookSelector2 fromJson(
       Map<String, Object?> json) {
     final cellsJson = json['cells'];
     final cells = (cellsJson as List<Object?>)
-        .map((item) => NotebookDocumentSyncOptionsCells2.fromJson(
-            item as Map<String, Object?>))
+        .map((item) =>
+            NotebookDocumentSyncOptionsNotebookSelector2Cells.fromJson(
+                item as Map<String, Object?>))
         .toList();
-    final notebookDocumentJson = json['notebookDocument'];
-    final notebookDocument = notebookDocumentJson == null
+    final notebookJson = json['notebook'];
+    final notebook = notebookJson == null
         ? null
-        : ((NotebookDocumentFilter1.canParse(notebookDocumentJson, nullLspJsonReporter) ||
+        : (NotebookDocumentFilter1.canParse(notebookJson, nullLspJsonReporter) ||
                 NotebookDocumentFilter2.canParse(
-                    notebookDocumentJson, nullLspJsonReporter) ||
+                    notebookJson, nullLspJsonReporter) ||
                 NotebookDocumentFilter3.canParse(
-                    notebookDocumentJson, nullLspJsonReporter))
+                    notebookJson, nullLspJsonReporter)
             ? Either2<Either3<NotebookDocumentFilter1, NotebookDocumentFilter2, NotebookDocumentFilter3>, String>.t1(
-                NotebookDocumentFilter1.canParse(notebookDocumentJson, nullLspJsonReporter)
+                NotebookDocumentFilter1.canParse(notebookJson, nullLspJsonReporter)
                     ? Either3<NotebookDocumentFilter1, NotebookDocumentFilter2, NotebookDocumentFilter3>.t1(
                         NotebookDocumentFilter1.fromJson(
-                            notebookDocumentJson as Map<String, Object?>))
-                    : (NotebookDocumentFilter2.canParse(notebookDocumentJson, nullLspJsonReporter)
+                            notebookJson as Map<String, Object?>))
+                    : (NotebookDocumentFilter2.canParse(notebookJson, nullLspJsonReporter)
                         ? Either3<NotebookDocumentFilter1, NotebookDocumentFilter2, NotebookDocumentFilter3>.t2(
-                            NotebookDocumentFilter2.fromJson(notebookDocumentJson as Map<String, Object?>))
-                        : (NotebookDocumentFilter3.canParse(notebookDocumentJson, nullLspJsonReporter) ? Either3<NotebookDocumentFilter1, NotebookDocumentFilter2, NotebookDocumentFilter3>.t3(NotebookDocumentFilter3.fromJson(notebookDocumentJson as Map<String, Object?>)) : (throw '''$notebookDocumentJson was not one of (NotebookDocumentFilter1, NotebookDocumentFilter2, NotebookDocumentFilter3)'''))))
-            : (notebookDocumentJson is String ? Either2<Either3<NotebookDocumentFilter1, NotebookDocumentFilter2, NotebookDocumentFilter3>, String>.t2(notebookDocumentJson) : (throw '''$notebookDocumentJson was not one of (Either3<NotebookDocumentFilter1, NotebookDocumentFilter2, NotebookDocumentFilter3>, String)''')));
+                            NotebookDocumentFilter2.fromJson(notebookJson as Map<String, Object?>))
+                        : (NotebookDocumentFilter3.canParse(notebookJson, nullLspJsonReporter) ? Either3<NotebookDocumentFilter1, NotebookDocumentFilter2, NotebookDocumentFilter3>.t3(NotebookDocumentFilter3.fromJson(notebookJson as Map<String, Object?>)) : (throw '''$notebookJson was not one of (NotebookDocumentFilter1, NotebookDocumentFilter2, NotebookDocumentFilter3)'''))))
+            : (notebookJson is String ? Either2<Either3<NotebookDocumentFilter1, NotebookDocumentFilter2, NotebookDocumentFilter3>, String>.t2(notebookJson) : (throw '''$notebookJson was not one of (Either3<NotebookDocumentFilter1, NotebookDocumentFilter2, NotebookDocumentFilter3>, String)''')));
     return NotebookDocumentSyncOptionsNotebookSelector2(
       cells: cells,
-      notebookDocument: notebookDocument,
+      notebook: notebook,
     );
   }
 
   /// The cells of the matching notebook to be synced.
-  final List<NotebookDocumentSyncOptionsCells2> cells;
+  final List<NotebookDocumentSyncOptionsNotebookSelector2Cells> cells;
 
   /// The notebook to be synced If a string value is provided it matches against
   /// the notebook type. '*' matches every notebook.
   final Either2<
       Either3<NotebookDocumentFilter1, NotebookDocumentFilter2,
           NotebookDocumentFilter3>,
-      String>? notebookDocument;
+      String>? notebook;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['cells'] = cells.map((item) => item.toJson()).toList();
-    if (notebookDocument != null) {
-      result['notebookDocument'] = notebookDocument;
+    if (notebook != null) {
+      result['notebook'] = notebook;
     }
     return result;
   }
@@ -26919,26 +27347,25 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!((cells is List<Object?> &&
-            (cells.every((item) => NotebookDocumentSyncOptionsCells2.canParse(
-                item, reporter)))))) {
+        if (cells is! List<Object?> ||
+            cells.any((item) =>
+                !NotebookDocumentSyncOptionsNotebookSelector2Cells.canParse(
+                    item, reporter))) {
           reporter.reportError(
-              'must be of type List<NotebookDocumentSyncOptionsCells2>');
+              'must be of type List<NotebookDocumentSyncOptionsNotebookSelector2Cells>');
           return false;
         }
       } finally {
         reporter.pop();
       }
-      reporter.push('notebookDocument');
+      reporter.push('notebook');
       try {
-        final notebookDocument = obj['notebookDocument'];
-        if (notebookDocument != null &&
-            !(((NotebookDocumentFilter1.canParse(notebookDocument, reporter) ||
-                    NotebookDocumentFilter2.canParse(
-                        notebookDocument, reporter) ||
-                    NotebookDocumentFilter3.canParse(
-                        notebookDocument, reporter)) ||
-                notebookDocument is String))) {
+        final notebook = obj['notebook'];
+        if (notebook != null &&
+            !NotebookDocumentFilter1.canParse(notebook, reporter) &&
+            !NotebookDocumentFilter2.canParse(notebook, reporter) &&
+            !NotebookDocumentFilter3.canParse(notebook, reporter) &&
+            notebook is! String) {
           reporter.reportError(
               'must be of type Either2<Either3<NotebookDocumentFilter1, NotebookDocumentFilter2, NotebookDocumentFilter3>, String>');
           return false;
@@ -26961,10 +27388,10 @@
       return listEqual(
               cells,
               other.cells,
-              (NotebookDocumentSyncOptionsCells2 a,
-                      NotebookDocumentSyncOptionsCells2 b) =>
+              (NotebookDocumentSyncOptionsNotebookSelector2Cells a,
+                      NotebookDocumentSyncOptionsNotebookSelector2Cells b) =>
                   a == b) &&
-          notebookDocument == other.notebookDocument &&
+          notebook == other.notebook &&
           true;
     }
     return false;
@@ -26973,13 +27400,156 @@
   @override
   int get hashCode => Object.hash(
         lspHashCode(cells),
-        notebookDocument,
+        notebook,
       );
 
   @override
   String toString() => jsonEncoder.convert(toJson());
 }
 
+class NotebookDocumentSyncOptionsNotebookSelector2Cells implements ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+    NotebookDocumentSyncOptionsNotebookSelector2Cells.canParse,
+    NotebookDocumentSyncOptionsNotebookSelector2Cells.fromJson,
+  );
+
+  NotebookDocumentSyncOptionsNotebookSelector2Cells({
+    required this.language,
+  });
+  static NotebookDocumentSyncOptionsNotebookSelector2Cells fromJson(
+      Map<String, Object?> json) {
+    final languageJson = json['language'];
+    final language = languageJson as String;
+    return NotebookDocumentSyncOptionsNotebookSelector2Cells(
+      language: language,
+    );
+  }
+
+  final String language;
+
+  @override
+  Map<String, Object?> toJson() {
+    var result = <String, Object?>{};
+    result['language'] = language;
+    return result;
+  }
+
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
+    if (obj is Map<String, Object?>) {
+      reporter.push('language');
+      try {
+        if (!obj.containsKey('language')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final language = obj['language'];
+        if (language == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (language is! String) {
+          reporter.reportError('must be of type String');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError(
+          'must be of type NotebookDocumentSyncOptionsNotebookSelector2Cells');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is NotebookDocumentSyncOptionsNotebookSelector2Cells &&
+        other.runtimeType ==
+            NotebookDocumentSyncOptionsNotebookSelector2Cells) {
+      return language == other.language && true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode => language.hashCode;
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+class NotebookDocumentSyncOptionsNotebookSelectorCells implements ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+    NotebookDocumentSyncOptionsNotebookSelectorCells.canParse,
+    NotebookDocumentSyncOptionsNotebookSelectorCells.fromJson,
+  );
+
+  NotebookDocumentSyncOptionsNotebookSelectorCells({
+    required this.language,
+  });
+  static NotebookDocumentSyncOptionsNotebookSelectorCells fromJson(
+      Map<String, Object?> json) {
+    final languageJson = json['language'];
+    final language = languageJson as String;
+    return NotebookDocumentSyncOptionsNotebookSelectorCells(
+      language: language,
+    );
+  }
+
+  final String language;
+
+  @override
+  Map<String, Object?> toJson() {
+    var result = <String, Object?>{};
+    result['language'] = language;
+    return result;
+  }
+
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
+    if (obj is Map<String, Object?>) {
+      reporter.push('language');
+      try {
+        if (!obj.containsKey('language')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final language = obj['language'];
+        if (language == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (language is! String) {
+          reporter.reportError('must be of type String');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError(
+          'must be of type NotebookDocumentSyncOptionsNotebookSelectorCells');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is NotebookDocumentSyncOptionsNotebookSelectorCells &&
+        other.runtimeType == NotebookDocumentSyncOptionsNotebookSelectorCells) {
+      return language == other.language && true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode => language.hashCode;
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
 /// Registration options specific to a notebook.
 ///  @since 3.17.0
 class NotebookDocumentSyncRegistrationOptions
@@ -27025,17 +27595,21 @@
 
   /// The id used to register the request. The id can be used to deregister the
   /// request again. See also Registration#id.
+  @override
   final String? id;
 
   /// The notebooks to be synced
+  @override
   final List<
       Either2<NotebookDocumentSyncOptionsNotebookSelector,
           NotebookDocumentSyncOptionsNotebookSelector2>> notebookSelector;
 
   /// Whether save notification should be forwarded to the server. Will only be
   /// honored if mode === `notebook`.
+  @override
   final bool? save;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (id != null) {
@@ -27053,7 +27627,7 @@
       reporter.push('id');
       try {
         final id = obj['id'];
-        if (id != null && !(id is String)) {
+        if (id != null && id is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -27071,12 +27645,12 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!((notebookSelector is List<Object?> &&
-            (notebookSelector.every((item) =>
-                (NotebookDocumentSyncOptionsNotebookSelector.canParse(
-                        item, reporter) ||
-                    NotebookDocumentSyncOptionsNotebookSelector2.canParse(
-                        item, reporter))))))) {
+        if (notebookSelector is! List<Object?> ||
+            notebookSelector.any((item) =>
+                !NotebookDocumentSyncOptionsNotebookSelector.canParse(
+                    item, reporter) &&
+                !NotebookDocumentSyncOptionsNotebookSelector2.canParse(
+                    item, reporter))) {
           reporter.reportError(
               'must be of type List<Either2<NotebookDocumentSyncOptionsNotebookSelector, NotebookDocumentSyncOptionsNotebookSelector2>>');
           return false;
@@ -27087,7 +27661,7 @@
       reporter.push('save');
       try {
         final save = obj['save'];
-        if (save != null && !(save is bool)) {
+        if (save != null && save is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -27158,6 +27732,7 @@
   }
 
   /// The text document's URI.
+  @override
   final String uri;
 
   /// The version number of this document. If an optional versioned text
@@ -27171,6 +27746,7 @@
   /// including undo/redo. The number doesn't need to be consecutive.
   final int? version;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['uri'] = uri;
@@ -27191,7 +27767,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(uri is String)) {
+        if (uri is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -27205,7 +27781,7 @@
           return false;
         }
         final version = obj['version'];
-        if (version != null && !(version is int)) {
+        if (version != null && version is! int) {
           reporter.reportError('must be of type int');
           return false;
         }
@@ -27285,6 +27861,7 @@
   /// part in the `SignatureInformation.label`.
   final String label;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (documentation != null) {
@@ -27300,8 +27877,8 @@
       try {
         final documentation = obj['documentation'];
         if (documentation != null &&
-            !((MarkupContent.canParse(documentation, reporter) ||
-                documentation is String))) {
+            !MarkupContent.canParse(documentation, reporter) &&
+            documentation is! String) {
           reporter
               .reportError('must be of type Either2<MarkupContent, String>');
           return false;
@@ -27320,7 +27897,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(label is String)) {
+        if (label is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -27460,6 +28037,7 @@
   /// streaming) to the client.
   final Either2<int, String>? partialResultToken;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (partialResultToken != null) {
@@ -27474,7 +28052,8 @@
       try {
         final partialResultToken = obj['partialResultToken'];
         if (partialResultToken != null &&
-            !((partialResultToken is int || partialResultToken is String))) {
+            partialResultToken is! int &&
+            partialResultToken is! String) {
           reporter.reportError('must be of type Either2<int, String>');
           return false;
         }
@@ -27528,6 +28107,7 @@
   final String placeholder;
   final Range range;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['placeholder'] = placeholder;
@@ -27548,7 +28128,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(placeholder is String)) {
+        if (placeholder is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -27566,7 +28146,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(Range.canParse(range, reporter))) {
+        if (!Range.canParse(range, reporter)) {
           reporter.reportError('must be of type Range');
           return false;
         }
@@ -27630,6 +28210,7 @@
   /// Line position in a document (zero-based).
   final int line;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['character'] = character;
@@ -27650,7 +28231,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(character is int)) {
+        if (character is! int) {
           reporter.reportError('must be of type int');
           return false;
         }
@@ -27668,7 +28249,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(line is int)) {
+        if (line is! int) {
           reporter.reportError('must be of type int');
           return false;
         }
@@ -27727,6 +28308,7 @@
   /// Character offsets count UTF-8 code units.
   static const UTF8 = PositionEncodingKind('utf-8');
 
+  @override
   Object toJson() => _value;
 
   @override
@@ -27735,11 +28317,13 @@
   @override
   int get hashCode => _value.hashCode;
 
+  @override
   bool operator ==(Object other) =>
       other is PositionEncodingKind && other._value == _value;
 }
 
-class PrepareRenameParams implements TextDocumentPositionParams, ToJsonable {
+class PrepareRenameParams
+    implements TextDocumentPositionParams, WorkDoneProgressParams, ToJsonable {
   static const jsonHandler = LspJsonHandler(
     PrepareRenameParams.canParse,
     PrepareRenameParams.fromJson,
@@ -27748,6 +28332,7 @@
   PrepareRenameParams({
     required this.position,
     required this.textDocument,
+    this.workDoneToken,
   });
   static PrepareRenameParams fromJson(Map<String, Object?> json) {
     final positionJson = json['position'];
@@ -27755,22 +28340,41 @@
     final textDocumentJson = json['textDocument'];
     final textDocument = TextDocumentIdentifier.fromJson(
         textDocumentJson as Map<String, Object?>);
+    final workDoneTokenJson = json['workDoneToken'];
+    final workDoneToken = workDoneTokenJson == null
+        ? null
+        : (workDoneTokenJson is int
+            ? Either2<int, String>.t1(workDoneTokenJson)
+            : (workDoneTokenJson is String
+                ? Either2<int, String>.t2(workDoneTokenJson)
+                : (throw '''$workDoneTokenJson was not one of (int, String)''')));
     return PrepareRenameParams(
       position: position,
       textDocument: textDocument,
+      workDoneToken: workDoneToken,
     );
   }
 
   /// The position inside the text document.
+  @override
   final Position position;
 
   /// The text document.
+  @override
   final TextDocumentIdentifier textDocument;
 
+  /// An optional token that a server can use to report work done progress.
+  @override
+  final Either2<int, String>? workDoneToken;
+
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['position'] = position.toJson();
     result['textDocument'] = textDocument.toJson();
+    if (workDoneToken != null) {
+      result['workDoneToken'] = workDoneToken;
+    }
     return result;
   }
 
@@ -27787,7 +28391,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(Position.canParse(position, reporter))) {
+        if (!Position.canParse(position, reporter)) {
           reporter.reportError('must be of type Position');
           return false;
         }
@@ -27805,13 +28409,25 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(TextDocumentIdentifier.canParse(textDocument, reporter))) {
+        if (!TextDocumentIdentifier.canParse(textDocument, reporter)) {
           reporter.reportError('must be of type TextDocumentIdentifier');
           return false;
         }
       } finally {
         reporter.pop();
       }
+      reporter.push('workDoneToken');
+      try {
+        final workDoneToken = obj['workDoneToken'];
+        if (workDoneToken != null &&
+            workDoneToken is! int &&
+            workDoneToken is! String) {
+          reporter.reportError('must be of type Either2<int, String>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       return true;
     } else {
       reporter.reportError('must be of type PrepareRenameParams');
@@ -27825,6 +28441,7 @@
         other.runtimeType == PrepareRenameParams) {
       return position == other.position &&
           textDocument == other.textDocument &&
+          workDoneToken == other.workDoneToken &&
           true;
     }
     return false;
@@ -27834,6 +28451,7 @@
   int get hashCode => Object.hash(
         position,
         textDocument,
+        workDoneToken,
       );
 
   @override
@@ -27850,10 +28468,11 @@
     return obj is int;
   }
 
-  /// The client's default behavior is to select the identifier according the to
+  /// The client's default behavior is to select the identifier according to the
   /// language's syntax rule.
   static const Identifier = PrepareSupportDefaultBehavior(1);
 
+  @override
   Object toJson() => _value;
 
   @override
@@ -27862,6 +28481,7 @@
   @override
   int get hashCode => _value.hashCode;
 
+  @override
   bool operator ==(Object other) =>
       other is PrepareSupportDefaultBehavior && other._value == _value;
 }
@@ -27895,6 +28515,7 @@
   /// The value of the previous result id.
   final String value;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['uri'] = uri;
@@ -27915,7 +28536,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(uri is String)) {
+        if (uri is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -27933,7 +28554,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(value is String)) {
+        if (value is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -27996,6 +28617,7 @@
   /// The progress data.
   final Object? value;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['token'] = token;
@@ -28016,7 +28638,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!((token is int || token is String))) {
+        if (token is! int && token is! String) {
           reporter.reportError('must be of type Either2<int, String>');
           return false;
         }
@@ -28108,6 +28730,7 @@
   ///  @since 3.15.0
   final bool? versionSupport;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (codeDescriptionSupport != null) {
@@ -28133,8 +28756,7 @@
       reporter.push('codeDescriptionSupport');
       try {
         final codeDescriptionSupport = obj['codeDescriptionSupport'];
-        if (codeDescriptionSupport != null &&
-            !(codeDescriptionSupport is bool)) {
+        if (codeDescriptionSupport != null && codeDescriptionSupport is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -28144,7 +28766,7 @@
       reporter.push('dataSupport');
       try {
         final dataSupport = obj['dataSupport'];
-        if (dataSupport != null && !(dataSupport is bool)) {
+        if (dataSupport != null && dataSupport is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -28154,7 +28776,7 @@
       reporter.push('relatedInformation');
       try {
         final relatedInformation = obj['relatedInformation'];
-        if (relatedInformation != null && !(relatedInformation is bool)) {
+        if (relatedInformation != null && relatedInformation is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -28165,8 +28787,8 @@
       try {
         final tagSupport = obj['tagSupport'];
         if (tagSupport != null &&
-            !(PublishDiagnosticsClientCapabilitiesTagSupport.canParse(
-                tagSupport, reporter))) {
+            !PublishDiagnosticsClientCapabilitiesTagSupport.canParse(
+                tagSupport, reporter)) {
           reporter.reportError(
               'must be of type PublishDiagnosticsClientCapabilitiesTagSupport');
           return false;
@@ -28177,7 +28799,7 @@
       reporter.push('versionSupport');
       try {
         final versionSupport = obj['versionSupport'];
-        if (versionSupport != null && !(versionSupport is bool)) {
+        if (versionSupport != null && versionSupport is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -28242,6 +28864,7 @@
   /// The tags supported by the client.
   final List<DiagnosticTag> valueSet;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['valueSet'] = valueSet.map((item) => item.toJson()).toList();
@@ -28261,9 +28884,8 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!((valueSet is List<Object?> &&
-            (valueSet
-                .every((item) => DiagnosticTag.canParse(item, reporter)))))) {
+        if (valueSet is! List<Object?> ||
+            valueSet.any((item) => !DiagnosticTag.canParse(item, reporter))) {
           reporter.reportError('must be of type List<DiagnosticTag>');
           return false;
         }
@@ -28334,6 +28956,7 @@
   ///  @since 3.15.0
   final int? version;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['diagnostics'] = diagnostics.map((item) => item.toJson()).toList();
@@ -28357,9 +28980,8 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!((diagnostics is List<Object?> &&
-            (diagnostics
-                .every((item) => Diagnostic.canParse(item, reporter)))))) {
+        if (diagnostics is! List<Object?> ||
+            diagnostics.any((item) => !Diagnostic.canParse(item, reporter))) {
           reporter.reportError('must be of type List<Diagnostic>');
           return false;
         }
@@ -28377,7 +28999,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(uri is String)) {
+        if (uri is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -28387,7 +29009,7 @@
       reporter.push('version');
       try {
         final version = obj['version'];
-        if (version != null && !(version is int)) {
+        if (version != null && version is! int) {
           reporter.reportError('must be of type int');
           return false;
         }
@@ -28452,6 +29074,7 @@
   /// The range's start position.
   final Position start;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['end'] = end.toJson();
@@ -28472,7 +29095,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(Position.canParse(end, reporter))) {
+        if (!Position.canParse(end, reporter)) {
           reporter.reportError('must be of type Position');
           return false;
         }
@@ -28490,7 +29113,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(Position.canParse(start, reporter))) {
+        if (!Position.canParse(start, reporter)) {
           reporter.reportError('must be of type Position');
           return false;
         }
@@ -28542,6 +29165,7 @@
   /// Whether references supports dynamic registration.
   final bool? dynamicRegistration;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (dynamicRegistration != null) {
@@ -28555,7 +29179,7 @@
       reporter.push('dynamicRegistration');
       try {
         final dynamicRegistration = obj['dynamicRegistration'];
-        if (dynamicRegistration != null && !(dynamicRegistration is bool)) {
+        if (dynamicRegistration != null && dynamicRegistration is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -28605,6 +29229,7 @@
   /// Include the declaration of the current symbol.
   final bool includeDeclaration;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['includeDeclaration'] = includeDeclaration;
@@ -28624,7 +29249,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(includeDeclaration is bool)) {
+        if (includeDeclaration is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -28673,8 +29298,10 @@
     );
   }
 
+  @override
   final bool? workDoneProgress;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (workDoneProgress != null) {
@@ -28688,7 +29315,7 @@
       reporter.push('workDoneProgress');
       try {
         final workDoneProgress = obj['workDoneProgress'];
-        if (workDoneProgress != null && !(workDoneProgress is bool)) {
+        if (workDoneProgress != null && workDoneProgress is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -28773,17 +29400,22 @@
 
   /// An optional token that a server can use to report partial results (e.g.
   /// streaming) to the client.
+  @override
   final Either2<int, String>? partialResultToken;
 
   /// The position inside the text document.
+  @override
   final Position position;
 
   /// The text document.
+  @override
   final TextDocumentIdentifier textDocument;
 
   /// An optional token that a server can use to report work done progress.
+  @override
   final Either2<int, String>? workDoneToken;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['context'] = context.toJson();
@@ -28811,7 +29443,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(ReferenceContext.canParse(context, reporter))) {
+        if (!ReferenceContext.canParse(context, reporter)) {
           reporter.reportError('must be of type ReferenceContext');
           return false;
         }
@@ -28822,7 +29454,8 @@
       try {
         final partialResultToken = obj['partialResultToken'];
         if (partialResultToken != null &&
-            !((partialResultToken is int || partialResultToken is String))) {
+            partialResultToken is! int &&
+            partialResultToken is! String) {
           reporter.reportError('must be of type Either2<int, String>');
           return false;
         }
@@ -28840,7 +29473,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(Position.canParse(position, reporter))) {
+        if (!Position.canParse(position, reporter)) {
           reporter.reportError('must be of type Position');
           return false;
         }
@@ -28858,7 +29491,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(TextDocumentIdentifier.canParse(textDocument, reporter))) {
+        if (!TextDocumentIdentifier.canParse(textDocument, reporter)) {
           reporter.reportError('must be of type TextDocumentIdentifier');
           return false;
         }
@@ -28869,7 +29502,8 @@
       try {
         final workDoneToken = obj['workDoneToken'];
         if (workDoneToken != null &&
-            !((workDoneToken is int || workDoneToken is String))) {
+            workDoneToken is! int &&
+            workDoneToken is! String) {
           reporter.reportError('must be of type Either2<int, String>');
           return false;
         }
@@ -28923,8 +29557,8 @@
   static ReferenceRegistrationOptions fromJson(Map<String, Object?> json) {
     final documentSelectorJson = json['documentSelector'];
     final documentSelector = (documentSelectorJson as List<Object?>?)
-        ?.map(
-            (item) => TextDocumentFilter.fromJson(item as Map<String, Object?>))
+        ?.map((item) =>
+            TextDocumentFilterWithScheme.fromJson(item as Map<String, Object?>))
         .toList();
     final workDoneProgressJson = json['workDoneProgress'];
     final workDoneProgress = workDoneProgressJson as bool?;
@@ -28936,9 +29570,12 @@
 
   /// A document selector to identify the scope of the registration. If set to
   /// null the document selector provided on the client side will be used.
-  final List<TextDocumentFilter>? documentSelector;
+  @override
+  final List<TextDocumentFilterWithScheme>? documentSelector;
+  @override
   final bool? workDoneProgress;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['documentSelector'] = documentSelector;
@@ -28958,10 +29595,11 @@
         }
         final documentSelector = obj['documentSelector'];
         if (documentSelector != null &&
-            !((documentSelector is List<Object?> &&
-                (documentSelector.every(
-                    (item) => TextDocumentFilter.canParse(item, reporter)))))) {
-          reporter.reportError('must be of type List<TextDocumentFilter>');
+            (documentSelector is! List<Object?> ||
+                documentSelector.any((item) =>
+                    !TextDocumentFilterWithScheme.canParse(item, reporter)))) {
+          reporter.reportError(
+              'must be of type List<TextDocumentFilterWithScheme>');
           return false;
         }
       } finally {
@@ -28970,7 +29608,7 @@
       reporter.push('workDoneProgress');
       try {
         final workDoneProgress = obj['workDoneProgress'];
-        if (workDoneProgress != null && !(workDoneProgress is bool)) {
+        if (workDoneProgress != null && workDoneProgress is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -28988,8 +29626,12 @@
   bool operator ==(Object other) {
     if (other is ReferenceRegistrationOptions &&
         other.runtimeType == ReferenceRegistrationOptions) {
-      return listEqual(documentSelector, other.documentSelector,
-              (TextDocumentFilter a, TextDocumentFilter b) => a == b) &&
+      return listEqual(
+              documentSelector,
+              other.documentSelector,
+              (TextDocumentFilterWithScheme a,
+                      TextDocumentFilterWithScheme b) =>
+                  a == b) &&
           workDoneProgress == other.workDoneProgress &&
           true;
     }
@@ -29042,6 +29684,7 @@
   /// Options necessary for the registration.
   final Object? registerOptions;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['id'] = id;
@@ -29065,7 +29708,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(id is String)) {
+        if (id is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -29083,7 +29726,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(method is String)) {
+        if (method is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -29140,6 +29783,7 @@
 
   final List<Registration> registrations;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['registrations'] =
@@ -29160,9 +29804,9 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!((registrations is List<Object?> &&
-            (registrations
-                .every((item) => Registration.canParse(item, reporter)))))) {
+        if (registrations is! List<Object?> ||
+            registrations
+                .any((item) => !Registration.canParse(item, reporter))) {
           reporter.reportError('must be of type List<Registration>');
           return false;
         }
@@ -29223,6 +29867,7 @@
   /// The engine's version.
   final String? version;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['engine'] = engine;
@@ -29245,7 +29890,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(engine is String)) {
+        if (engine is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -29255,7 +29900,7 @@
       reporter.push('version');
       try {
         final version = obj['version'];
-        if (version != null && !(version is String)) {
+        if (version != null && version is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -29341,9 +29986,11 @@
   }
 
   /// The actual items.
+  @override
   final List<Diagnostic> items;
 
   /// A full document diagnostic report.
+  @override
   final String kind;
 
   /// Diagnostics of related documents. This information is useful in
@@ -29359,8 +30006,10 @@
 
   /// An optional result id. If provided it will be sent on the next diagnostic
   /// request for the same document.
+  @override
   final String? resultId;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['items'] = items.map((item) => item.toJson()).toList();
@@ -29387,8 +30036,8 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!((items is List<Object?> &&
-            (items.every((item) => Diagnostic.canParse(item, reporter)))))) {
+        if (items is! List<Object?> ||
+            items.any((item) => !Diagnostic.canParse(item, reporter))) {
           reporter.reportError('must be of type List<Diagnostic>');
           return false;
         }
@@ -29406,7 +30055,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(kind == 'full')) {
+        if (kind != 'full') {
           reporter.reportError('must be the literal \'full\'');
           return false;
         }
@@ -29417,14 +30066,14 @@
       try {
         final relatedDocuments = obj['relatedDocuments'];
         if (relatedDocuments != null &&
-            !((relatedDocuments is Map &&
-                (relatedDocuments.keys.every((item) =>
-                    item is String &&
-                    relatedDocuments.values.every((item) =>
-                        (FullDocumentDiagnosticReport.canParse(
-                                item, reporter) ||
-                            UnchangedDocumentDiagnosticReport.canParse(
-                                item, reporter)))))))) {
+            (relatedDocuments is! Map ||
+                (relatedDocuments.keys.any((item) =>
+                    item is! String ||
+                    relatedDocuments.values.any((item) =>
+                        !FullDocumentDiagnosticReport.canParse(
+                            item, reporter) &&
+                        !UnchangedDocumentDiagnosticReport.canParse(
+                            item, reporter)))))) {
           reporter.reportError(
               'must be of type Map<String, Either2<FullDocumentDiagnosticReport, UnchangedDocumentDiagnosticReport>>');
           return false;
@@ -29435,7 +30084,7 @@
       reporter.push('resultId');
       try {
         final resultId = obj['resultId'];
-        if (resultId != null && !(resultId is String)) {
+        if (resultId != null && resultId is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -29532,6 +30181,7 @@
 
   /// A document diagnostic report indicating no changes to the last result. A
   /// server can only return `unchanged` if result ids are provided.
+  @override
   final String kind;
 
   /// Diagnostics of related documents. This information is useful in
@@ -29547,8 +30197,10 @@
 
   /// A result id which will be sent on the next diagnostic request for the same
   /// document.
+  @override
   final String resultId;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['kind'] = kind;
@@ -29572,7 +30224,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(kind == 'unchanged')) {
+        if (kind != 'unchanged') {
           reporter.reportError('must be the literal \'unchanged\'');
           return false;
         }
@@ -29583,14 +30235,14 @@
       try {
         final relatedDocuments = obj['relatedDocuments'];
         if (relatedDocuments != null &&
-            !((relatedDocuments is Map &&
-                (relatedDocuments.keys.every((item) =>
-                    item is String &&
-                    relatedDocuments.values.every((item) =>
-                        (FullDocumentDiagnosticReport.canParse(
-                                item, reporter) ||
-                            UnchangedDocumentDiagnosticReport.canParse(
-                                item, reporter)))))))) {
+            (relatedDocuments is! Map ||
+                (relatedDocuments.keys.any((item) =>
+                    item is! String ||
+                    relatedDocuments.values.any((item) =>
+                        !FullDocumentDiagnosticReport.canParse(
+                            item, reporter) &&
+                        !UnchangedDocumentDiagnosticReport.canParse(
+                            item, reporter)))))) {
           reporter.reportError(
               'must be of type Map<String, Either2<FullDocumentDiagnosticReport, UnchangedDocumentDiagnosticReport>>');
           return false;
@@ -29609,7 +30261,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(resultId is String)) {
+        if (resultId is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -29693,6 +30345,7 @@
   /// The actual glob pattern;
   final String pattern;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['baseUri'] = baseUri;
@@ -29713,8 +30366,8 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!((baseUri is String ||
-            WorkspaceFolder.canParse(baseUri, reporter)))) {
+        if (baseUri is! String &&
+            !WorkspaceFolder.canParse(baseUri, reporter)) {
           reporter
               .reportError('must be of type Either2<String, WorkspaceFolder>');
           return false;
@@ -29733,7 +30386,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(pattern is String)) {
+        if (pattern is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -29821,6 +30474,7 @@
   ///  @since version 3.16.0
   final PrepareSupportDefaultBehavior? prepareSupportDefaultBehavior;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (dynamicRegistration != null) {
@@ -29844,7 +30498,7 @@
       reporter.push('dynamicRegistration');
       try {
         final dynamicRegistration = obj['dynamicRegistration'];
-        if (dynamicRegistration != null && !(dynamicRegistration is bool)) {
+        if (dynamicRegistration != null && dynamicRegistration is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -29855,7 +30509,7 @@
       try {
         final honorsChangeAnnotations = obj['honorsChangeAnnotations'];
         if (honorsChangeAnnotations != null &&
-            !(honorsChangeAnnotations is bool)) {
+            honorsChangeAnnotations is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -29865,7 +30519,7 @@
       reporter.push('prepareSupport');
       try {
         final prepareSupport = obj['prepareSupport'];
-        if (prepareSupport != null && !(prepareSupport is bool)) {
+        if (prepareSupport != null && prepareSupport is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -29877,8 +30531,8 @@
         final prepareSupportDefaultBehavior =
             obj['prepareSupportDefaultBehavior'];
         if (prepareSupportDefaultBehavior != null &&
-            !(PrepareSupportDefaultBehavior.canParse(
-                prepareSupportDefaultBehavior, reporter))) {
+            !PrepareSupportDefaultBehavior.canParse(
+                prepareSupportDefaultBehavior, reporter)) {
           reporter.reportError('must be of type PrepareSupportDefaultBehavior');
           return false;
         }
@@ -29974,6 +30628,7 @@
   /// Rename options.
   final RenameFileOptions? options;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (annotationId != null) {
@@ -29993,7 +30648,7 @@
       reporter.push('annotationId');
       try {
         final annotationId = obj['annotationId'];
-        if (annotationId != null && !(annotationId is String)) {
+        if (annotationId != null && annotationId is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -30011,7 +30666,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(kind == 'rename')) {
+        if (kind != 'rename') {
           reporter.reportError('must be the literal \'rename\'');
           return false;
         }
@@ -30029,7 +30684,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(newUri is String)) {
+        if (newUri is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -30047,7 +30702,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(oldUri is String)) {
+        if (oldUri is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -30057,8 +30712,7 @@
       reporter.push('options');
       try {
         final options = obj['options'];
-        if (options != null &&
-            !(RenameFileOptions.canParse(options, reporter))) {
+        if (options != null && !RenameFileOptions.canParse(options, reporter)) {
           reporter.reportError('must be of type RenameFileOptions');
           return false;
         }
@@ -30126,6 +30780,7 @@
   /// Overwrite target if existing. Overwrite wins over `ignoreIfExists`
   final bool? overwrite;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (ignoreIfExists != null) {
@@ -30142,7 +30797,7 @@
       reporter.push('ignoreIfExists');
       try {
         final ignoreIfExists = obj['ignoreIfExists'];
-        if (ignoreIfExists != null && !(ignoreIfExists is bool)) {
+        if (ignoreIfExists != null && ignoreIfExists is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -30152,7 +30807,7 @@
       reporter.push('overwrite');
       try {
         final overwrite = obj['overwrite'];
-        if (overwrite != null && !(overwrite is bool)) {
+        if (overwrite != null && overwrite is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -30212,6 +30867,7 @@
   /// renamed, only the folder will be included, and not its children.
   final List<FileRename> files;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['files'] = files.map((item) => item.toJson()).toList();
@@ -30231,8 +30887,8 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!((files is List<Object?> &&
-            (files.every((item) => FileRename.canParse(item, reporter)))))) {
+        if (files is! List<Object?> ||
+            files.any((item) => !FileRename.canParse(item, reporter))) {
           reporter.reportError('must be of type List<FileRename>');
           return false;
         }
@@ -30289,8 +30945,10 @@
 
   /// Renames should be checked and tested before being executed.
   final bool? prepareProvider;
+  @override
   final bool? workDoneProgress;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (prepareProvider != null) {
@@ -30307,7 +30965,7 @@
       reporter.push('prepareProvider');
       try {
         final prepareProvider = obj['prepareProvider'];
-        if (prepareProvider != null && !(prepareProvider is bool)) {
+        if (prepareProvider != null && prepareProvider is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -30317,7 +30975,7 @@
       reporter.push('workDoneProgress');
       try {
         final workDoneProgress = obj['workDoneProgress'];
-        if (workDoneProgress != null && !(workDoneProgress is bool)) {
+        if (workDoneProgress != null && workDoneProgress is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -30393,14 +31051,18 @@
   final String newName;
 
   /// The position inside the text document.
+  @override
   final Position position;
 
   /// The text document.
+  @override
   final TextDocumentIdentifier textDocument;
 
   /// An optional token that a server can use to report work done progress.
+  @override
   final Either2<int, String>? workDoneToken;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['newName'] = newName;
@@ -30425,7 +31087,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(newName is String)) {
+        if (newName is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -30443,7 +31105,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(Position.canParse(position, reporter))) {
+        if (!Position.canParse(position, reporter)) {
           reporter.reportError('must be of type Position');
           return false;
         }
@@ -30461,7 +31123,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(TextDocumentIdentifier.canParse(textDocument, reporter))) {
+        if (!TextDocumentIdentifier.canParse(textDocument, reporter)) {
           reporter.reportError('must be of type TextDocumentIdentifier');
           return false;
         }
@@ -30472,7 +31134,8 @@
       try {
         final workDoneToken = obj['workDoneToken'];
         if (workDoneToken != null &&
-            !((workDoneToken is int || workDoneToken is String))) {
+            workDoneToken is! int &&
+            workDoneToken is! String) {
           reporter.reportError('must be of type Either2<int, String>');
           return false;
         }
@@ -30525,8 +31188,8 @@
   static RenameRegistrationOptions fromJson(Map<String, Object?> json) {
     final documentSelectorJson = json['documentSelector'];
     final documentSelector = (documentSelectorJson as List<Object?>?)
-        ?.map(
-            (item) => TextDocumentFilter.fromJson(item as Map<String, Object?>))
+        ?.map((item) =>
+            TextDocumentFilterWithScheme.fromJson(item as Map<String, Object?>))
         .toList();
     final prepareProviderJson = json['prepareProvider'];
     final prepareProvider = prepareProviderJson as bool?;
@@ -30541,12 +31204,16 @@
 
   /// A document selector to identify the scope of the registration. If set to
   /// null the document selector provided on the client side will be used.
-  final List<TextDocumentFilter>? documentSelector;
+  @override
+  final List<TextDocumentFilterWithScheme>? documentSelector;
 
   /// Renames should be checked and tested before being executed.
+  @override
   final bool? prepareProvider;
+  @override
   final bool? workDoneProgress;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['documentSelector'] = documentSelector;
@@ -30569,10 +31236,11 @@
         }
         final documentSelector = obj['documentSelector'];
         if (documentSelector != null &&
-            !((documentSelector is List<Object?> &&
-                (documentSelector.every(
-                    (item) => TextDocumentFilter.canParse(item, reporter)))))) {
-          reporter.reportError('must be of type List<TextDocumentFilter>');
+            (documentSelector is! List<Object?> ||
+                documentSelector.any((item) =>
+                    !TextDocumentFilterWithScheme.canParse(item, reporter)))) {
+          reporter.reportError(
+              'must be of type List<TextDocumentFilterWithScheme>');
           return false;
         }
       } finally {
@@ -30581,7 +31249,7 @@
       reporter.push('prepareProvider');
       try {
         final prepareProvider = obj['prepareProvider'];
-        if (prepareProvider != null && !(prepareProvider is bool)) {
+        if (prepareProvider != null && prepareProvider is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -30591,7 +31259,7 @@
       reporter.push('workDoneProgress');
       try {
         final workDoneProgress = obj['workDoneProgress'];
-        if (workDoneProgress != null && !(workDoneProgress is bool)) {
+        if (workDoneProgress != null && workDoneProgress is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -30609,8 +31277,12 @@
   bool operator ==(Object other) {
     if (other is RenameRegistrationOptions &&
         other.runtimeType == RenameRegistrationOptions) {
-      return listEqual(documentSelector, other.documentSelector,
-              (TextDocumentFilter a, TextDocumentFilter b) => a == b) &&
+      return listEqual(
+              documentSelector,
+              other.documentSelector,
+              (TextDocumentFilterWithScheme a,
+                      TextDocumentFilterWithScheme b) =>
+                  a == b) &&
           prepareProvider == other.prepareProvider &&
           workDoneProgress == other.workDoneProgress &&
           true;
@@ -30654,6 +31326,7 @@
   /// Supports renaming existing files and folders.
   static const Rename = ResourceOperationKind._('rename');
 
+  @override
   Object toJson() => _value;
 
   @override
@@ -30662,6 +31335,7 @@
   @override
   int get hashCode => _value.hashCode;
 
+  @override
   bool operator ==(Object other) =>
       other is ResourceOperationKind && other._value == _value;
 }
@@ -30686,6 +31360,7 @@
   /// The client is supposed to include the content on save.
   final bool? includeText;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (includeText != null) {
@@ -30699,7 +31374,7 @@
       reporter.push('includeText');
       try {
         final includeText = obj['includeText'];
-        if (includeText != null && !(includeText is bool)) {
+        if (includeText != null && includeText is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -30758,6 +31433,7 @@
   /// The range ([Range]) of this selection range.
   final Range range;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (parent != null) {
@@ -30772,7 +31448,7 @@
       reporter.push('parent');
       try {
         final parent = obj['parent'];
-        if (parent != null && !(SelectionRange.canParse(parent, reporter))) {
+        if (parent != null && !SelectionRange.canParse(parent, reporter)) {
           reporter.reportError('must be of type SelectionRange');
           return false;
         }
@@ -30790,7 +31466,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(Range.canParse(range, reporter))) {
+        if (!Range.canParse(range, reporter)) {
           reporter.reportError('must be of type Range');
           return false;
         }
@@ -30845,6 +31521,7 @@
   /// server capability as well.
   final bool? dynamicRegistration;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (dynamicRegistration != null) {
@@ -30858,7 +31535,7 @@
       reporter.push('dynamicRegistration');
       try {
         final dynamicRegistration = obj['dynamicRegistration'];
-        if (dynamicRegistration != null && !(dynamicRegistration is bool)) {
+        if (dynamicRegistration != null && dynamicRegistration is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -30908,8 +31585,10 @@
     );
   }
 
+  @override
   final bool? workDoneProgress;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (workDoneProgress != null) {
@@ -30923,7 +31602,7 @@
       reporter.push('workDoneProgress');
       try {
         final workDoneProgress = obj['workDoneProgress'];
-        if (workDoneProgress != null && !(workDoneProgress is bool)) {
+        if (workDoneProgress != null && workDoneProgress is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -31000,6 +31679,7 @@
 
   /// An optional token that a server can use to report partial results (e.g.
   /// streaming) to the client.
+  @override
   final Either2<int, String>? partialResultToken;
 
   /// The positions inside the text document.
@@ -31009,8 +31689,10 @@
   final TextDocumentIdentifier textDocument;
 
   /// An optional token that a server can use to report work done progress.
+  @override
   final Either2<int, String>? workDoneToken;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (partialResultToken != null) {
@@ -31030,7 +31712,8 @@
       try {
         final partialResultToken = obj['partialResultToken'];
         if (partialResultToken != null &&
-            !((partialResultToken is int || partialResultToken is String))) {
+            partialResultToken is! int &&
+            partialResultToken is! String) {
           reporter.reportError('must be of type Either2<int, String>');
           return false;
         }
@@ -31048,8 +31731,8 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!((positions is List<Object?> &&
-            (positions.every((item) => Position.canParse(item, reporter)))))) {
+        if (positions is! List<Object?> ||
+            positions.any((item) => !Position.canParse(item, reporter))) {
           reporter.reportError('must be of type List<Position>');
           return false;
         }
@@ -31067,7 +31750,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(TextDocumentIdentifier.canParse(textDocument, reporter))) {
+        if (!TextDocumentIdentifier.canParse(textDocument, reporter)) {
           reporter.reportError('must be of type TextDocumentIdentifier');
           return false;
         }
@@ -31078,7 +31761,8 @@
       try {
         final workDoneToken = obj['workDoneToken'];
         if (workDoneToken != null &&
-            !((workDoneToken is int || workDoneToken is String))) {
+            workDoneToken is! int &&
+            workDoneToken is! String) {
           reporter.reportError('must be of type Either2<int, String>');
           return false;
         }
@@ -31137,8 +31821,8 @@
   static SelectionRangeRegistrationOptions fromJson(Map<String, Object?> json) {
     final documentSelectorJson = json['documentSelector'];
     final documentSelector = (documentSelectorJson as List<Object?>?)
-        ?.map(
-            (item) => TextDocumentFilter.fromJson(item as Map<String, Object?>))
+        ?.map((item) =>
+            TextDocumentFilterWithScheme.fromJson(item as Map<String, Object?>))
         .toList();
     final idJson = json['id'];
     final id = idJson as String?;
@@ -31153,13 +31837,17 @@
 
   /// A document selector to identify the scope of the registration. If set to
   /// null the document selector provided on the client side will be used.
-  final List<TextDocumentFilter>? documentSelector;
+  @override
+  final List<TextDocumentFilterWithScheme>? documentSelector;
 
   /// The id used to register the request. The id can be used to deregister the
   /// request again. See also Registration#id.
+  @override
   final String? id;
+  @override
   final bool? workDoneProgress;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['documentSelector'] = documentSelector;
@@ -31182,10 +31870,11 @@
         }
         final documentSelector = obj['documentSelector'];
         if (documentSelector != null &&
-            !((documentSelector is List<Object?> &&
-                (documentSelector.every(
-                    (item) => TextDocumentFilter.canParse(item, reporter)))))) {
-          reporter.reportError('must be of type List<TextDocumentFilter>');
+            (documentSelector is! List<Object?> ||
+                documentSelector.any((item) =>
+                    !TextDocumentFilterWithScheme.canParse(item, reporter)))) {
+          reporter.reportError(
+              'must be of type List<TextDocumentFilterWithScheme>');
           return false;
         }
       } finally {
@@ -31194,7 +31883,7 @@
       reporter.push('id');
       try {
         final id = obj['id'];
-        if (id != null && !(id is String)) {
+        if (id != null && id is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -31204,7 +31893,7 @@
       reporter.push('workDoneProgress');
       try {
         final workDoneProgress = obj['workDoneProgress'];
-        if (workDoneProgress != null && !(workDoneProgress is bool)) {
+        if (workDoneProgress != null && workDoneProgress is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -31222,8 +31911,12 @@
   bool operator ==(Object other) {
     if (other is SelectionRangeRegistrationOptions &&
         other.runtimeType == SelectionRangeRegistrationOptions) {
-      return listEqual(documentSelector, other.documentSelector,
-              (TextDocumentFilter a, TextDocumentFilter b) => a == b) &&
+      return listEqual(
+              documentSelector,
+              other.documentSelector,
+              (TextDocumentFilterWithScheme a,
+                      TextDocumentFilterWithScheme b) =>
+                  a == b) &&
           id == other.id &&
           workDoneProgress == other.workDoneProgress &&
           true;
@@ -31263,6 +31956,7 @@
   static const readonly = SemanticTokenModifiers('readonly');
   static const static = SemanticTokenModifiers('static');
 
+  @override
   Object toJson() => _value;
 
   @override
@@ -31271,6 +31965,7 @@
   @override
   int get hashCode => _value.hashCode;
 
+  @override
   bool operator ==(Object other) =>
       other is SemanticTokenModifiers && other._value == _value;
 }
@@ -31287,6 +31982,9 @@
 
   static const class_ = SemanticTokenTypes('class');
   static const comment = SemanticTokenTypes('comment');
+
+  /// @since 3.17.0
+  static const decorator = SemanticTokenTypes('decorator');
   static const enum_ = SemanticTokenTypes('enum');
   static const enumMember = SemanticTokenTypes('enumMember');
   static const event = SemanticTokenTypes('event');
@@ -31311,6 +32009,7 @@
   static const typeParameter = SemanticTokenTypes('typeParameter');
   static const variable = SemanticTokenTypes('variable');
 
+  @override
   Object toJson() => _value;
 
   @override
@@ -31319,6 +32018,7 @@
   @override
   int get hashCode => _value.hashCode;
 
+  @override
   bool operator ==(Object other) =>
       other is SemanticTokenTypes && other._value == _value;
 }
@@ -31354,6 +32054,7 @@
   /// a delta.
   final String? resultId;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['data'] = data;
@@ -31376,7 +32077,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!((data is List<Object?> && (data.every((item) => item is int))))) {
+        if (data is! List<Object?> || data.any((item) => item is! int)) {
           reporter.reportError('must be of type List<int>');
           return false;
         }
@@ -31386,7 +32087,7 @@
       reporter.push('resultId');
       try {
         final resultId = obj['resultId'];
-        if (resultId != null && !(resultId is String)) {
+        if (resultId != null && resultId is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -31522,6 +32223,7 @@
   /// The token types that the client supports.
   final List<String> tokenTypes;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (augmentsSyntaxTokens != null) {
@@ -31551,7 +32253,7 @@
       reporter.push('augmentsSyntaxTokens');
       try {
         final augmentsSyntaxTokens = obj['augmentsSyntaxTokens'];
-        if (augmentsSyntaxTokens != null && !(augmentsSyntaxTokens is bool)) {
+        if (augmentsSyntaxTokens != null && augmentsSyntaxTokens is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -31561,7 +32263,7 @@
       reporter.push('dynamicRegistration');
       try {
         final dynamicRegistration = obj['dynamicRegistration'];
-        if (dynamicRegistration != null && !(dynamicRegistration is bool)) {
+        if (dynamicRegistration != null && dynamicRegistration is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -31579,8 +32281,8 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!((formats is List<Object?> &&
-            (formats.every((item) => TokenFormat.canParse(item, reporter)))))) {
+        if (formats is! List<Object?> ||
+            formats.any((item) => !TokenFormat.canParse(item, reporter))) {
           reporter.reportError('must be of type List<TokenFormat>');
           return false;
         }
@@ -31590,7 +32292,7 @@
       reporter.push('multilineTokenSupport');
       try {
         final multilineTokenSupport = obj['multilineTokenSupport'];
-        if (multilineTokenSupport != null && !(multilineTokenSupport is bool)) {
+        if (multilineTokenSupport != null && multilineTokenSupport is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -31601,7 +32303,7 @@
       try {
         final overlappingTokenSupport = obj['overlappingTokenSupport'];
         if (overlappingTokenSupport != null &&
-            !(overlappingTokenSupport is bool)) {
+            overlappingTokenSupport is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -31619,8 +32321,8 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(SemanticTokensClientCapabilitiesRequests.canParse(
-            requests, reporter))) {
+        if (!SemanticTokensClientCapabilitiesRequests.canParse(
+            requests, reporter)) {
           reporter.reportError(
               'must be of type SemanticTokensClientCapabilitiesRequests');
           return false;
@@ -31631,7 +32333,7 @@
       reporter.push('serverCancelSupport');
       try {
         final serverCancelSupport = obj['serverCancelSupport'];
-        if (serverCancelSupport != null && !(serverCancelSupport is bool)) {
+        if (serverCancelSupport != null && serverCancelSupport is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -31649,8 +32351,8 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!((tokenModifiers is List<Object?> &&
-            (tokenModifiers.every((item) => item is String))))) {
+        if (tokenModifiers is! List<Object?> ||
+            tokenModifiers.any((item) => item is! String)) {
           reporter.reportError('must be of type List<String>');
           return false;
         }
@@ -31668,8 +32370,8 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!((tokenTypes is List<Object?> &&
-            (tokenTypes.every((item) => item is String))))) {
+        if (tokenTypes is! List<Object?> ||
+            tokenTypes.any((item) => item is! String)) {
           reporter.reportError('must be of type List<String>');
           return false;
         }
@@ -31721,114 +32423,6 @@
   String toString() => jsonEncoder.convert(toJson());
 }
 
-class SemanticTokensClientCapabilitiesFull implements ToJsonable {
-  static const jsonHandler = LspJsonHandler(
-    SemanticTokensClientCapabilitiesFull.canParse,
-    SemanticTokensClientCapabilitiesFull.fromJson,
-  );
-
-  SemanticTokensClientCapabilitiesFull({
-    this.delta,
-  });
-  static SemanticTokensClientCapabilitiesFull fromJson(
-      Map<String, Object?> json) {
-    final deltaJson = json['delta'];
-    final delta = deltaJson as bool?;
-    return SemanticTokensClientCapabilitiesFull(
-      delta: delta,
-    );
-  }
-
-  /// The client will send the `textDocument/semanticTokens/full/delta` request
-  /// if the server provides a corresponding handler.
-  final bool? delta;
-
-  Map<String, Object?> toJson() {
-    var result = <String, Object?>{};
-    if (delta != null) {
-      result['delta'] = delta;
-    }
-    return result;
-  }
-
-  static bool canParse(Object? obj, LspJsonReporter reporter) {
-    if (obj is Map<String, Object?>) {
-      reporter.push('delta');
-      try {
-        final delta = obj['delta'];
-        if (delta != null && !(delta is bool)) {
-          reporter.reportError('must be of type bool');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      return true;
-    } else {
-      reporter
-          .reportError('must be of type SemanticTokensClientCapabilitiesFull');
-      return false;
-    }
-  }
-
-  @override
-  bool operator ==(Object other) {
-    if (other is SemanticTokensClientCapabilitiesFull &&
-        other.runtimeType == SemanticTokensClientCapabilitiesFull) {
-      return delta == other.delta && true;
-    }
-    return false;
-  }
-
-  @override
-  int get hashCode => delta.hashCode;
-
-  @override
-  String toString() => jsonEncoder.convert(toJson());
-}
-
-class SemanticTokensClientCapabilitiesRange implements ToJsonable {
-  static const jsonHandler = LspJsonHandler(
-    SemanticTokensClientCapabilitiesRange.canParse,
-    SemanticTokensClientCapabilitiesRange.fromJson,
-  );
-
-  static SemanticTokensClientCapabilitiesRange fromJson(
-      Map<String, Object?> json) {
-    return SemanticTokensClientCapabilitiesRange();
-  }
-
-  Map<String, Object?> toJson() {
-    var result = <String, Object?>{};
-    return result;
-  }
-
-  static bool canParse(Object? obj, LspJsonReporter reporter) {
-    if (obj is Map<String, Object?>) {
-      return true;
-    } else {
-      reporter
-          .reportError('must be of type SemanticTokensClientCapabilitiesRange');
-      return false;
-    }
-  }
-
-  @override
-  bool operator ==(Object other) {
-    if (other is SemanticTokensClientCapabilitiesRange &&
-        other.runtimeType == SemanticTokensClientCapabilitiesRange) {
-      return true;
-    }
-    return false;
-  }
-
-  @override
-  int get hashCode => 42;
-
-  @override
-  String toString() => jsonEncoder.convert(toJson());
-}
-
 class SemanticTokensClientCapabilitiesRequests implements ToJsonable {
   static const jsonHandler = LspJsonHandler(
     SemanticTokensClientCapabilitiesRequests.canParse,
@@ -31845,24 +32439,28 @@
     final full = fullJson == null
         ? null
         : (fullJson is bool
-            ? Either2<bool, SemanticTokensClientCapabilitiesFull>.t1(fullJson)
-            : (SemanticTokensClientCapabilitiesFull.canParse(
+            ? Either2<bool, SemanticTokensClientCapabilitiesRequestsFull>.t1(
+                fullJson)
+            : (SemanticTokensClientCapabilitiesRequestsFull.canParse(
                     fullJson, nullLspJsonReporter)
-                ? Either2<bool, SemanticTokensClientCapabilitiesFull>.t2(
-                    SemanticTokensClientCapabilitiesFull.fromJson(
+                ? Either2<bool,
+                        SemanticTokensClientCapabilitiesRequestsFull>.t2(
+                    SemanticTokensClientCapabilitiesRequestsFull.fromJson(
                         fullJson as Map<String, Object?>))
-                : (throw '''$fullJson was not one of (bool, SemanticTokensClientCapabilitiesFull)''')));
+                : (throw '''$fullJson was not one of (bool, SemanticTokensClientCapabilitiesRequestsFull)''')));
     final rangeJson = json['range'];
     final range = rangeJson == null
         ? null
         : (rangeJson is bool
-            ? Either2<bool, SemanticTokensClientCapabilitiesRange>.t1(rangeJson)
-            : (SemanticTokensClientCapabilitiesRange.canParse(
+            ? Either2<bool, SemanticTokensClientCapabilitiesRequestsRange>.t1(
+                rangeJson)
+            : (SemanticTokensClientCapabilitiesRequestsRange.canParse(
                     rangeJson, nullLspJsonReporter)
-                ? Either2<bool, SemanticTokensClientCapabilitiesRange>.t2(
-                    SemanticTokensClientCapabilitiesRange.fromJson(
+                ? Either2<bool,
+                        SemanticTokensClientCapabilitiesRequestsRange>.t2(
+                    SemanticTokensClientCapabilitiesRequestsRange.fromJson(
                         rangeJson as Map<String, Object?>))
-                : (throw '''$rangeJson was not one of (bool, SemanticTokensClientCapabilitiesRange)''')));
+                : (throw '''$rangeJson was not one of (bool, SemanticTokensClientCapabilitiesRequestsRange)''')));
     return SemanticTokensClientCapabilitiesRequests(
       full: full,
       range: range,
@@ -31871,12 +32469,13 @@
 
   /// The client will send the `textDocument/semanticTokens/full` request if the
   /// server provides a corresponding handler.
-  final Either2<bool, SemanticTokensClientCapabilitiesFull>? full;
+  final Either2<bool, SemanticTokensClientCapabilitiesRequestsFull>? full;
 
   /// The client will send the `textDocument/semanticTokens/range` request if
   /// the server provides a corresponding handler.
-  final Either2<bool, SemanticTokensClientCapabilitiesRange>? range;
+  final Either2<bool, SemanticTokensClientCapabilitiesRequestsRange>? range;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (full != null) {
@@ -31894,11 +32493,11 @@
       try {
         final full = obj['full'];
         if (full != null &&
-            !((full is bool ||
-                SemanticTokensClientCapabilitiesFull.canParse(
-                    full, reporter)))) {
+            full is! bool &&
+            !SemanticTokensClientCapabilitiesRequestsFull.canParse(
+                full, reporter)) {
           reporter.reportError(
-              'must be of type Either2<bool, SemanticTokensClientCapabilitiesFull>');
+              'must be of type Either2<bool, SemanticTokensClientCapabilitiesRequestsFull>');
           return false;
         }
       } finally {
@@ -31908,11 +32507,11 @@
       try {
         final range = obj['range'];
         if (range != null &&
-            !((range is bool ||
-                SemanticTokensClientCapabilitiesRange.canParse(
-                    range, reporter)))) {
+            range is! bool &&
+            !SemanticTokensClientCapabilitiesRequestsRange.canParse(
+                range, reporter)) {
           reporter.reportError(
-              'must be of type Either2<bool, SemanticTokensClientCapabilitiesRange>');
+              'must be of type Either2<bool, SemanticTokensClientCapabilitiesRequestsRange>');
           return false;
         }
       } finally {
@@ -31945,6 +32544,113 @@
   String toString() => jsonEncoder.convert(toJson());
 }
 
+class SemanticTokensClientCapabilitiesRequestsFull implements ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+    SemanticTokensClientCapabilitiesRequestsFull.canParse,
+    SemanticTokensClientCapabilitiesRequestsFull.fromJson,
+  );
+
+  SemanticTokensClientCapabilitiesRequestsFull({
+    this.delta,
+  });
+  static SemanticTokensClientCapabilitiesRequestsFull fromJson(
+      Map<String, Object?> json) {
+    final deltaJson = json['delta'];
+    final delta = deltaJson as bool?;
+    return SemanticTokensClientCapabilitiesRequestsFull(
+      delta: delta,
+    );
+  }
+
+  /// The client will send the `textDocument/semanticTokens/full/delta` request
+  /// if the server provides a corresponding handler.
+  final bool? delta;
+
+  @override
+  Map<String, Object?> toJson() {
+    var result = <String, Object?>{};
+    if (delta != null) {
+      result['delta'] = delta;
+    }
+    return result;
+  }
+
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
+    if (obj is Map<String, Object?>) {
+      reporter.push('delta');
+      try {
+        final delta = obj['delta'];
+        if (delta != null && delta is! bool) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError(
+          'must be of type SemanticTokensClientCapabilitiesRequestsFull');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is SemanticTokensClientCapabilitiesRequestsFull &&
+        other.runtimeType == SemanticTokensClientCapabilitiesRequestsFull) {
+      return delta == other.delta && true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode => delta.hashCode;
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+class SemanticTokensClientCapabilitiesRequestsRange implements ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+    SemanticTokensClientCapabilitiesRequestsRange.canParse,
+    SemanticTokensClientCapabilitiesRequestsRange.fromJson,
+  );
+
+  static SemanticTokensClientCapabilitiesRequestsRange fromJson(
+      Map<String, Object?> json) {
+    return SemanticTokensClientCapabilitiesRequestsRange();
+  }
+
+  @override
+  Map<String, Object?> toJson() => {};
+
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
+    if (obj is Map<String, Object?>) {
+      return true;
+    } else {
+      reporter.reportError(
+          'must be of type SemanticTokensClientCapabilitiesRequestsRange');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is SemanticTokensClientCapabilitiesRequestsRange &&
+        other.runtimeType == SemanticTokensClientCapabilitiesRequestsRange) {
+      return true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode => 42;
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
 class SemanticTokensDelta implements ToJsonable {
   static const jsonHandler = LspJsonHandler(
     SemanticTokensDelta.canParse,
@@ -31973,6 +32679,7 @@
   final List<SemanticTokensEdit> edits;
   final String? resultId;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['edits'] = edits.map((item) => item.toJson()).toList();
@@ -31995,9 +32702,8 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!((edits is List<Object?> &&
-            (edits.every(
-                (item) => SemanticTokensEdit.canParse(item, reporter)))))) {
+        if (edits is! List<Object?> ||
+            edits.any((item) => !SemanticTokensEdit.canParse(item, reporter))) {
           reporter.reportError('must be of type List<SemanticTokensEdit>');
           return false;
         }
@@ -32007,7 +32713,7 @@
       reporter.push('resultId');
       try {
         final resultId = obj['resultId'];
-        if (resultId != null && !(resultId is String)) {
+        if (resultId != null && resultId is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -32088,6 +32794,7 @@
 
   /// An optional token that a server can use to report partial results (e.g.
   /// streaming) to the client.
+  @override
   final Either2<int, String>? partialResultToken;
 
   /// The result id of a previous response. The result Id can either point to a
@@ -32098,8 +32805,10 @@
   final TextDocumentIdentifier textDocument;
 
   /// An optional token that a server can use to report work done progress.
+  @override
   final Either2<int, String>? workDoneToken;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (partialResultToken != null) {
@@ -32119,7 +32828,8 @@
       try {
         final partialResultToken = obj['partialResultToken'];
         if (partialResultToken != null &&
-            !((partialResultToken is int || partialResultToken is String))) {
+            partialResultToken is! int &&
+            partialResultToken is! String) {
           reporter.reportError('must be of type Either2<int, String>');
           return false;
         }
@@ -32137,7 +32847,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(previousResultId is String)) {
+        if (previousResultId is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -32155,7 +32865,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(TextDocumentIdentifier.canParse(textDocument, reporter))) {
+        if (!TextDocumentIdentifier.canParse(textDocument, reporter)) {
           reporter.reportError('must be of type TextDocumentIdentifier');
           return false;
         }
@@ -32166,7 +32876,8 @@
       try {
         final workDoneToken = obj['workDoneToken'];
         if (workDoneToken != null &&
-            !((workDoneToken is int || workDoneToken is String))) {
+            workDoneToken is! int &&
+            workDoneToken is! String) {
           reporter.reportError('must be of type Either2<int, String>');
           return false;
         }
@@ -32227,6 +32938,7 @@
 
   final List<SemanticTokensEdit> edits;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['edits'] = edits.map((item) => item.toJson()).toList();
@@ -32246,9 +32958,8 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!((edits is List<Object?> &&
-            (edits.every(
-                (item) => SemanticTokensEdit.canParse(item, reporter)))))) {
+        if (edits is! List<Object?> ||
+            edits.any((item) => !SemanticTokensEdit.canParse(item, reporter))) {
           reporter.reportError('must be of type List<SemanticTokensEdit>');
           return false;
         }
@@ -32315,6 +33026,7 @@
   /// The start offset of the edit.
   final int start;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (data != null) {
@@ -32331,7 +33043,7 @@
       try {
         final data = obj['data'];
         if (data != null &&
-            !((data is List<Object?> && (data.every((item) => item is int))))) {
+            (data is! List<Object?> || data.any((item) => item is! int))) {
           reporter.reportError('must be of type List<int>');
           return false;
         }
@@ -32349,7 +33061,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(deleteCount is int)) {
+        if (deleteCount is! int) {
           reporter.reportError('must be of type int');
           return false;
         }
@@ -32367,7 +33079,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(start is int)) {
+        if (start is! int) {
           reporter.reportError('must be of type int');
           return false;
         }
@@ -32435,6 +33147,7 @@
   /// The token types a server uses.
   final List<String> tokenTypes;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['tokenModifiers'] = tokenModifiers;
@@ -32455,8 +33168,8 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!((tokenModifiers is List<Object?> &&
-            (tokenModifiers.every((item) => item is String))))) {
+        if (tokenModifiers is! List<Object?> ||
+            tokenModifiers.any((item) => item is! String)) {
           reporter.reportError('must be of type List<String>');
           return false;
         }
@@ -32474,8 +33187,8 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!((tokenTypes is List<Object?> &&
-            (tokenTypes.every((item) => item is String))))) {
+        if (tokenTypes is! List<Object?> ||
+            tokenTypes.any((item) => item is! String)) {
           reporter.reportError('must be of type List<String>');
           return false;
         }
@@ -32571,8 +33284,10 @@
   /// Server supports providing semantic tokens for a specific range of a
   /// document.
   final Either2<bool, SemanticTokensOptionsRange>? range;
+  @override
   final bool? workDoneProgress;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (full != null) {
@@ -32594,8 +33309,8 @@
       try {
         final full = obj['full'];
         if (full != null &&
-            !((full is bool ||
-                SemanticTokensOptionsFull.canParse(full, reporter)))) {
+            full is! bool &&
+            !SemanticTokensOptionsFull.canParse(full, reporter)) {
           reporter.reportError(
               'must be of type Either2<bool, SemanticTokensOptionsFull>');
           return false;
@@ -32614,7 +33329,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(SemanticTokensLegend.canParse(legend, reporter))) {
+        if (!SemanticTokensLegend.canParse(legend, reporter)) {
           reporter.reportError('must be of type SemanticTokensLegend');
           return false;
         }
@@ -32625,8 +33340,8 @@
       try {
         final range = obj['range'];
         if (range != null &&
-            !((range is bool ||
-                SemanticTokensOptionsRange.canParse(range, reporter)))) {
+            range is! bool &&
+            !SemanticTokensOptionsRange.canParse(range, reporter)) {
           reporter.reportError(
               'must be of type Either2<bool, SemanticTokensOptionsRange>');
           return false;
@@ -32637,7 +33352,7 @@
       reporter.push('workDoneProgress');
       try {
         final workDoneProgress = obj['workDoneProgress'];
-        if (workDoneProgress != null && !(workDoneProgress is bool)) {
+        if (workDoneProgress != null && workDoneProgress is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -32696,6 +33411,7 @@
   /// The server supports deltas for full documents.
   final bool? delta;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (delta != null) {
@@ -32709,7 +33425,7 @@
       reporter.push('delta');
       try {
         final delta = obj['delta'];
-        if (delta != null && !(delta is bool)) {
+        if (delta != null && delta is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -32749,10 +33465,8 @@
     return SemanticTokensOptionsRange();
   }
 
-  Map<String, Object?> toJson() {
-    var result = <String, Object?>{};
-    return result;
-  }
+  @override
+  Map<String, Object?> toJson() => {};
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
@@ -32820,14 +33534,17 @@
 
   /// An optional token that a server can use to report partial results (e.g.
   /// streaming) to the client.
+  @override
   final Either2<int, String>? partialResultToken;
 
   /// The text document.
   final TextDocumentIdentifier textDocument;
 
   /// An optional token that a server can use to report work done progress.
+  @override
   final Either2<int, String>? workDoneToken;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (partialResultToken != null) {
@@ -32846,7 +33563,8 @@
       try {
         final partialResultToken = obj['partialResultToken'];
         if (partialResultToken != null &&
-            !((partialResultToken is int || partialResultToken is String))) {
+            partialResultToken is! int &&
+            partialResultToken is! String) {
           reporter.reportError('must be of type Either2<int, String>');
           return false;
         }
@@ -32864,7 +33582,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(TextDocumentIdentifier.canParse(textDocument, reporter))) {
+        if (!TextDocumentIdentifier.canParse(textDocument, reporter)) {
           reporter.reportError('must be of type TextDocumentIdentifier');
           return false;
         }
@@ -32875,7 +33593,8 @@
       try {
         final workDoneToken = obj['workDoneToken'];
         if (workDoneToken != null &&
-            !((workDoneToken is int || workDoneToken is String))) {
+            workDoneToken is! int &&
+            workDoneToken is! String) {
           reporter.reportError('must be of type Either2<int, String>');
           return false;
         }
@@ -32932,6 +33651,7 @@
 
   final List<int> data;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['data'] = data;
@@ -32951,7 +33671,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!((data is List<Object?> && (data.every((item) => item is int))))) {
+        if (data is! List<Object?> || data.any((item) => item is! int)) {
           reporter.reportError('must be of type List<int>');
           return false;
         }
@@ -33026,6 +33746,7 @@
 
   /// An optional token that a server can use to report partial results (e.g.
   /// streaming) to the client.
+  @override
   final Either2<int, String>? partialResultToken;
 
   /// The range the semantic tokens are requested for.
@@ -33035,8 +33756,10 @@
   final TextDocumentIdentifier textDocument;
 
   /// An optional token that a server can use to report work done progress.
+  @override
   final Either2<int, String>? workDoneToken;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (partialResultToken != null) {
@@ -33056,7 +33779,8 @@
       try {
         final partialResultToken = obj['partialResultToken'];
         if (partialResultToken != null &&
-            !((partialResultToken is int || partialResultToken is String))) {
+            partialResultToken is! int &&
+            partialResultToken is! String) {
           reporter.reportError('must be of type Either2<int, String>');
           return false;
         }
@@ -33074,7 +33798,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(Range.canParse(range, reporter))) {
+        if (!Range.canParse(range, reporter)) {
           reporter.reportError('must be of type Range');
           return false;
         }
@@ -33092,7 +33816,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(TextDocumentIdentifier.canParse(textDocument, reporter))) {
+        if (!TextDocumentIdentifier.canParse(textDocument, reporter)) {
           reporter.reportError('must be of type TextDocumentIdentifier');
           return false;
         }
@@ -33103,7 +33827,8 @@
       try {
         final workDoneToken = obj['workDoneToken'];
         if (workDoneToken != null &&
-            !((workDoneToken is int || workDoneToken is String))) {
+            workDoneToken is! int &&
+            workDoneToken is! String) {
           reporter.reportError('must be of type Either2<int, String>');
           return false;
         }
@@ -33164,8 +33889,8 @@
   static SemanticTokensRegistrationOptions fromJson(Map<String, Object?> json) {
     final documentSelectorJson = json['documentSelector'];
     final documentSelector = (documentSelectorJson as List<Object?>?)
-        ?.map(
-            (item) => TextDocumentFilter.fromJson(item as Map<String, Object?>))
+        ?.map((item) =>
+            TextDocumentFilterWithScheme.fromJson(item as Map<String, Object?>))
         .toList();
     final fullJson = json['full'];
     final full = fullJson == null
@@ -33207,23 +33932,30 @@
 
   /// A document selector to identify the scope of the registration. If set to
   /// null the document selector provided on the client side will be used.
-  final List<TextDocumentFilter>? documentSelector;
+  @override
+  final List<TextDocumentFilterWithScheme>? documentSelector;
 
   /// Server supports providing semantic tokens for a full document.
+  @override
   final Either2<bool, SemanticTokensOptionsFull>? full;
 
   /// The id used to register the request. The id can be used to deregister the
   /// request again. See also Registration#id.
+  @override
   final String? id;
 
   /// The legend used by the server
+  @override
   final SemanticTokensLegend legend;
 
   /// Server supports providing semantic tokens for a specific range of a
   /// document.
+  @override
   final Either2<bool, SemanticTokensOptionsRange>? range;
+  @override
   final bool? workDoneProgress;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['documentSelector'] = documentSelector;
@@ -33253,10 +33985,11 @@
         }
         final documentSelector = obj['documentSelector'];
         if (documentSelector != null &&
-            !((documentSelector is List<Object?> &&
-                (documentSelector.every(
-                    (item) => TextDocumentFilter.canParse(item, reporter)))))) {
-          reporter.reportError('must be of type List<TextDocumentFilter>');
+            (documentSelector is! List<Object?> ||
+                documentSelector.any((item) =>
+                    !TextDocumentFilterWithScheme.canParse(item, reporter)))) {
+          reporter.reportError(
+              'must be of type List<TextDocumentFilterWithScheme>');
           return false;
         }
       } finally {
@@ -33266,8 +33999,8 @@
       try {
         final full = obj['full'];
         if (full != null &&
-            !((full is bool ||
-                SemanticTokensOptionsFull.canParse(full, reporter)))) {
+            full is! bool &&
+            !SemanticTokensOptionsFull.canParse(full, reporter)) {
           reporter.reportError(
               'must be of type Either2<bool, SemanticTokensOptionsFull>');
           return false;
@@ -33278,7 +34011,7 @@
       reporter.push('id');
       try {
         final id = obj['id'];
-        if (id != null && !(id is String)) {
+        if (id != null && id is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -33296,7 +34029,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(SemanticTokensLegend.canParse(legend, reporter))) {
+        if (!SemanticTokensLegend.canParse(legend, reporter)) {
           reporter.reportError('must be of type SemanticTokensLegend');
           return false;
         }
@@ -33307,8 +34040,8 @@
       try {
         final range = obj['range'];
         if (range != null &&
-            !((range is bool ||
-                SemanticTokensOptionsRange.canParse(range, reporter)))) {
+            range is! bool &&
+            !SemanticTokensOptionsRange.canParse(range, reporter)) {
           reporter.reportError(
               'must be of type Either2<bool, SemanticTokensOptionsRange>');
           return false;
@@ -33319,7 +34052,7 @@
       reporter.push('workDoneProgress');
       try {
         final workDoneProgress = obj['workDoneProgress'];
-        if (workDoneProgress != null && !(workDoneProgress is bool)) {
+        if (workDoneProgress != null && workDoneProgress is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -33337,8 +34070,12 @@
   bool operator ==(Object other) {
     if (other is SemanticTokensRegistrationOptions &&
         other.runtimeType == SemanticTokensRegistrationOptions) {
-      return listEqual(documentSelector, other.documentSelector,
-              (TextDocumentFilter a, TextDocumentFilter b) => a == b) &&
+      return listEqual(
+              documentSelector,
+              other.documentSelector,
+              (TextDocumentFilterWithScheme a,
+                      TextDocumentFilterWithScheme b) =>
+                  a == b) &&
           full == other.full &&
           id == other.id &&
           legend == other.legend &&
@@ -33390,6 +34127,7 @@
   /// change that requires such a calculation.
   final bool? refreshSupport;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (refreshSupport != null) {
@@ -33403,7 +34141,7 @@
       reporter.push('refreshSupport');
       try {
         final refreshSupport = obj['refreshSupport'];
-        if (refreshSupport != null && !(refreshSupport is bool)) {
+        if (refreshSupport != null && refreshSupport is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -34081,6 +34819,7 @@
   /// The server provides workspace symbol support.
   final Either2<bool, WorkspaceSymbolOptions>? workspaceSymbolProvider;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (callHierarchyProvider != null) {
@@ -34199,11 +34938,10 @@
       try {
         final callHierarchyProvider = obj['callHierarchyProvider'];
         if (callHierarchyProvider != null &&
-            !((callHierarchyProvider is bool ||
-                CallHierarchyOptions.canParse(
-                    callHierarchyProvider, reporter) ||
-                CallHierarchyRegistrationOptions.canParse(
-                    callHierarchyProvider, reporter)))) {
+            callHierarchyProvider is! bool &&
+            !CallHierarchyOptions.canParse(callHierarchyProvider, reporter) &&
+            !CallHierarchyRegistrationOptions.canParse(
+                callHierarchyProvider, reporter)) {
           reporter.reportError(
               'must be of type Either3<bool, CallHierarchyOptions, CallHierarchyRegistrationOptions>');
           return false;
@@ -34215,8 +34953,8 @@
       try {
         final codeActionProvider = obj['codeActionProvider'];
         if (codeActionProvider != null &&
-            !((codeActionProvider is bool ||
-                CodeActionOptions.canParse(codeActionProvider, reporter)))) {
+            codeActionProvider is! bool &&
+            !CodeActionOptions.canParse(codeActionProvider, reporter)) {
           reporter
               .reportError('must be of type Either2<bool, CodeActionOptions>');
           return false;
@@ -34228,7 +34966,7 @@
       try {
         final codeLensProvider = obj['codeLensProvider'];
         if (codeLensProvider != null &&
-            !(CodeLensOptions.canParse(codeLensProvider, reporter))) {
+            !CodeLensOptions.canParse(codeLensProvider, reporter)) {
           reporter.reportError('must be of type CodeLensOptions');
           return false;
         }
@@ -34239,10 +34977,10 @@
       try {
         final colorProvider = obj['colorProvider'];
         if (colorProvider != null &&
-            !((colorProvider is bool ||
-                DocumentColorOptions.canParse(colorProvider, reporter) ||
-                DocumentColorRegistrationOptions.canParse(
-                    colorProvider, reporter)))) {
+            colorProvider is! bool &&
+            !DocumentColorOptions.canParse(colorProvider, reporter) &&
+            !DocumentColorRegistrationOptions.canParse(
+                colorProvider, reporter)) {
           reporter.reportError(
               'must be of type Either3<bool, DocumentColorOptions, DocumentColorRegistrationOptions>');
           return false;
@@ -34254,7 +34992,7 @@
       try {
         final completionProvider = obj['completionProvider'];
         if (completionProvider != null &&
-            !(CompletionOptions.canParse(completionProvider, reporter))) {
+            !CompletionOptions.canParse(completionProvider, reporter)) {
           reporter.reportError('must be of type CompletionOptions');
           return false;
         }
@@ -34265,10 +35003,10 @@
       try {
         final declarationProvider = obj['declarationProvider'];
         if (declarationProvider != null &&
-            !((declarationProvider is bool ||
-                DeclarationOptions.canParse(declarationProvider, reporter) ||
-                DeclarationRegistrationOptions.canParse(
-                    declarationProvider, reporter)))) {
+            declarationProvider is! bool &&
+            !DeclarationOptions.canParse(declarationProvider, reporter) &&
+            !DeclarationRegistrationOptions.canParse(
+                declarationProvider, reporter)) {
           reporter.reportError(
               'must be of type Either3<bool, DeclarationOptions, DeclarationRegistrationOptions>');
           return false;
@@ -34280,8 +35018,8 @@
       try {
         final definitionProvider = obj['definitionProvider'];
         if (definitionProvider != null &&
-            !((definitionProvider is bool ||
-                DefinitionOptions.canParse(definitionProvider, reporter)))) {
+            definitionProvider is! bool &&
+            !DefinitionOptions.canParse(definitionProvider, reporter)) {
           reporter
               .reportError('must be of type Either2<bool, DefinitionOptions>');
           return false;
@@ -34293,9 +35031,9 @@
       try {
         final diagnosticProvider = obj['diagnosticProvider'];
         if (diagnosticProvider != null &&
-            !((DiagnosticOptions.canParse(diagnosticProvider, reporter) ||
-                DiagnosticRegistrationOptions.canParse(
-                    diagnosticProvider, reporter)))) {
+            !DiagnosticOptions.canParse(diagnosticProvider, reporter) &&
+            !DiagnosticRegistrationOptions.canParse(
+                diagnosticProvider, reporter)) {
           reporter.reportError(
               'must be of type Either2<DiagnosticOptions, DiagnosticRegistrationOptions>');
           return false;
@@ -34307,9 +35045,9 @@
       try {
         final documentFormattingProvider = obj['documentFormattingProvider'];
         if (documentFormattingProvider != null &&
-            !((documentFormattingProvider is bool ||
-                DocumentFormattingOptions.canParse(
-                    documentFormattingProvider, reporter)))) {
+            documentFormattingProvider is! bool &&
+            !DocumentFormattingOptions.canParse(
+                documentFormattingProvider, reporter)) {
           reporter.reportError(
               'must be of type Either2<bool, DocumentFormattingOptions>');
           return false;
@@ -34321,9 +35059,9 @@
       try {
         final documentHighlightProvider = obj['documentHighlightProvider'];
         if (documentHighlightProvider != null &&
-            !((documentHighlightProvider is bool ||
-                DocumentHighlightOptions.canParse(
-                    documentHighlightProvider, reporter)))) {
+            documentHighlightProvider is! bool &&
+            !DocumentHighlightOptions.canParse(
+                documentHighlightProvider, reporter)) {
           reporter.reportError(
               'must be of type Either2<bool, DocumentHighlightOptions>');
           return false;
@@ -34335,7 +35073,7 @@
       try {
         final documentLinkProvider = obj['documentLinkProvider'];
         if (documentLinkProvider != null &&
-            !(DocumentLinkOptions.canParse(documentLinkProvider, reporter))) {
+            !DocumentLinkOptions.canParse(documentLinkProvider, reporter)) {
           reporter.reportError('must be of type DocumentLinkOptions');
           return false;
         }
@@ -34347,8 +35085,8 @@
         final documentOnTypeFormattingProvider =
             obj['documentOnTypeFormattingProvider'];
         if (documentOnTypeFormattingProvider != null &&
-            !(DocumentOnTypeFormattingOptions.canParse(
-                documentOnTypeFormattingProvider, reporter))) {
+            !DocumentOnTypeFormattingOptions.canParse(
+                documentOnTypeFormattingProvider, reporter)) {
           reporter
               .reportError('must be of type DocumentOnTypeFormattingOptions');
           return false;
@@ -34361,9 +35099,9 @@
         final documentRangeFormattingProvider =
             obj['documentRangeFormattingProvider'];
         if (documentRangeFormattingProvider != null &&
-            !((documentRangeFormattingProvider is bool ||
-                DocumentRangeFormattingOptions.canParse(
-                    documentRangeFormattingProvider, reporter)))) {
+            documentRangeFormattingProvider is! bool &&
+            !DocumentRangeFormattingOptions.canParse(
+                documentRangeFormattingProvider, reporter)) {
           reporter.reportError(
               'must be of type Either2<bool, DocumentRangeFormattingOptions>');
           return false;
@@ -34375,9 +35113,8 @@
       try {
         final documentSymbolProvider = obj['documentSymbolProvider'];
         if (documentSymbolProvider != null &&
-            !((documentSymbolProvider is bool ||
-                DocumentSymbolOptions.canParse(
-                    documentSymbolProvider, reporter)))) {
+            documentSymbolProvider is! bool &&
+            !DocumentSymbolOptions.canParse(documentSymbolProvider, reporter)) {
           reporter.reportError(
               'must be of type Either2<bool, DocumentSymbolOptions>');
           return false;
@@ -34389,8 +35126,7 @@
       try {
         final executeCommandProvider = obj['executeCommandProvider'];
         if (executeCommandProvider != null &&
-            !(ExecuteCommandOptions.canParse(
-                executeCommandProvider, reporter))) {
+            !ExecuteCommandOptions.canParse(executeCommandProvider, reporter)) {
           reporter.reportError('must be of type ExecuteCommandOptions');
           return false;
         }
@@ -34401,10 +35137,10 @@
       try {
         final foldingRangeProvider = obj['foldingRangeProvider'];
         if (foldingRangeProvider != null &&
-            !((foldingRangeProvider is bool ||
-                FoldingRangeOptions.canParse(foldingRangeProvider, reporter) ||
-                FoldingRangeRegistrationOptions.canParse(
-                    foldingRangeProvider, reporter)))) {
+            foldingRangeProvider is! bool &&
+            !FoldingRangeOptions.canParse(foldingRangeProvider, reporter) &&
+            !FoldingRangeRegistrationOptions.canParse(
+                foldingRangeProvider, reporter)) {
           reporter.reportError(
               'must be of type Either3<bool, FoldingRangeOptions, FoldingRangeRegistrationOptions>');
           return false;
@@ -34416,8 +35152,8 @@
       try {
         final hoverProvider = obj['hoverProvider'];
         if (hoverProvider != null &&
-            !((hoverProvider is bool ||
-                HoverOptions.canParse(hoverProvider, reporter)))) {
+            hoverProvider is! bool &&
+            !HoverOptions.canParse(hoverProvider, reporter)) {
           reporter.reportError('must be of type Either2<bool, HoverOptions>');
           return false;
         }
@@ -34428,11 +35164,10 @@
       try {
         final implementationProvider = obj['implementationProvider'];
         if (implementationProvider != null &&
-            !((implementationProvider is bool ||
-                ImplementationOptions.canParse(
-                    implementationProvider, reporter) ||
-                ImplementationRegistrationOptions.canParse(
-                    implementationProvider, reporter)))) {
+            implementationProvider is! bool &&
+            !ImplementationOptions.canParse(implementationProvider, reporter) &&
+            !ImplementationRegistrationOptions.canParse(
+                implementationProvider, reporter)) {
           reporter.reportError(
               'must be of type Either3<bool, ImplementationOptions, ImplementationRegistrationOptions>');
           return false;
@@ -34444,10 +35179,10 @@
       try {
         final inlayHintProvider = obj['inlayHintProvider'];
         if (inlayHintProvider != null &&
-            !((inlayHintProvider is bool ||
-                InlayHintOptions.canParse(inlayHintProvider, reporter) ||
-                InlayHintRegistrationOptions.canParse(
-                    inlayHintProvider, reporter)))) {
+            inlayHintProvider is! bool &&
+            !InlayHintOptions.canParse(inlayHintProvider, reporter) &&
+            !InlayHintRegistrationOptions.canParse(
+                inlayHintProvider, reporter)) {
           reporter.reportError(
               'must be of type Either3<bool, InlayHintOptions, InlayHintRegistrationOptions>');
           return false;
@@ -34459,10 +35194,10 @@
       try {
         final inlineValueProvider = obj['inlineValueProvider'];
         if (inlineValueProvider != null &&
-            !((inlineValueProvider is bool ||
-                InlineValueOptions.canParse(inlineValueProvider, reporter) ||
-                InlineValueRegistrationOptions.canParse(
-                    inlineValueProvider, reporter)))) {
+            inlineValueProvider is! bool &&
+            !InlineValueOptions.canParse(inlineValueProvider, reporter) &&
+            !InlineValueRegistrationOptions.canParse(
+                inlineValueProvider, reporter)) {
           reporter.reportError(
               'must be of type Either3<bool, InlineValueOptions, InlineValueRegistrationOptions>');
           return false;
@@ -34474,11 +35209,11 @@
       try {
         final linkedEditingRangeProvider = obj['linkedEditingRangeProvider'];
         if (linkedEditingRangeProvider != null &&
-            !((linkedEditingRangeProvider is bool ||
-                LinkedEditingRangeOptions.canParse(
-                    linkedEditingRangeProvider, reporter) ||
-                LinkedEditingRangeRegistrationOptions.canParse(
-                    linkedEditingRangeProvider, reporter)))) {
+            linkedEditingRangeProvider is! bool &&
+            !LinkedEditingRangeOptions.canParse(
+                linkedEditingRangeProvider, reporter) &&
+            !LinkedEditingRangeRegistrationOptions.canParse(
+                linkedEditingRangeProvider, reporter)) {
           reporter.reportError(
               'must be of type Either3<bool, LinkedEditingRangeOptions, LinkedEditingRangeRegistrationOptions>');
           return false;
@@ -34490,10 +35225,9 @@
       try {
         final monikerProvider = obj['monikerProvider'];
         if (monikerProvider != null &&
-            !((monikerProvider is bool ||
-                MonikerOptions.canParse(monikerProvider, reporter) ||
-                MonikerRegistrationOptions.canParse(
-                    monikerProvider, reporter)))) {
+            monikerProvider is! bool &&
+            !MonikerOptions.canParse(monikerProvider, reporter) &&
+            !MonikerRegistrationOptions.canParse(monikerProvider, reporter)) {
           reporter.reportError(
               'must be of type Either3<bool, MonikerOptions, MonikerRegistrationOptions>');
           return false;
@@ -34505,10 +35239,10 @@
       try {
         final notebookDocumentSync = obj['notebookDocumentSync'];
         if (notebookDocumentSync != null &&
-            !((NotebookDocumentSyncOptions.canParse(
-                    notebookDocumentSync, reporter) ||
-                NotebookDocumentSyncRegistrationOptions.canParse(
-                    notebookDocumentSync, reporter)))) {
+            !NotebookDocumentSyncOptions.canParse(
+                notebookDocumentSync, reporter) &&
+            !NotebookDocumentSyncRegistrationOptions.canParse(
+                notebookDocumentSync, reporter)) {
           reporter.reportError(
               'must be of type Either2<NotebookDocumentSyncOptions, NotebookDocumentSyncRegistrationOptions>');
           return false;
@@ -34520,7 +35254,7 @@
       try {
         final positionEncoding = obj['positionEncoding'];
         if (positionEncoding != null &&
-            !(PositionEncodingKind.canParse(positionEncoding, reporter))) {
+            !PositionEncodingKind.canParse(positionEncoding, reporter)) {
           reporter.reportError('must be of type PositionEncodingKind');
           return false;
         }
@@ -34531,8 +35265,8 @@
       try {
         final referencesProvider = obj['referencesProvider'];
         if (referencesProvider != null &&
-            !((referencesProvider is bool ||
-                ReferenceOptions.canParse(referencesProvider, reporter)))) {
+            referencesProvider is! bool &&
+            !ReferenceOptions.canParse(referencesProvider, reporter)) {
           reporter
               .reportError('must be of type Either2<bool, ReferenceOptions>');
           return false;
@@ -34544,8 +35278,8 @@
       try {
         final renameProvider = obj['renameProvider'];
         if (renameProvider != null &&
-            !((renameProvider is bool ||
-                RenameOptions.canParse(renameProvider, reporter)))) {
+            renameProvider is! bool &&
+            !RenameOptions.canParse(renameProvider, reporter)) {
           reporter.reportError('must be of type Either2<bool, RenameOptions>');
           return false;
         }
@@ -34556,11 +35290,10 @@
       try {
         final selectionRangeProvider = obj['selectionRangeProvider'];
         if (selectionRangeProvider != null &&
-            !((selectionRangeProvider is bool ||
-                SelectionRangeOptions.canParse(
-                    selectionRangeProvider, reporter) ||
-                SelectionRangeRegistrationOptions.canParse(
-                    selectionRangeProvider, reporter)))) {
+            selectionRangeProvider is! bool &&
+            !SelectionRangeOptions.canParse(selectionRangeProvider, reporter) &&
+            !SelectionRangeRegistrationOptions.canParse(
+                selectionRangeProvider, reporter)) {
           reporter.reportError(
               'must be of type Either3<bool, SelectionRangeOptions, SelectionRangeRegistrationOptions>');
           return false;
@@ -34572,10 +35305,9 @@
       try {
         final semanticTokensProvider = obj['semanticTokensProvider'];
         if (semanticTokensProvider != null &&
-            !((SemanticTokensOptions.canParse(
-                    semanticTokensProvider, reporter) ||
-                SemanticTokensRegistrationOptions.canParse(
-                    semanticTokensProvider, reporter)))) {
+            !SemanticTokensOptions.canParse(semanticTokensProvider, reporter) &&
+            !SemanticTokensRegistrationOptions.canParse(
+                semanticTokensProvider, reporter)) {
           reporter.reportError(
               'must be of type Either2<SemanticTokensOptions, SemanticTokensRegistrationOptions>');
           return false;
@@ -34587,7 +35319,7 @@
       try {
         final signatureHelpProvider = obj['signatureHelpProvider'];
         if (signatureHelpProvider != null &&
-            !(SignatureHelpOptions.canParse(signatureHelpProvider, reporter))) {
+            !SignatureHelpOptions.canParse(signatureHelpProvider, reporter)) {
           reporter.reportError('must be of type SignatureHelpOptions');
           return false;
         }
@@ -34598,9 +35330,8 @@
       try {
         final textDocumentSync = obj['textDocumentSync'];
         if (textDocumentSync != null &&
-            !((TextDocumentSyncKind.canParse(textDocumentSync, reporter) ||
-                TextDocumentSyncOptions.canParse(
-                    textDocumentSync, reporter)))) {
+            !TextDocumentSyncKind.canParse(textDocumentSync, reporter) &&
+            !TextDocumentSyncOptions.canParse(textDocumentSync, reporter)) {
           reporter.reportError(
               'must be of type Either2<TextDocumentSyncKind, TextDocumentSyncOptions>');
           return false;
@@ -34612,11 +35343,10 @@
       try {
         final typeDefinitionProvider = obj['typeDefinitionProvider'];
         if (typeDefinitionProvider != null &&
-            !((typeDefinitionProvider is bool ||
-                TypeDefinitionOptions.canParse(
-                    typeDefinitionProvider, reporter) ||
-                TypeDefinitionRegistrationOptions.canParse(
-                    typeDefinitionProvider, reporter)))) {
+            typeDefinitionProvider is! bool &&
+            !TypeDefinitionOptions.canParse(typeDefinitionProvider, reporter) &&
+            !TypeDefinitionRegistrationOptions.canParse(
+                typeDefinitionProvider, reporter)) {
           reporter.reportError(
               'must be of type Either3<bool, TypeDefinitionOptions, TypeDefinitionRegistrationOptions>');
           return false;
@@ -34628,11 +35358,10 @@
       try {
         final typeHierarchyProvider = obj['typeHierarchyProvider'];
         if (typeHierarchyProvider != null &&
-            !((typeHierarchyProvider is bool ||
-                TypeHierarchyOptions.canParse(
-                    typeHierarchyProvider, reporter) ||
-                TypeHierarchyRegistrationOptions.canParse(
-                    typeHierarchyProvider, reporter)))) {
+            typeHierarchyProvider is! bool &&
+            !TypeHierarchyOptions.canParse(typeHierarchyProvider, reporter) &&
+            !TypeHierarchyRegistrationOptions.canParse(
+                typeHierarchyProvider, reporter)) {
           reporter.reportError(
               'must be of type Either3<bool, TypeHierarchyOptions, TypeHierarchyRegistrationOptions>');
           return false;
@@ -34644,7 +35373,7 @@
       try {
         final workspace = obj['workspace'];
         if (workspace != null &&
-            !(ServerCapabilitiesWorkspace.canParse(workspace, reporter))) {
+            !ServerCapabilitiesWorkspace.canParse(workspace, reporter)) {
           reporter.reportError('must be of type ServerCapabilitiesWorkspace');
           return false;
         }
@@ -34655,9 +35384,9 @@
       try {
         final workspaceSymbolProvider = obj['workspaceSymbolProvider'];
         if (workspaceSymbolProvider != null &&
-            !((workspaceSymbolProvider is bool ||
-                WorkspaceSymbolOptions.canParse(
-                    workspaceSymbolProvider, reporter)))) {
+            workspaceSymbolProvider is! bool &&
+            !WorkspaceSymbolOptions.canParse(
+                workspaceSymbolProvider, reporter)) {
           reporter.reportError(
               'must be of type Either2<bool, WorkspaceSymbolOptions>');
           return false;
@@ -34796,6 +35525,7 @@
   ///  @since 3.6.0
   final WorkspaceFoldersServerCapabilities? workspaceFolders;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (fileOperations != null) {
@@ -34813,7 +35543,7 @@
       try {
         final fileOperations = obj['fileOperations'];
         if (fileOperations != null &&
-            !(FileOperationOptions.canParse(fileOperations, reporter))) {
+            !FileOperationOptions.canParse(fileOperations, reporter)) {
           reporter.reportError('must be of type FileOperationOptions');
           return false;
         }
@@ -34824,8 +35554,8 @@
       try {
         final workspaceFolders = obj['workspaceFolders'];
         if (workspaceFolders != null &&
-            !(WorkspaceFoldersServerCapabilities.canParse(
-                workspaceFolders, reporter))) {
+            !WorkspaceFoldersServerCapabilities.canParse(
+                workspaceFolders, reporter)) {
           reporter.reportError(
               'must be of type WorkspaceFoldersServerCapabilities');
           return false;
@@ -34883,6 +35613,7 @@
   /// The new value that should be assigned to the trace setting.
   final String value;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['value'] = value;
@@ -34902,7 +35633,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!((value == 'off' || value == 'messages' || value == 'verbose'))) {
+        if (value != 'off' && value != 'messages' && value != 'verbose') {
           reporter.reportError(
               'must be one of the literals \'off\', \'messages\', \'verbose\'');
           return false;
@@ -34954,6 +35685,7 @@
   /// The client has support for the show document request.
   final bool support;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['support'] = support;
@@ -34973,7 +35705,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(support is bool)) {
+        if (support is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -35054,6 +35786,7 @@
   /// The document uri to show.
   final String uri;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (external != null) {
@@ -35074,7 +35807,7 @@
       reporter.push('external');
       try {
         final external = obj['external'];
-        if (external != null && !(external is bool)) {
+        if (external != null && external is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -35084,7 +35817,7 @@
       reporter.push('selection');
       try {
         final selection = obj['selection'];
-        if (selection != null && !(Range.canParse(selection, reporter))) {
+        if (selection != null && !Range.canParse(selection, reporter)) {
           reporter.reportError('must be of type Range');
           return false;
         }
@@ -35094,7 +35827,7 @@
       reporter.push('takeFocus');
       try {
         final takeFocus = obj['takeFocus'];
-        if (takeFocus != null && !(takeFocus is bool)) {
+        if (takeFocus != null && takeFocus is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -35112,7 +35845,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(uri is String)) {
+        if (uri is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -35173,6 +35906,7 @@
   /// A boolean indicating if the show was successful.
   final bool success;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['success'] = success;
@@ -35192,7 +35926,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(success is bool)) {
+        if (success is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -35249,6 +35983,7 @@
   /// The message type.
   final MessageType type;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['message'] = message;
@@ -35269,7 +36004,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(message is String)) {
+        if (message is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -35287,7 +36022,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(MessageType.canParse(type, reporter))) {
+        if (!MessageType.canParse(type, reporter)) {
           reporter.reportError('must be of type MessageType');
           return false;
         }
@@ -35345,6 +36080,7 @@
   final ShowMessageRequestClientCapabilitiesMessageActionItem?
       messageActionItem;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (messageActionItem != null) {
@@ -35359,8 +36095,8 @@
       try {
         final messageActionItem = obj['messageActionItem'];
         if (messageActionItem != null &&
-            !(ShowMessageRequestClientCapabilitiesMessageActionItem.canParse(
-                messageActionItem, reporter))) {
+            !ShowMessageRequestClientCapabilitiesMessageActionItem.canParse(
+                messageActionItem, reporter)) {
           reporter.reportError(
               'must be of type ShowMessageRequestClientCapabilitiesMessageActionItem');
           return false;
@@ -35416,6 +36152,7 @@
   /// sent back to the server in the request's response.
   final bool? additionalPropertiesSupport;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (additionalPropertiesSupport != null) {
@@ -35430,7 +36167,7 @@
       try {
         final additionalPropertiesSupport = obj['additionalPropertiesSupport'];
         if (additionalPropertiesSupport != null &&
-            !(additionalPropertiesSupport is bool)) {
+            additionalPropertiesSupport is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -35500,6 +36237,7 @@
   /// The message type.
   final MessageType type;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (actions != null) {
@@ -35516,9 +36254,9 @@
       try {
         final actions = obj['actions'];
         if (actions != null &&
-            !((actions is List<Object?> &&
-                (actions.every(
-                    (item) => MessageActionItem.canParse(item, reporter)))))) {
+            (actions is! List<Object?> ||
+                actions.any(
+                    (item) => !MessageActionItem.canParse(item, reporter)))) {
           reporter.reportError('must be of type List<MessageActionItem>');
           return false;
         }
@@ -35536,7 +36274,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(message is String)) {
+        if (message is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -35554,7 +36292,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(MessageType.canParse(type, reporter))) {
+        if (!MessageType.canParse(type, reporter)) {
           reporter.reportError('must be of type MessageType');
           return false;
         }
@@ -35645,6 +36383,7 @@
   /// request should return `null`.
   final List<SignatureInformation> signatures;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (activeParameter != null) {
@@ -35662,7 +36401,7 @@
       reporter.push('activeParameter');
       try {
         final activeParameter = obj['activeParameter'];
-        if (activeParameter != null && !(activeParameter is int)) {
+        if (activeParameter != null && activeParameter is! int) {
           reporter.reportError('must be of type int');
           return false;
         }
@@ -35672,7 +36411,7 @@
       reporter.push('activeSignature');
       try {
         final activeSignature = obj['activeSignature'];
-        if (activeSignature != null && !(activeSignature is int)) {
+        if (activeSignature != null && activeSignature is! int) {
           reporter.reportError('must be of type int');
           return false;
         }
@@ -35690,9 +36429,9 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!((signatures is List<Object?> &&
-            (signatures.every(
-                (item) => SignatureInformation.canParse(item, reporter)))))) {
+        if (signatures is! List<Object?> ||
+            signatures.any(
+                (item) => !SignatureInformation.canParse(item, reporter))) {
           reporter.reportError('must be of type List<SignatureInformation>');
           return false;
         }
@@ -35772,6 +36511,7 @@
   final SignatureHelpClientCapabilitiesSignatureInformation?
       signatureInformation;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (contextSupport != null) {
@@ -35791,7 +36531,7 @@
       reporter.push('contextSupport');
       try {
         final contextSupport = obj['contextSupport'];
-        if (contextSupport != null && !(contextSupport is bool)) {
+        if (contextSupport != null && contextSupport is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -35801,7 +36541,7 @@
       reporter.push('dynamicRegistration');
       try {
         final dynamicRegistration = obj['dynamicRegistration'];
-        if (dynamicRegistration != null && !(dynamicRegistration is bool)) {
+        if (dynamicRegistration != null && dynamicRegistration is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -35812,8 +36552,8 @@
       try {
         final signatureInformation = obj['signatureInformation'];
         if (signatureInformation != null &&
-            !(SignatureHelpClientCapabilitiesSignatureInformation.canParse(
-                signatureInformation, reporter))) {
+            !SignatureHelpClientCapabilitiesSignatureInformation.canParse(
+                signatureInformation, reporter)) {
           reporter.reportError(
               'must be of type SignatureHelpClientCapabilitiesSignatureInformation');
           return false;
@@ -35895,6 +36635,7 @@
   /// Client capabilities specific to parameter information.
   final SignatureInformationParameterInformation? parameterInformation;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (activeParameterSupport != null) {
@@ -35915,8 +36656,7 @@
       reporter.push('activeParameterSupport');
       try {
         final activeParameterSupport = obj['activeParameterSupport'];
-        if (activeParameterSupport != null &&
-            !(activeParameterSupport is bool)) {
+        if (activeParameterSupport != null && activeParameterSupport is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -35927,9 +36667,9 @@
       try {
         final documentationFormat = obj['documentationFormat'];
         if (documentationFormat != null &&
-            !((documentationFormat is List<Object?> &&
-                (documentationFormat
-                    .every((item) => MarkupKind.canParse(item, reporter)))))) {
+            (documentationFormat is! List<Object?> ||
+                documentationFormat
+                    .any((item) => !MarkupKind.canParse(item, reporter)))) {
           reporter.reportError('must be of type List<MarkupKind>');
           return false;
         }
@@ -35940,8 +36680,8 @@
       try {
         final parameterInformation = obj['parameterInformation'];
         if (parameterInformation != null &&
-            !(SignatureInformationParameterInformation.canParse(
-                parameterInformation, reporter))) {
+            !SignatureInformationParameterInformation.canParse(
+                parameterInformation, reporter)) {
           reporter.reportError(
               'must be of type SignatureInformationParameterInformation');
           return false;
@@ -36040,6 +36780,7 @@
   /// Action that caused signature help to be triggered.
   final SignatureHelpTriggerKind triggerKind;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (activeSignatureHelp != null) {
@@ -36059,7 +36800,7 @@
       try {
         final activeSignatureHelp = obj['activeSignatureHelp'];
         if (activeSignatureHelp != null &&
-            !(SignatureHelp.canParse(activeSignatureHelp, reporter))) {
+            !SignatureHelp.canParse(activeSignatureHelp, reporter)) {
           reporter.reportError('must be of type SignatureHelp');
           return false;
         }
@@ -36077,7 +36818,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(isRetrigger is bool)) {
+        if (isRetrigger is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -36087,7 +36828,7 @@
       reporter.push('triggerCharacter');
       try {
         final triggerCharacter = obj['triggerCharacter'];
-        if (triggerCharacter != null && !(triggerCharacter is String)) {
+        if (triggerCharacter != null && triggerCharacter is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -36105,7 +36846,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(SignatureHelpTriggerKind.canParse(triggerKind, reporter))) {
+        if (!SignatureHelpTriggerKind.canParse(triggerKind, reporter)) {
           reporter.reportError('must be of type SignatureHelpTriggerKind');
           return false;
         }
@@ -36185,8 +36926,10 @@
 
   /// The characters that trigger signature help automatically.
   final List<String>? triggerCharacters;
+  @override
   final bool? workDoneProgress;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (retriggerCharacters != null) {
@@ -36207,8 +36950,8 @@
       try {
         final retriggerCharacters = obj['retriggerCharacters'];
         if (retriggerCharacters != null &&
-            !((retriggerCharacters is List<Object?> &&
-                (retriggerCharacters.every((item) => item is String))))) {
+            (retriggerCharacters is! List<Object?> ||
+                retriggerCharacters.any((item) => item is! String))) {
           reporter.reportError('must be of type List<String>');
           return false;
         }
@@ -36219,8 +36962,8 @@
       try {
         final triggerCharacters = obj['triggerCharacters'];
         if (triggerCharacters != null &&
-            !((triggerCharacters is List<Object?> &&
-                (triggerCharacters.every((item) => item is String))))) {
+            (triggerCharacters is! List<Object?> ||
+                triggerCharacters.any((item) => item is! String))) {
           reporter.reportError('must be of type List<String>');
           return false;
         }
@@ -36230,7 +36973,7 @@
       reporter.push('workDoneProgress');
       try {
         final workDoneProgress = obj['workDoneProgress'];
-        if (workDoneProgress != null && !(workDoneProgress is bool)) {
+        if (workDoneProgress != null && workDoneProgress is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -36315,14 +37058,18 @@
   final SignatureHelpContext? context;
 
   /// The position inside the text document.
+  @override
   final Position position;
 
   /// The text document.
+  @override
   final TextDocumentIdentifier textDocument;
 
   /// An optional token that a server can use to report work done progress.
+  @override
   final Either2<int, String>? workDoneToken;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (context != null) {
@@ -36342,7 +37089,7 @@
       try {
         final context = obj['context'];
         if (context != null &&
-            !(SignatureHelpContext.canParse(context, reporter))) {
+            !SignatureHelpContext.canParse(context, reporter)) {
           reporter.reportError('must be of type SignatureHelpContext');
           return false;
         }
@@ -36360,7 +37107,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(Position.canParse(position, reporter))) {
+        if (!Position.canParse(position, reporter)) {
           reporter.reportError('must be of type Position');
           return false;
         }
@@ -36378,7 +37125,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(TextDocumentIdentifier.canParse(textDocument, reporter))) {
+        if (!TextDocumentIdentifier.canParse(textDocument, reporter)) {
           reporter.reportError('must be of type TextDocumentIdentifier');
           return false;
         }
@@ -36389,7 +37136,8 @@
       try {
         final workDoneToken = obj['workDoneToken'];
         if (workDoneToken != null &&
-            !((workDoneToken is int || workDoneToken is String))) {
+            workDoneToken is! int &&
+            workDoneToken is! String) {
           reporter.reportError('must be of type Either2<int, String>');
           return false;
         }
@@ -36447,8 +37195,8 @@
   static SignatureHelpRegistrationOptions fromJson(Map<String, Object?> json) {
     final documentSelectorJson = json['documentSelector'];
     final documentSelector = (documentSelectorJson as List<Object?>?)
-        ?.map(
-            (item) => TextDocumentFilter.fromJson(item as Map<String, Object?>))
+        ?.map((item) =>
+            TextDocumentFilterWithScheme.fromJson(item as Map<String, Object?>))
         .toList();
     final retriggerCharactersJson = json['retriggerCharacters'];
     final retriggerCharacters = (retriggerCharactersJson as List<Object?>?)
@@ -36470,19 +37218,24 @@
 
   /// A document selector to identify the scope of the registration. If set to
   /// null the document selector provided on the client side will be used.
-  final List<TextDocumentFilter>? documentSelector;
+  @override
+  final List<TextDocumentFilterWithScheme>? documentSelector;
 
   /// List of characters that re-trigger signature help.
   ///
   /// These trigger characters are only active when signature help is already
   /// showing. All trigger characters are also counted as re-trigger characters.
   ///  @since 3.15.0
+  @override
   final List<String>? retriggerCharacters;
 
   /// The characters that trigger signature help automatically.
+  @override
   final List<String>? triggerCharacters;
+  @override
   final bool? workDoneProgress;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['documentSelector'] = documentSelector;
@@ -36508,10 +37261,11 @@
         }
         final documentSelector = obj['documentSelector'];
         if (documentSelector != null &&
-            !((documentSelector is List<Object?> &&
-                (documentSelector.every(
-                    (item) => TextDocumentFilter.canParse(item, reporter)))))) {
-          reporter.reportError('must be of type List<TextDocumentFilter>');
+            (documentSelector is! List<Object?> ||
+                documentSelector.any((item) =>
+                    !TextDocumentFilterWithScheme.canParse(item, reporter)))) {
+          reporter.reportError(
+              'must be of type List<TextDocumentFilterWithScheme>');
           return false;
         }
       } finally {
@@ -36521,8 +37275,8 @@
       try {
         final retriggerCharacters = obj['retriggerCharacters'];
         if (retriggerCharacters != null &&
-            !((retriggerCharacters is List<Object?> &&
-                (retriggerCharacters.every((item) => item is String))))) {
+            (retriggerCharacters is! List<Object?> ||
+                retriggerCharacters.any((item) => item is! String))) {
           reporter.reportError('must be of type List<String>');
           return false;
         }
@@ -36533,8 +37287,8 @@
       try {
         final triggerCharacters = obj['triggerCharacters'];
         if (triggerCharacters != null &&
-            !((triggerCharacters is List<Object?> &&
-                (triggerCharacters.every((item) => item is String))))) {
+            (triggerCharacters is! List<Object?> ||
+                triggerCharacters.any((item) => item is! String))) {
           reporter.reportError('must be of type List<String>');
           return false;
         }
@@ -36544,7 +37298,7 @@
       reporter.push('workDoneProgress');
       try {
         final workDoneProgress = obj['workDoneProgress'];
-        if (workDoneProgress != null && !(workDoneProgress is bool)) {
+        if (workDoneProgress != null && workDoneProgress is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -36562,8 +37316,12 @@
   bool operator ==(Object other) {
     if (other is SignatureHelpRegistrationOptions &&
         other.runtimeType == SignatureHelpRegistrationOptions) {
-      return listEqual(documentSelector, other.documentSelector,
-              (TextDocumentFilter a, TextDocumentFilter b) => a == b) &&
+      return listEqual(
+              documentSelector,
+              other.documentSelector,
+              (TextDocumentFilterWithScheme a,
+                      TextDocumentFilterWithScheme b) =>
+                  a == b) &&
           listEqual(retriggerCharacters, other.retriggerCharacters,
               (String a, String b) => a == b) &&
           listEqual(triggerCharacters, other.triggerCharacters,
@@ -36608,6 +37366,7 @@
   /// Signature help was triggered by a trigger character.
   static const TriggerCharacter = SignatureHelpTriggerKind(2);
 
+  @override
   Object toJson() => _value;
 
   @override
@@ -36616,6 +37375,7 @@
   @override
   int get hashCode => _value.hashCode;
 
+  @override
   bool operator ==(Object other) =>
       other is SignatureHelpTriggerKind && other._value == _value;
 }
@@ -36677,6 +37437,7 @@
   /// The parameters of this signature.
   final List<ParameterInformation>? parameters;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (activeParameter != null) {
@@ -36697,7 +37458,7 @@
       reporter.push('activeParameter');
       try {
         final activeParameter = obj['activeParameter'];
-        if (activeParameter != null && !(activeParameter is int)) {
+        if (activeParameter != null && activeParameter is! int) {
           reporter.reportError('must be of type int');
           return false;
         }
@@ -36708,8 +37469,8 @@
       try {
         final documentation = obj['documentation'];
         if (documentation != null &&
-            !((MarkupContent.canParse(documentation, reporter) ||
-                documentation is String))) {
+            !MarkupContent.canParse(documentation, reporter) &&
+            documentation is! String) {
           reporter
               .reportError('must be of type Either2<MarkupContent, String>');
           return false;
@@ -36728,7 +37489,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(label is String)) {
+        if (label is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -36739,9 +37500,9 @@
       try {
         final parameters = obj['parameters'];
         if (parameters != null &&
-            !((parameters is List<Object?> &&
-                (parameters.every((item) =>
-                    ParameterInformation.canParse(item, reporter)))))) {
+            (parameters is! List<Object?> ||
+                parameters.any((item) =>
+                    !ParameterInformation.canParse(item, reporter)))) {
           reporter.reportError('must be of type List<ParameterInformation>');
           return false;
         }
@@ -36804,6 +37565,7 @@
   ///  @since 3.14.0
   final bool? labelOffsetSupport;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (labelOffsetSupport != null) {
@@ -36817,7 +37579,7 @@
       reporter.push('labelOffsetSupport');
       try {
         final labelOffsetSupport = obj['labelOffsetSupport'];
-        if (labelOffsetSupport != null && !(labelOffsetSupport is bool)) {
+        if (labelOffsetSupport != null && labelOffsetSupport is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -36914,6 +37676,7 @@
   /// request again. See also Registration#id.
   final String? id;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (id != null) {
@@ -36927,7 +37690,7 @@
       reporter.push('id');
       try {
         final id = obj['id'];
-        if (id != null && !(id is String)) {
+        if (id != null && id is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -37030,6 +37793,7 @@
   ///  @since 3.16.0
   final List<SymbolTag>? tags;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (containerName != null) {
@@ -37052,7 +37816,7 @@
       reporter.push('containerName');
       try {
         final containerName = obj['containerName'];
-        if (containerName != null && !(containerName is String)) {
+        if (containerName != null && containerName is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -37062,7 +37826,7 @@
       reporter.push('deprecated');
       try {
         final deprecated = obj['deprecated'];
-        if (deprecated != null && !(deprecated is bool)) {
+        if (deprecated != null && deprecated is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -37080,7 +37844,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(SymbolKind.canParse(kind, reporter))) {
+        if (!SymbolKind.canParse(kind, reporter)) {
           reporter.reportError('must be of type SymbolKind');
           return false;
         }
@@ -37098,7 +37862,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(Location.canParse(location, reporter))) {
+        if (!Location.canParse(location, reporter)) {
           reporter.reportError('must be of type Location');
           return false;
         }
@@ -37116,7 +37880,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(name is String)) {
+        if (name is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -37127,8 +37891,8 @@
       try {
         final tags = obj['tags'];
         if (tags != null &&
-            !((tags is List<Object?> &&
-                (tags.every((item) => SymbolTag.canParse(item, reporter)))))) {
+            (tags is! List<Object?> ||
+                tags.any((item) => !SymbolTag.canParse(item, reporter)))) {
           reporter.reportError('must be of type List<SymbolTag>');
           return false;
         }
@@ -37208,6 +37972,7 @@
   static const TypeParameter = SymbolKind(26);
   static const Variable = SymbolKind(13);
 
+  @override
   Object toJson() => _value;
 
   @override
@@ -37216,6 +37981,7 @@
   @override
   int get hashCode => _value.hashCode;
 
+  @override
   bool operator ==(Object other) =>
       other is SymbolKind && other._value == _value;
 }
@@ -37235,6 +38001,7 @@
   /// Render a symbol as obsolete, usually using a strike-out.
   static const Deprecated = SymbolTag(1);
 
+  @override
   Object toJson() => _value;
 
   @override
@@ -37243,6 +38010,7 @@
   @override
   int get hashCode => _value.hashCode;
 
+  @override
   bool operator ==(Object other) =>
       other is SymbolTag && other._value == _value;
 }
@@ -37264,8 +38032,8 @@
       Map<String, Object?> json) {
     final documentSelectorJson = json['documentSelector'];
     final documentSelector = (documentSelectorJson as List<Object?>?)
-        ?.map(
-            (item) => TextDocumentFilter.fromJson(item as Map<String, Object?>))
+        ?.map((item) =>
+            TextDocumentFilterWithScheme.fromJson(item as Map<String, Object?>))
         .toList();
     final syncKindJson = json['syncKind'];
     final syncKind = TextDocumentSyncKind.fromJson(syncKindJson as int);
@@ -37277,12 +38045,14 @@
 
   /// A document selector to identify the scope of the registration. If set to
   /// null the document selector provided on the client side will be used.
-  final List<TextDocumentFilter>? documentSelector;
+  @override
+  final List<TextDocumentFilterWithScheme>? documentSelector;
 
   /// How documents are synced to the server. See TextDocumentSyncKind.Full and
   /// TextDocumentSyncKind.Incremental.
   final TextDocumentSyncKind syncKind;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['documentSelector'] = documentSelector;
@@ -37300,10 +38070,11 @@
         }
         final documentSelector = obj['documentSelector'];
         if (documentSelector != null &&
-            !((documentSelector is List<Object?> &&
-                (documentSelector.every(
-                    (item) => TextDocumentFilter.canParse(item, reporter)))))) {
-          reporter.reportError('must be of type List<TextDocumentFilter>');
+            (documentSelector is! List<Object?> ||
+                documentSelector.any((item) =>
+                    !TextDocumentFilterWithScheme.canParse(item, reporter)))) {
+          reporter.reportError(
+              'must be of type List<TextDocumentFilterWithScheme>');
           return false;
         }
       } finally {
@@ -37320,7 +38091,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(TextDocumentSyncKind.canParse(syncKind, reporter))) {
+        if (!TextDocumentSyncKind.canParse(syncKind, reporter)) {
           reporter.reportError('must be of type TextDocumentSyncKind');
           return false;
         }
@@ -37339,8 +38110,12 @@
   bool operator ==(Object other) {
     if (other is TextDocumentChangeRegistrationOptions &&
         other.runtimeType == TextDocumentChangeRegistrationOptions) {
-      return listEqual(documentSelector, other.documentSelector,
-              (TextDocumentFilter a, TextDocumentFilter b) => a == b) &&
+      return listEqual(
+              documentSelector,
+              other.documentSelector,
+              (TextDocumentFilterWithScheme a,
+                      TextDocumentFilterWithScheme b) =>
+                  a == b) &&
           syncKind == other.syncKind &&
           true;
     }
@@ -37542,7 +38317,7 @@
         : null;
     final typeHierarchyJson = json['typeHierarchy'];
     final typeHierarchy = typeHierarchyJson != null
-        ? TypeHierarchyClientCapabilities1.fromJson(
+        ? TypeHierarchyClientCapabilities.fromJson(
             typeHierarchyJson as Map<String, Object?>)
         : null;
     return TextDocumentClientCapabilities(
@@ -37682,8 +38457,9 @@
 
   /// Capabilities specific to the various type hierarchy requests.
   ///  @since 3.17.0
-  final TypeHierarchyClientCapabilities1? typeHierarchy;
+  final TypeHierarchyClientCapabilities? typeHierarchy;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (callHierarchy != null) {
@@ -37785,8 +38561,8 @@
       try {
         final callHierarchy = obj['callHierarchy'];
         if (callHierarchy != null &&
-            !(CallHierarchyClientCapabilities.canParse(
-                callHierarchy, reporter))) {
+            !CallHierarchyClientCapabilities.canParse(
+                callHierarchy, reporter)) {
           reporter
               .reportError('must be of type CallHierarchyClientCapabilities');
           return false;
@@ -37798,7 +38574,7 @@
       try {
         final codeAction = obj['codeAction'];
         if (codeAction != null &&
-            !(CodeActionClientCapabilities.canParse(codeAction, reporter))) {
+            !CodeActionClientCapabilities.canParse(codeAction, reporter)) {
           reporter.reportError('must be of type CodeActionClientCapabilities');
           return false;
         }
@@ -37809,7 +38585,7 @@
       try {
         final codeLens = obj['codeLens'];
         if (codeLens != null &&
-            !(CodeLensClientCapabilities.canParse(codeLens, reporter))) {
+            !CodeLensClientCapabilities.canParse(codeLens, reporter)) {
           reporter.reportError('must be of type CodeLensClientCapabilities');
           return false;
         }
@@ -37820,8 +38596,8 @@
       try {
         final colorProvider = obj['colorProvider'];
         if (colorProvider != null &&
-            !(DocumentColorClientCapabilities.canParse(
-                colorProvider, reporter))) {
+            !DocumentColorClientCapabilities.canParse(
+                colorProvider, reporter)) {
           reporter
               .reportError('must be of type DocumentColorClientCapabilities');
           return false;
@@ -37833,7 +38609,7 @@
       try {
         final completion = obj['completion'];
         if (completion != null &&
-            !(CompletionClientCapabilities.canParse(completion, reporter))) {
+            !CompletionClientCapabilities.canParse(completion, reporter)) {
           reporter.reportError('must be of type CompletionClientCapabilities');
           return false;
         }
@@ -37844,7 +38620,7 @@
       try {
         final declaration = obj['declaration'];
         if (declaration != null &&
-            !(DeclarationClientCapabilities.canParse(declaration, reporter))) {
+            !DeclarationClientCapabilities.canParse(declaration, reporter)) {
           reporter.reportError('must be of type DeclarationClientCapabilities');
           return false;
         }
@@ -37855,7 +38631,7 @@
       try {
         final definition = obj['definition'];
         if (definition != null &&
-            !(DefinitionClientCapabilities.canParse(definition, reporter))) {
+            !DefinitionClientCapabilities.canParse(definition, reporter)) {
           reporter.reportError('must be of type DefinitionClientCapabilities');
           return false;
         }
@@ -37866,7 +38642,7 @@
       try {
         final diagnostic = obj['diagnostic'];
         if (diagnostic != null &&
-            !(DiagnosticClientCapabilities.canParse(diagnostic, reporter))) {
+            !DiagnosticClientCapabilities.canParse(diagnostic, reporter)) {
           reporter.reportError('must be of type DiagnosticClientCapabilities');
           return false;
         }
@@ -37877,8 +38653,8 @@
       try {
         final documentHighlight = obj['documentHighlight'];
         if (documentHighlight != null &&
-            !(DocumentHighlightClientCapabilities.canParse(
-                documentHighlight, reporter))) {
+            !DocumentHighlightClientCapabilities.canParse(
+                documentHighlight, reporter)) {
           reporter.reportError(
               'must be of type DocumentHighlightClientCapabilities');
           return false;
@@ -37890,8 +38666,7 @@
       try {
         final documentLink = obj['documentLink'];
         if (documentLink != null &&
-            !(DocumentLinkClientCapabilities.canParse(
-                documentLink, reporter))) {
+            !DocumentLinkClientCapabilities.canParse(documentLink, reporter)) {
           reporter
               .reportError('must be of type DocumentLinkClientCapabilities');
           return false;
@@ -37903,8 +38678,8 @@
       try {
         final documentSymbol = obj['documentSymbol'];
         if (documentSymbol != null &&
-            !(DocumentSymbolClientCapabilities.canParse(
-                documentSymbol, reporter))) {
+            !DocumentSymbolClientCapabilities.canParse(
+                documentSymbol, reporter)) {
           reporter
               .reportError('must be of type DocumentSymbolClientCapabilities');
           return false;
@@ -37916,8 +38691,7 @@
       try {
         final foldingRange = obj['foldingRange'];
         if (foldingRange != null &&
-            !(FoldingRangeClientCapabilities.canParse(
-                foldingRange, reporter))) {
+            !FoldingRangeClientCapabilities.canParse(foldingRange, reporter)) {
           reporter
               .reportError('must be of type FoldingRangeClientCapabilities');
           return false;
@@ -37929,8 +38703,8 @@
       try {
         final formatting = obj['formatting'];
         if (formatting != null &&
-            !(DocumentFormattingClientCapabilities.canParse(
-                formatting, reporter))) {
+            !DocumentFormattingClientCapabilities.canParse(
+                formatting, reporter)) {
           reporter.reportError(
               'must be of type DocumentFormattingClientCapabilities');
           return false;
@@ -37942,7 +38716,7 @@
       try {
         final hover = obj['hover'];
         if (hover != null &&
-            !(HoverClientCapabilities.canParse(hover, reporter))) {
+            !HoverClientCapabilities.canParse(hover, reporter)) {
           reporter.reportError('must be of type HoverClientCapabilities');
           return false;
         }
@@ -37953,8 +38727,8 @@
       try {
         final implementation = obj['implementation'];
         if (implementation != null &&
-            !(ImplementationClientCapabilities.canParse(
-                implementation, reporter))) {
+            !ImplementationClientCapabilities.canParse(
+                implementation, reporter)) {
           reporter
               .reportError('must be of type ImplementationClientCapabilities');
           return false;
@@ -37966,7 +38740,7 @@
       try {
         final inlayHint = obj['inlayHint'];
         if (inlayHint != null &&
-            !(InlayHintClientCapabilities.canParse(inlayHint, reporter))) {
+            !InlayHintClientCapabilities.canParse(inlayHint, reporter)) {
           reporter.reportError('must be of type InlayHintClientCapabilities');
           return false;
         }
@@ -37977,7 +38751,7 @@
       try {
         final inlineValue = obj['inlineValue'];
         if (inlineValue != null &&
-            !(InlineValueClientCapabilities.canParse(inlineValue, reporter))) {
+            !InlineValueClientCapabilities.canParse(inlineValue, reporter)) {
           reporter.reportError('must be of type InlineValueClientCapabilities');
           return false;
         }
@@ -37988,8 +38762,8 @@
       try {
         final linkedEditingRange = obj['linkedEditingRange'];
         if (linkedEditingRange != null &&
-            !(LinkedEditingRangeClientCapabilities.canParse(
-                linkedEditingRange, reporter))) {
+            !LinkedEditingRangeClientCapabilities.canParse(
+                linkedEditingRange, reporter)) {
           reporter.reportError(
               'must be of type LinkedEditingRangeClientCapabilities');
           return false;
@@ -38001,7 +38775,7 @@
       try {
         final moniker = obj['moniker'];
         if (moniker != null &&
-            !(MonikerClientCapabilities.canParse(moniker, reporter))) {
+            !MonikerClientCapabilities.canParse(moniker, reporter)) {
           reporter.reportError('must be of type MonikerClientCapabilities');
           return false;
         }
@@ -38012,8 +38786,8 @@
       try {
         final onTypeFormatting = obj['onTypeFormatting'];
         if (onTypeFormatting != null &&
-            !(DocumentOnTypeFormattingClientCapabilities.canParse(
-                onTypeFormatting, reporter))) {
+            !DocumentOnTypeFormattingClientCapabilities.canParse(
+                onTypeFormatting, reporter)) {
           reporter.reportError(
               'must be of type DocumentOnTypeFormattingClientCapabilities');
           return false;
@@ -38025,8 +38799,8 @@
       try {
         final publishDiagnostics = obj['publishDiagnostics'];
         if (publishDiagnostics != null &&
-            !(PublishDiagnosticsClientCapabilities.canParse(
-                publishDiagnostics, reporter))) {
+            !PublishDiagnosticsClientCapabilities.canParse(
+                publishDiagnostics, reporter)) {
           reporter.reportError(
               'must be of type PublishDiagnosticsClientCapabilities');
           return false;
@@ -38038,8 +38812,8 @@
       try {
         final rangeFormatting = obj['rangeFormatting'];
         if (rangeFormatting != null &&
-            !(DocumentRangeFormattingClientCapabilities.canParse(
-                rangeFormatting, reporter))) {
+            !DocumentRangeFormattingClientCapabilities.canParse(
+                rangeFormatting, reporter)) {
           reporter.reportError(
               'must be of type DocumentRangeFormattingClientCapabilities');
           return false;
@@ -38051,7 +38825,7 @@
       try {
         final references = obj['references'];
         if (references != null &&
-            !(ReferenceClientCapabilities.canParse(references, reporter))) {
+            !ReferenceClientCapabilities.canParse(references, reporter)) {
           reporter.reportError('must be of type ReferenceClientCapabilities');
           return false;
         }
@@ -38062,7 +38836,7 @@
       try {
         final rename = obj['rename'];
         if (rename != null &&
-            !(RenameClientCapabilities.canParse(rename, reporter))) {
+            !RenameClientCapabilities.canParse(rename, reporter)) {
           reporter.reportError('must be of type RenameClientCapabilities');
           return false;
         }
@@ -38073,8 +38847,8 @@
       try {
         final selectionRange = obj['selectionRange'];
         if (selectionRange != null &&
-            !(SelectionRangeClientCapabilities.canParse(
-                selectionRange, reporter))) {
+            !SelectionRangeClientCapabilities.canParse(
+                selectionRange, reporter)) {
           reporter
               .reportError('must be of type SelectionRangeClientCapabilities');
           return false;
@@ -38086,8 +38860,8 @@
       try {
         final semanticTokens = obj['semanticTokens'];
         if (semanticTokens != null &&
-            !(SemanticTokensClientCapabilities.canParse(
-                semanticTokens, reporter))) {
+            !SemanticTokensClientCapabilities.canParse(
+                semanticTokens, reporter)) {
           reporter
               .reportError('must be of type SemanticTokensClientCapabilities');
           return false;
@@ -38099,8 +38873,8 @@
       try {
         final signatureHelp = obj['signatureHelp'];
         if (signatureHelp != null &&
-            !(SignatureHelpClientCapabilities.canParse(
-                signatureHelp, reporter))) {
+            !SignatureHelpClientCapabilities.canParse(
+                signatureHelp, reporter)) {
           reporter
               .reportError('must be of type SignatureHelpClientCapabilities');
           return false;
@@ -38112,8 +38886,8 @@
       try {
         final synchronization = obj['synchronization'];
         if (synchronization != null &&
-            !(TextDocumentSyncClientCapabilities.canParse(
-                synchronization, reporter))) {
+            !TextDocumentSyncClientCapabilities.canParse(
+                synchronization, reporter)) {
           reporter.reportError(
               'must be of type TextDocumentSyncClientCapabilities');
           return false;
@@ -38125,8 +38899,8 @@
       try {
         final typeDefinition = obj['typeDefinition'];
         if (typeDefinition != null &&
-            !(TypeDefinitionClientCapabilities.canParse(
-                typeDefinition, reporter))) {
+            !TypeDefinitionClientCapabilities.canParse(
+                typeDefinition, reporter)) {
           reporter
               .reportError('must be of type TypeDefinitionClientCapabilities');
           return false;
@@ -38138,10 +38912,10 @@
       try {
         final typeHierarchy = obj['typeHierarchy'];
         if (typeHierarchy != null &&
-            !(TypeHierarchyClientCapabilities1.canParse(
-                typeHierarchy, reporter))) {
+            !TypeHierarchyClientCapabilities.canParse(
+                typeHierarchy, reporter)) {
           reporter
-              .reportError('must be of type TypeHierarchyClientCapabilities1');
+              .reportError('must be of type TypeHierarchyClientCapabilities');
           return false;
         }
       } finally {
@@ -38266,6 +39040,7 @@
   /// The new text for the provided range.
   final String text;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['range'] = range.toJson();
@@ -38289,7 +39064,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(Range.canParse(range, reporter))) {
+        if (!Range.canParse(range, reporter)) {
           reporter.reportError('must be of type Range');
           return false;
         }
@@ -38299,7 +39074,7 @@
       reporter.push('rangeLength');
       try {
         final rangeLength = obj['rangeLength'];
-        if (rangeLength != null && !(rangeLength is int)) {
+        if (rangeLength != null && rangeLength is! int) {
           reporter.reportError('must be of type int');
           return false;
         }
@@ -38317,7 +39092,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(text is String)) {
+        if (text is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -38374,6 +39149,7 @@
   /// The new text of the whole document.
   final String text;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['text'] = text;
@@ -38393,7 +39169,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(text is String)) {
+        if (text is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -38464,6 +39240,7 @@
   /// The text document to change.
   final OptionalVersionedTextDocumentIdentifier textDocument;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['edits'] = edits;
@@ -38484,11 +39261,11 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!((edits is List<Object?> &&
-            (edits.every((item) =>
-                (AnnotatedTextEdit.canParse(item, reporter) ||
-                    SnippetTextEdit.canParse(item, reporter) ||
-                    TextEdit.canParse(item, reporter))))))) {
+        if (edits is! List<Object?> ||
+            edits.any((item) =>
+                !AnnotatedTextEdit.canParse(item, reporter) &&
+                !SnippetTextEdit.canParse(item, reporter) &&
+                !TextEdit.canParse(item, reporter))) {
           reporter.reportError(
               'must be of type List<Either3<AnnotatedTextEdit, SnippetTextEdit, TextEdit>>');
           return false;
@@ -38507,8 +39284,8 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(OptionalVersionedTextDocumentIdentifier.canParse(
-            textDocument, reporter))) {
+        if (!OptionalVersionedTextDocumentIdentifier.canParse(
+            textDocument, reporter)) {
           reporter.reportError(
               'must be of type OptionalVersionedTextDocumentIdentifier');
           return false;
@@ -38549,25 +39326,25 @@
   String toString() => jsonEncoder.convert(toJson());
 }
 
-class TextDocumentFilter implements ToJsonable {
+class TextDocumentFilterWithScheme implements ToJsonable {
   static const jsonHandler = LspJsonHandler(
-    TextDocumentFilter.canParse,
-    TextDocumentFilter.fromJson,
+    TextDocumentFilterWithScheme.canParse,
+    TextDocumentFilterWithScheme.fromJson,
   );
 
-  TextDocumentFilter({
+  TextDocumentFilterWithScheme({
     this.language,
     this.pattern,
     this.scheme,
   });
-  static TextDocumentFilter fromJson(Map<String, Object?> json) {
+  static TextDocumentFilterWithScheme fromJson(Map<String, Object?> json) {
     final languageJson = json['language'];
     final language = languageJson as String?;
     final patternJson = json['pattern'];
     final pattern = patternJson as String?;
     final schemeJson = json['scheme'];
     final scheme = schemeJson as String?;
-    return TextDocumentFilter(
+    return TextDocumentFilterWithScheme(
       language: language,
       pattern: pattern,
       scheme: scheme,
@@ -38595,6 +39372,7 @@
   /// A Uri [scheme](#Uri.scheme), like `file` or `untitled`.
   final String? scheme;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (language != null) {
@@ -38614,7 +39392,7 @@
       reporter.push('language');
       try {
         final language = obj['language'];
-        if (language != null && !(language is String)) {
+        if (language != null && language is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -38624,7 +39402,7 @@
       reporter.push('pattern');
       try {
         final pattern = obj['pattern'];
-        if (pattern != null && !(pattern is String)) {
+        if (pattern != null && pattern is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -38634,7 +39412,7 @@
       reporter.push('scheme');
       try {
         final scheme = obj['scheme'];
-        if (scheme != null && !(scheme is String)) {
+        if (scheme != null && scheme is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -38643,15 +39421,15 @@
       }
       return true;
     } else {
-      reporter.reportError('must be of type TextDocumentFilter');
+      reporter.reportError('must be of type TextDocumentFilterWithScheme');
       return false;
     }
   }
 
   @override
   bool operator ==(Object other) {
-    if (other is TextDocumentFilter &&
-        other.runtimeType == TextDocumentFilter) {
+    if (other is TextDocumentFilterWithScheme &&
+        other.runtimeType == TextDocumentFilterWithScheme) {
       return language == other.language &&
           pattern == other.pattern &&
           scheme == other.scheme &&
@@ -38698,6 +39476,7 @@
   /// The text document's URI.
   final String uri;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['uri'] = uri;
@@ -38717,7 +39496,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(uri is String)) {
+        if (uri is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -38789,6 +39568,7 @@
   /// including undo/redo).
   final int version;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['languageId'] = languageId;
@@ -38811,7 +39591,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(languageId is String)) {
+        if (languageId is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -38829,7 +39609,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(text is String)) {
+        if (text is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -38847,7 +39627,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(uri is String)) {
+        if (uri is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -38865,7 +39645,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(version is int)) {
+        if (version is! int) {
           reporter.reportError('must be of type int');
           return false;
         }
@@ -38976,6 +39756,7 @@
   /// The text document.
   final TextDocumentIdentifier textDocument;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['position'] = position.toJson();
@@ -38996,7 +39777,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(Position.canParse(position, reporter))) {
+        if (!Position.canParse(position, reporter)) {
           reporter.reportError('must be of type Position');
           return false;
         }
@@ -39014,7 +39795,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(TextDocumentIdentifier.canParse(textDocument, reporter))) {
+        if (!TextDocumentIdentifier.canParse(textDocument, reporter)) {
           reporter.reportError('must be of type TextDocumentIdentifier');
           return false;
         }
@@ -39159,8 +39940,8 @@
     }
     final documentSelectorJson = json['documentSelector'];
     final documentSelector = (documentSelectorJson as List<Object?>?)
-        ?.map(
-            (item) => TextDocumentFilter.fromJson(item as Map<String, Object?>))
+        ?.map((item) =>
+            TextDocumentFilterWithScheme.fromJson(item as Map<String, Object?>))
         .toList();
     return TextDocumentRegistrationOptions(
       documentSelector: documentSelector,
@@ -39169,8 +39950,9 @@
 
   /// A document selector to identify the scope of the registration. If set to
   /// null the document selector provided on the client side will be used.
-  final List<TextDocumentFilter>? documentSelector;
+  final List<TextDocumentFilterWithScheme>? documentSelector;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['documentSelector'] = documentSelector;
@@ -39187,10 +39969,11 @@
         }
         final documentSelector = obj['documentSelector'];
         if (documentSelector != null &&
-            !((documentSelector is List<Object?> &&
-                (documentSelector.every(
-                    (item) => TextDocumentFilter.canParse(item, reporter)))))) {
-          reporter.reportError('must be of type List<TextDocumentFilter>');
+            (documentSelector is! List<Object?> ||
+                documentSelector.any((item) =>
+                    !TextDocumentFilterWithScheme.canParse(item, reporter)))) {
+          reporter.reportError(
+              'must be of type List<TextDocumentFilterWithScheme>');
           return false;
         }
       } finally {
@@ -39207,8 +39990,12 @@
   bool operator ==(Object other) {
     if (other is TextDocumentRegistrationOptions &&
         other.runtimeType == TextDocumentRegistrationOptions) {
-      return listEqual(documentSelector, other.documentSelector,
-              (TextDocumentFilter a, TextDocumentFilter b) => a == b) &&
+      return listEqual(
+              documentSelector,
+              other.documentSelector,
+              (TextDocumentFilterWithScheme a,
+                      TextDocumentFilterWithScheme b) =>
+                  a == b) &&
           true;
     }
     return false;
@@ -39242,6 +40029,7 @@
   /// or by an API call.
   static const Manual = TextDocumentSaveReason(1);
 
+  @override
   Object toJson() => _value;
 
   @override
@@ -39250,6 +40038,7 @@
   @override
   int get hashCode => _value.hashCode;
 
+  @override
   bool operator ==(Object other) =>
       other is TextDocumentSaveReason && other._value == _value;
 }
@@ -39269,8 +40058,8 @@
       Map<String, Object?> json) {
     final documentSelectorJson = json['documentSelector'];
     final documentSelector = (documentSelectorJson as List<Object?>?)
-        ?.map(
-            (item) => TextDocumentFilter.fromJson(item as Map<String, Object?>))
+        ?.map((item) =>
+            TextDocumentFilterWithScheme.fromJson(item as Map<String, Object?>))
         .toList();
     final includeTextJson = json['includeText'];
     final includeText = includeTextJson as bool?;
@@ -39282,11 +40071,13 @@
 
   /// A document selector to identify the scope of the registration. If set to
   /// null the document selector provided on the client side will be used.
-  final List<TextDocumentFilter>? documentSelector;
+  @override
+  final List<TextDocumentFilterWithScheme>? documentSelector;
 
   /// The client is supposed to include the content on save.
   final bool? includeText;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['documentSelector'] = documentSelector;
@@ -39306,10 +40097,11 @@
         }
         final documentSelector = obj['documentSelector'];
         if (documentSelector != null &&
-            !((documentSelector is List<Object?> &&
-                (documentSelector.every(
-                    (item) => TextDocumentFilter.canParse(item, reporter)))))) {
-          reporter.reportError('must be of type List<TextDocumentFilter>');
+            (documentSelector is! List<Object?> ||
+                documentSelector.any((item) =>
+                    !TextDocumentFilterWithScheme.canParse(item, reporter)))) {
+          reporter.reportError(
+              'must be of type List<TextDocumentFilterWithScheme>');
           return false;
         }
       } finally {
@@ -39318,7 +40110,7 @@
       reporter.push('includeText');
       try {
         final includeText = obj['includeText'];
-        if (includeText != null && !(includeText is bool)) {
+        if (includeText != null && includeText is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -39337,8 +40129,12 @@
   bool operator ==(Object other) {
     if (other is TextDocumentSaveRegistrationOptions &&
         other.runtimeType == TextDocumentSaveRegistrationOptions) {
-      return listEqual(documentSelector, other.documentSelector,
-              (TextDocumentFilter a, TextDocumentFilter b) => a == b) &&
+      return listEqual(
+              documentSelector,
+              other.documentSelector,
+              (TextDocumentFilterWithScheme a,
+                      TextDocumentFilterWithScheme b) =>
+                  a == b) &&
           includeText == other.includeText &&
           true;
     }
@@ -39399,6 +40195,7 @@
   /// saved.
   final bool? willSaveWaitUntil;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (didSave != null) {
@@ -39421,7 +40218,7 @@
       reporter.push('didSave');
       try {
         final didSave = obj['didSave'];
-        if (didSave != null && !(didSave is bool)) {
+        if (didSave != null && didSave is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -39431,7 +40228,7 @@
       reporter.push('dynamicRegistration');
       try {
         final dynamicRegistration = obj['dynamicRegistration'];
-        if (dynamicRegistration != null && !(dynamicRegistration is bool)) {
+        if (dynamicRegistration != null && dynamicRegistration is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -39441,7 +40238,7 @@
       reporter.push('willSave');
       try {
         final willSave = obj['willSave'];
-        if (willSave != null && !(willSave is bool)) {
+        if (willSave != null && willSave is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -39451,7 +40248,7 @@
       reporter.push('willSaveWaitUntil');
       try {
         final willSaveWaitUntil = obj['willSaveWaitUntil'];
-        if (willSaveWaitUntil != null && !(willSaveWaitUntil is bool)) {
+        if (willSaveWaitUntil != null && willSaveWaitUntil is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -39513,6 +40310,7 @@
   /// Documents should not be synced at all.
   static const None = TextDocumentSyncKind(0);
 
+  @override
   Object toJson() => _value;
 
   @override
@@ -39521,6 +40319,7 @@
   @override
   int get hashCode => _value.hashCode;
 
+  @override
   bool operator ==(Object other) =>
       other is TextDocumentSyncKind && other._value == _value;
 }
@@ -39589,6 +40388,7 @@
   /// omitted the request should not be sent.
   final bool? willSaveWaitUntil;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (change != null) {
@@ -39615,7 +40415,7 @@
       try {
         final change = obj['change'];
         if (change != null &&
-            !(TextDocumentSyncKind.canParse(change, reporter))) {
+            !TextDocumentSyncKind.canParse(change, reporter)) {
           reporter.reportError('must be of type TextDocumentSyncKind');
           return false;
         }
@@ -39625,7 +40425,7 @@
       reporter.push('openClose');
       try {
         final openClose = obj['openClose'];
-        if (openClose != null && !(openClose is bool)) {
+        if (openClose != null && openClose is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -39636,7 +40436,8 @@
       try {
         final save = obj['save'];
         if (save != null &&
-            !((save is bool || SaveOptions.canParse(save, reporter)))) {
+            save is! bool &&
+            !SaveOptions.canParse(save, reporter)) {
           reporter.reportError('must be of type Either2<bool, SaveOptions>');
           return false;
         }
@@ -39646,7 +40447,7 @@
       reporter.push('willSave');
       try {
         final willSave = obj['willSave'];
-        if (willSave != null && !(willSave is bool)) {
+        if (willSave != null && willSave is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -39656,7 +40457,7 @@
       reporter.push('willSaveWaitUntil');
       try {
         final willSaveWaitUntil = obj['willSaveWaitUntil'];
-        if (willSaveWaitUntil != null && !(willSaveWaitUntil is bool)) {
+        if (willSaveWaitUntil != null && willSaveWaitUntil is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -39731,6 +40532,7 @@
   /// document create a range where start === end.
   final Range range;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['newText'] = newText;
@@ -39751,7 +40553,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(newText is String)) {
+        if (newText is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -39769,7 +40571,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(Range.canParse(range, reporter))) {
+        if (!Range.canParse(range, reporter)) {
           reporter.reportError('must be of type Range');
           return false;
         }
@@ -39813,6 +40615,7 @@
 
   static const Relative = TokenFormat('relative');
 
+  @override
   Object toJson() => _value;
 
   @override
@@ -39821,6 +40624,7 @@
   @override
   int get hashCode => _value.hashCode;
 
+  @override
   bool operator ==(Object other) =>
       other is TokenFormat && other._value == _value;
 }
@@ -39855,6 +40659,7 @@
   ///  @since 3.14.0
   final bool? linkSupport;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (dynamicRegistration != null) {
@@ -39871,7 +40676,7 @@
       reporter.push('dynamicRegistration');
       try {
         final dynamicRegistration = obj['dynamicRegistration'];
-        if (dynamicRegistration != null && !(dynamicRegistration is bool)) {
+        if (dynamicRegistration != null && dynamicRegistration is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -39881,7 +40686,7 @@
       reporter.push('linkSupport');
       try {
         final linkSupport = obj['linkSupport'];
-        if (linkSupport != null && !(linkSupport is bool)) {
+        if (linkSupport != null && linkSupport is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -39936,8 +40741,10 @@
     );
   }
 
+  @override
   final bool? workDoneProgress;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (workDoneProgress != null) {
@@ -39951,7 +40758,7 @@
       reporter.push('workDoneProgress');
       try {
         final workDoneProgress = obj['workDoneProgress'];
-        if (workDoneProgress != null && !(workDoneProgress is bool)) {
+        if (workDoneProgress != null && workDoneProgress is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -40030,17 +40837,22 @@
 
   /// An optional token that a server can use to report partial results (e.g.
   /// streaming) to the client.
+  @override
   final Either2<int, String>? partialResultToken;
 
   /// The position inside the text document.
+  @override
   final Position position;
 
   /// The text document.
+  @override
   final TextDocumentIdentifier textDocument;
 
   /// An optional token that a server can use to report work done progress.
+  @override
   final Either2<int, String>? workDoneToken;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (partialResultToken != null) {
@@ -40060,7 +40872,8 @@
       try {
         final partialResultToken = obj['partialResultToken'];
         if (partialResultToken != null &&
-            !((partialResultToken is int || partialResultToken is String))) {
+            partialResultToken is! int &&
+            partialResultToken is! String) {
           reporter.reportError('must be of type Either2<int, String>');
           return false;
         }
@@ -40078,7 +40891,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(Position.canParse(position, reporter))) {
+        if (!Position.canParse(position, reporter)) {
           reporter.reportError('must be of type Position');
           return false;
         }
@@ -40096,7 +40909,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(TextDocumentIdentifier.canParse(textDocument, reporter))) {
+        if (!TextDocumentIdentifier.canParse(textDocument, reporter)) {
           reporter.reportError('must be of type TextDocumentIdentifier');
           return false;
         }
@@ -40107,7 +40920,8 @@
       try {
         final workDoneToken = obj['workDoneToken'];
         if (workDoneToken != null &&
-            !((workDoneToken is int || workDoneToken is String))) {
+            workDoneToken is! int &&
+            workDoneToken is! String) {
           reporter.reportError('must be of type Either2<int, String>');
           return false;
         }
@@ -40165,8 +40979,8 @@
   static TypeDefinitionRegistrationOptions fromJson(Map<String, Object?> json) {
     final documentSelectorJson = json['documentSelector'];
     final documentSelector = (documentSelectorJson as List<Object?>?)
-        ?.map(
-            (item) => TextDocumentFilter.fromJson(item as Map<String, Object?>))
+        ?.map((item) =>
+            TextDocumentFilterWithScheme.fromJson(item as Map<String, Object?>))
         .toList();
     final idJson = json['id'];
     final id = idJson as String?;
@@ -40181,13 +40995,17 @@
 
   /// A document selector to identify the scope of the registration. If set to
   /// null the document selector provided on the client side will be used.
-  final List<TextDocumentFilter>? documentSelector;
+  @override
+  final List<TextDocumentFilterWithScheme>? documentSelector;
 
   /// The id used to register the request. The id can be used to deregister the
   /// request again. See also Registration#id.
+  @override
   final String? id;
+  @override
   final bool? workDoneProgress;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['documentSelector'] = documentSelector;
@@ -40210,10 +41028,11 @@
         }
         final documentSelector = obj['documentSelector'];
         if (documentSelector != null &&
-            !((documentSelector is List<Object?> &&
-                (documentSelector.every(
-                    (item) => TextDocumentFilter.canParse(item, reporter)))))) {
-          reporter.reportError('must be of type List<TextDocumentFilter>');
+            (documentSelector is! List<Object?> ||
+                documentSelector.any((item) =>
+                    !TextDocumentFilterWithScheme.canParse(item, reporter)))) {
+          reporter.reportError(
+              'must be of type List<TextDocumentFilterWithScheme>');
           return false;
         }
       } finally {
@@ -40222,7 +41041,7 @@
       reporter.push('id');
       try {
         final id = obj['id'];
-        if (id != null && !(id is String)) {
+        if (id != null && id is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -40232,7 +41051,7 @@
       reporter.push('workDoneProgress');
       try {
         final workDoneProgress = obj['workDoneProgress'];
-        if (workDoneProgress != null && !(workDoneProgress is bool)) {
+        if (workDoneProgress != null && workDoneProgress is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -40250,8 +41069,12 @@
   bool operator ==(Object other) {
     if (other is TypeDefinitionRegistrationOptions &&
         other.runtimeType == TypeDefinitionRegistrationOptions) {
-      return listEqual(documentSelector, other.documentSelector,
-              (TextDocumentFilter a, TextDocumentFilter b) => a == b) &&
+      return listEqual(
+              documentSelector,
+              other.documentSelector,
+              (TextDocumentFilterWithScheme a,
+                      TextDocumentFilterWithScheme b) =>
+                  a == b) &&
           id == other.id &&
           workDoneProgress == other.workDoneProgress &&
           true;
@@ -40270,19 +41093,19 @@
   String toString() => jsonEncoder.convert(toJson());
 }
 
-class TypeHierarchyClientCapabilities1 implements ToJsonable {
+class TypeHierarchyClientCapabilities implements ToJsonable {
   static const jsonHandler = LspJsonHandler(
-    TypeHierarchyClientCapabilities1.canParse,
-    TypeHierarchyClientCapabilities1.fromJson,
+    TypeHierarchyClientCapabilities.canParse,
+    TypeHierarchyClientCapabilities.fromJson,
   );
 
-  TypeHierarchyClientCapabilities1({
+  TypeHierarchyClientCapabilities({
     this.dynamicRegistration,
   });
-  static TypeHierarchyClientCapabilities1 fromJson(Map<String, Object?> json) {
+  static TypeHierarchyClientCapabilities fromJson(Map<String, Object?> json) {
     final dynamicRegistrationJson = json['dynamicRegistration'];
     final dynamicRegistration = dynamicRegistrationJson as bool?;
-    return TypeHierarchyClientCapabilities1(
+    return TypeHierarchyClientCapabilities(
       dynamicRegistration: dynamicRegistration,
     );
   }
@@ -40293,6 +41116,7 @@
   /// capability as well.
   final bool? dynamicRegistration;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (dynamicRegistration != null) {
@@ -40306,7 +41130,7 @@
       reporter.push('dynamicRegistration');
       try {
         final dynamicRegistration = obj['dynamicRegistration'];
-        if (dynamicRegistration != null && !(dynamicRegistration is bool)) {
+        if (dynamicRegistration != null && dynamicRegistration is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -40315,15 +41139,15 @@
       }
       return true;
     } else {
-      reporter.reportError('must be of type TypeHierarchyClientCapabilities1');
+      reporter.reportError('must be of type TypeHierarchyClientCapabilities');
       return false;
     }
   }
 
   @override
   bool operator ==(Object other) {
-    if (other is TypeHierarchyClientCapabilities1 &&
-        other.runtimeType == TypeHierarchyClientCapabilities1) {
+    if (other is TypeHierarchyClientCapabilities &&
+        other.runtimeType == TypeHierarchyClientCapabilities) {
       return dynamicRegistration == other.dynamicRegistration && true;
     }
     return false;
@@ -40414,6 +41238,7 @@
   /// The resource identifier of this item.
   final String uri;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (data != null) {
@@ -40438,7 +41263,7 @@
       reporter.push('detail');
       try {
         final detail = obj['detail'];
-        if (detail != null && !(detail is String)) {
+        if (detail != null && detail is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -40456,7 +41281,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(SymbolKind.canParse(kind, reporter))) {
+        if (!SymbolKind.canParse(kind, reporter)) {
           reporter.reportError('must be of type SymbolKind');
           return false;
         }
@@ -40474,7 +41299,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(name is String)) {
+        if (name is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -40492,7 +41317,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(Range.canParse(range, reporter))) {
+        if (!Range.canParse(range, reporter)) {
           reporter.reportError('must be of type Range');
           return false;
         }
@@ -40510,7 +41335,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(Range.canParse(selectionRange, reporter))) {
+        if (!Range.canParse(selectionRange, reporter)) {
           reporter.reportError('must be of type Range');
           return false;
         }
@@ -40521,8 +41346,8 @@
       try {
         final tags = obj['tags'];
         if (tags != null &&
-            !((tags is List<Object?> &&
-                (tags.every((item) => SymbolTag.canParse(item, reporter)))))) {
+            (tags is! List<Object?> ||
+                tags.any((item) => !SymbolTag.canParse(item, reporter)))) {
           reporter.reportError('must be of type List<SymbolTag>');
           return false;
         }
@@ -40540,7 +41365,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(uri is String)) {
+        if (uri is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -40606,8 +41431,10 @@
     );
   }
 
+  @override
   final bool? workDoneProgress;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (workDoneProgress != null) {
@@ -40621,7 +41448,7 @@
       reporter.push('workDoneProgress');
       try {
         final workDoneProgress = obj['workDoneProgress'];
-        if (workDoneProgress != null && !(workDoneProgress is bool)) {
+        if (workDoneProgress != null && workDoneProgress is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -40685,14 +41512,18 @@
   }
 
   /// The position inside the text document.
+  @override
   final Position position;
 
   /// The text document.
+  @override
   final TextDocumentIdentifier textDocument;
 
   /// An optional token that a server can use to report work done progress.
+  @override
   final Either2<int, String>? workDoneToken;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['position'] = position.toJson();
@@ -40716,7 +41547,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(Position.canParse(position, reporter))) {
+        if (!Position.canParse(position, reporter)) {
           reporter.reportError('must be of type Position');
           return false;
         }
@@ -40734,7 +41565,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(TextDocumentIdentifier.canParse(textDocument, reporter))) {
+        if (!TextDocumentIdentifier.canParse(textDocument, reporter)) {
           reporter.reportError('must be of type TextDocumentIdentifier');
           return false;
         }
@@ -40745,7 +41576,8 @@
       try {
         final workDoneToken = obj['workDoneToken'];
         if (workDoneToken != null &&
-            !((workDoneToken is int || workDoneToken is String))) {
+            workDoneToken is! int &&
+            workDoneToken is! String) {
           reporter.reportError('must be of type Either2<int, String>');
           return false;
         }
@@ -40801,8 +41633,8 @@
   static TypeHierarchyRegistrationOptions fromJson(Map<String, Object?> json) {
     final documentSelectorJson = json['documentSelector'];
     final documentSelector = (documentSelectorJson as List<Object?>?)
-        ?.map(
-            (item) => TextDocumentFilter.fromJson(item as Map<String, Object?>))
+        ?.map((item) =>
+            TextDocumentFilterWithScheme.fromJson(item as Map<String, Object?>))
         .toList();
     final idJson = json['id'];
     final id = idJson as String?;
@@ -40817,13 +41649,17 @@
 
   /// A document selector to identify the scope of the registration. If set to
   /// null the document selector provided on the client side will be used.
-  final List<TextDocumentFilter>? documentSelector;
+  @override
+  final List<TextDocumentFilterWithScheme>? documentSelector;
 
   /// The id used to register the request. The id can be used to deregister the
   /// request again. See also Registration#id.
+  @override
   final String? id;
+  @override
   final bool? workDoneProgress;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['documentSelector'] = documentSelector;
@@ -40846,10 +41682,11 @@
         }
         final documentSelector = obj['documentSelector'];
         if (documentSelector != null &&
-            !((documentSelector is List<Object?> &&
-                (documentSelector.every(
-                    (item) => TextDocumentFilter.canParse(item, reporter)))))) {
-          reporter.reportError('must be of type List<TextDocumentFilter>');
+            (documentSelector is! List<Object?> ||
+                documentSelector.any((item) =>
+                    !TextDocumentFilterWithScheme.canParse(item, reporter)))) {
+          reporter.reportError(
+              'must be of type List<TextDocumentFilterWithScheme>');
           return false;
         }
       } finally {
@@ -40858,7 +41695,7 @@
       reporter.push('id');
       try {
         final id = obj['id'];
-        if (id != null && !(id is String)) {
+        if (id != null && id is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -40868,7 +41705,7 @@
       reporter.push('workDoneProgress');
       try {
         final workDoneProgress = obj['workDoneProgress'];
-        if (workDoneProgress != null && !(workDoneProgress is bool)) {
+        if (workDoneProgress != null && workDoneProgress is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -40886,8 +41723,12 @@
   bool operator ==(Object other) {
     if (other is TypeHierarchyRegistrationOptions &&
         other.runtimeType == TypeHierarchyRegistrationOptions) {
-      return listEqual(documentSelector, other.documentSelector,
-              (TextDocumentFilter a, TextDocumentFilter b) => a == b) &&
+      return listEqual(
+              documentSelector,
+              other.documentSelector,
+              (TextDocumentFilterWithScheme a,
+                      TextDocumentFilterWithScheme b) =>
+                  a == b) &&
           id == other.id &&
           workDoneProgress == other.workDoneProgress &&
           true;
@@ -40948,11 +41789,14 @@
 
   /// An optional token that a server can use to report partial results (e.g.
   /// streaming) to the client.
+  @override
   final Either2<int, String>? partialResultToken;
 
   /// An optional token that a server can use to report work done progress.
+  @override
   final Either2<int, String>? workDoneToken;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['item'] = item.toJson();
@@ -40978,7 +41822,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(TypeHierarchyItem.canParse(item, reporter))) {
+        if (!TypeHierarchyItem.canParse(item, reporter)) {
           reporter.reportError('must be of type TypeHierarchyItem');
           return false;
         }
@@ -40989,7 +41833,8 @@
       try {
         final partialResultToken = obj['partialResultToken'];
         if (partialResultToken != null &&
-            !((partialResultToken is int || partialResultToken is String))) {
+            partialResultToken is! int &&
+            partialResultToken is! String) {
           reporter.reportError('must be of type Either2<int, String>');
           return false;
         }
@@ -41000,7 +41845,8 @@
       try {
         final workDoneToken = obj['workDoneToken'];
         if (workDoneToken != null &&
-            !((workDoneToken is int || workDoneToken is String))) {
+            workDoneToken is! int &&
+            workDoneToken is! String) {
           reporter.reportError('must be of type Either2<int, String>');
           return false;
         }
@@ -41079,11 +41925,14 @@
 
   /// An optional token that a server can use to report partial results (e.g.
   /// streaming) to the client.
+  @override
   final Either2<int, String>? partialResultToken;
 
   /// An optional token that a server can use to report work done progress.
+  @override
   final Either2<int, String>? workDoneToken;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['item'] = item.toJson();
@@ -41109,7 +41958,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(TypeHierarchyItem.canParse(item, reporter))) {
+        if (!TypeHierarchyItem.canParse(item, reporter)) {
           reporter.reportError('must be of type TypeHierarchyItem');
           return false;
         }
@@ -41120,7 +41969,8 @@
       try {
         final partialResultToken = obj['partialResultToken'];
         if (partialResultToken != null &&
-            !((partialResultToken is int || partialResultToken is String))) {
+            partialResultToken is! int &&
+            partialResultToken is! String) {
           reporter.reportError('must be of type Either2<int, String>');
           return false;
         }
@@ -41131,7 +41981,8 @@
       try {
         final workDoneToken = obj['workDoneToken'];
         if (workDoneToken != null &&
-            !((workDoneToken is int || workDoneToken is String))) {
+            workDoneToken is! int &&
+            workDoneToken is! String) {
           reporter.reportError('must be of type Either2<int, String>');
           return false;
         }
@@ -41212,6 +42063,7 @@
   /// document.
   final String resultId;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['kind'] = kind;
@@ -41232,7 +42084,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(kind == 'unchanged')) {
+        if (kind != 'unchanged') {
           reporter.reportError('must be the literal \'unchanged\'');
           return false;
         }
@@ -41250,7 +42102,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(resultId is String)) {
+        if (resultId is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -41309,6 +42161,7 @@
   /// The moniker is unique inside the moniker scheme.
   static const scheme = UniquenessLevel('scheme');
 
+  @override
   Object toJson() => _value;
 
   @override
@@ -41317,6 +42170,7 @@
   @override
   int get hashCode => _value.hashCode;
 
+  @override
   bool operator ==(Object other) =>
       other is UniquenessLevel && other._value == _value;
 }
@@ -41350,6 +42204,7 @@
   /// The method / capability to unregister for.
   final String method;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['id'] = id;
@@ -41370,7 +42225,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(id is String)) {
+        if (id is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -41388,7 +42243,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(method is String)) {
+        if (method is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -41444,6 +42299,7 @@
   /// of the specification.
   final List<Unregistration> unregisterations;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['unregisterations'] =
@@ -41464,9 +42320,9 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!((unregisterations is List<Object?> &&
-            (unregisterations
-                .every((item) => Unregistration.canParse(item, reporter)))))) {
+        if (unregisterations is! List<Object?> ||
+            unregisterations
+                .any((item) => !Unregistration.canParse(item, reporter))) {
           reporter.reportError('must be of type List<Unregistration>');
           return false;
         }
@@ -41528,6 +42384,7 @@
   /// The version number of this notebook document.
   final int version;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['uri'] = uri;
@@ -41548,7 +42405,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(uri is String)) {
+        if (uri is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -41566,7 +42423,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(version is int)) {
+        if (version is! int) {
           reporter.reportError('must be of type int');
           return false;
         }
@@ -41623,6 +42480,7 @@
   }
 
   /// The text document's URI.
+  @override
   final String uri;
 
   /// The version number of this document.
@@ -41631,6 +42489,7 @@
   /// including undo/redo. The number doesn't need to be consecutive.
   final int version;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['uri'] = uri;
@@ -41651,7 +42510,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(uri is String)) {
+        if (uri is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -41669,7 +42528,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(version is int)) {
+        if (version is! int) {
           reporter.reportError('must be of type int');
           return false;
         }
@@ -41721,6 +42580,7 @@
   /// Interested in delete events
   static const Delete = WatchKind(4);
 
+  @override
   Object toJson() => _value;
 
   @override
@@ -41729,6 +42589,7 @@
   @override
   int get hashCode => _value.hashCode;
 
+  @override
   bool operator ==(Object other) =>
       other is WatchKind && other._value == _value;
 }
@@ -41762,6 +42623,7 @@
   /// The document that will be saved.
   final TextDocumentIdentifier textDocument;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['reason'] = reason.toJson();
@@ -41782,7 +42644,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(TextDocumentSaveReason.canParse(reason, reporter))) {
+        if (!TextDocumentSaveReason.canParse(reason, reporter)) {
           reporter.reportError('must be of type TextDocumentSaveReason');
           return false;
         }
@@ -41800,7 +42662,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(TextDocumentIdentifier.canParse(textDocument, reporter))) {
+        if (!TextDocumentIdentifier.canParse(textDocument, reporter)) {
           reporter.reportError('must be of type TextDocumentIdentifier');
           return false;
         }
@@ -41883,6 +42745,7 @@
   ///  @since 3.15.0
   final bool? workDoneProgress;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (showDocument != null) {
@@ -41903,8 +42766,7 @@
       try {
         final showDocument = obj['showDocument'];
         if (showDocument != null &&
-            !(ShowDocumentClientCapabilities.canParse(
-                showDocument, reporter))) {
+            !ShowDocumentClientCapabilities.canParse(showDocument, reporter)) {
           reporter
               .reportError('must be of type ShowDocumentClientCapabilities');
           return false;
@@ -41916,8 +42778,8 @@
       try {
         final showMessage = obj['showMessage'];
         if (showMessage != null &&
-            !(ShowMessageRequestClientCapabilities.canParse(
-                showMessage, reporter))) {
+            !ShowMessageRequestClientCapabilities.canParse(
+                showMessage, reporter)) {
           reporter.reportError(
               'must be of type ShowMessageRequestClientCapabilities');
           return false;
@@ -41928,7 +42790,7 @@
       reporter.push('workDoneProgress');
       try {
         final workDoneProgress = obj['workDoneProgress'];
-        if (workDoneProgress != null && !(workDoneProgress is bool)) {
+        if (workDoneProgress != null && workDoneProgress is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -42029,6 +42891,7 @@
   /// Examples: "Indexing" or "Linking dependencies".
   final String title;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (cancellable != null) {
@@ -42050,7 +42913,7 @@
       reporter.push('cancellable');
       try {
         final cancellable = obj['cancellable'];
-        if (cancellable != null && !(cancellable is bool)) {
+        if (cancellable != null && cancellable is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -42068,7 +42931,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(kind == 'begin')) {
+        if (kind != 'begin') {
           reporter.reportError('must be the literal \'begin\'');
           return false;
         }
@@ -42078,7 +42941,7 @@
       reporter.push('message');
       try {
         final message = obj['message'];
-        if (message != null && !(message is String)) {
+        if (message != null && message is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -42088,7 +42951,7 @@
       reporter.push('percentage');
       try {
         final percentage = obj['percentage'];
-        if (percentage != null && !(percentage is int)) {
+        if (percentage != null && percentage is! int) {
           reporter.reportError('must be of type int');
           return false;
         }
@@ -42106,7 +42969,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(title is String)) {
+        if (title is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -42171,6 +43034,7 @@
   /// The token to be used to report progress.
   final Either2<int, String> token;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['token'] = token;
@@ -42190,7 +43054,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!((token is int || token is String))) {
+        if (token is! int && token is! String) {
           reporter.reportError('must be of type Either2<int, String>');
           return false;
         }
@@ -42244,6 +43108,7 @@
   /// The token to be used to report progress.
   final Either2<int, String> token;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['token'] = token;
@@ -42263,7 +43128,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!((token is int || token is String))) {
+        if (token is! int && token is! String) {
           reporter.reportError('must be of type Either2<int, String>');
           return false;
         }
@@ -42324,6 +43189,7 @@
   /// of the operation.
   final String? message;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['kind'] = kind;
@@ -42346,7 +43212,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(kind == 'end')) {
+        if (kind != 'end') {
           reporter.reportError('must be the literal \'end\'');
           return false;
         }
@@ -42356,7 +43222,7 @@
       reporter.push('message');
       try {
         final message = obj['message'];
-        if (message != null && !(message is String)) {
+        if (message != null && message is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -42495,6 +43361,7 @@
 
   final bool? workDoneProgress;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (workDoneProgress != null) {
@@ -42508,7 +43375,7 @@
       reporter.push('workDoneProgress');
       try {
         final workDoneProgress = obj['workDoneProgress'];
-        if (workDoneProgress != null && !(workDoneProgress is bool)) {
+        if (workDoneProgress != null && workDoneProgress is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -42656,6 +43523,9 @@
     if (MonikerParams.canParse(json, nullLspJsonReporter)) {
       return MonikerParams.fromJson(json);
     }
+    if (PrepareRenameParams.canParse(json, nullLspJsonReporter)) {
+      return PrepareRenameParams.fromJson(json);
+    }
     if (TypeDefinitionParams.canParse(json, nullLspJsonReporter)) {
       return TypeDefinitionParams.fromJson(json);
     }
@@ -42678,6 +43548,7 @@
   /// An optional token that a server can use to report work done progress.
   final Either2<int, String>? workDoneToken;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (workDoneToken != null) {
@@ -42692,7 +43563,8 @@
       try {
         final workDoneToken = obj['workDoneToken'];
         if (workDoneToken != null &&
-            !((workDoneToken is int || workDoneToken is String))) {
+            workDoneToken is! int &&
+            workDoneToken is! String) {
           reporter.reportError('must be of type Either2<int, String>');
           return false;
         }
@@ -42778,6 +43650,7 @@
   /// that are not following this rule. The value range is [0, 100]
   final int? percentage;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (cancellable != null) {
@@ -42798,7 +43671,7 @@
       reporter.push('cancellable');
       try {
         final cancellable = obj['cancellable'];
-        if (cancellable != null && !(cancellable is bool)) {
+        if (cancellable != null && cancellable is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -42816,7 +43689,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(kind == 'report')) {
+        if (kind != 'report') {
           reporter.reportError('must be the literal \'report\'');
           return false;
         }
@@ -42826,7 +43699,7 @@
       reporter.push('message');
       try {
         final message = obj['message'];
-        if (message != null && !(message is String)) {
+        if (message != null && message is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -42836,7 +43709,7 @@
       reporter.push('percentage');
       try {
         final percentage = obj['percentage'];
-        if (percentage != null && !(percentage is int)) {
+        if (percentage != null && percentage is! int) {
           reporter.reportError('must be of type int');
           return false;
         }
@@ -43031,6 +43904,7 @@
   ///  @since 3.6.0
   final bool? workspaceFolders;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (applyEdit != null) {
@@ -43083,7 +43957,7 @@
       reporter.push('applyEdit');
       try {
         final applyEdit = obj['applyEdit'];
-        if (applyEdit != null && !(applyEdit is bool)) {
+        if (applyEdit != null && applyEdit is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -43094,8 +43968,7 @@
       try {
         final codeLens = obj['codeLens'];
         if (codeLens != null &&
-            !(CodeLensWorkspaceClientCapabilities.canParse(
-                codeLens, reporter))) {
+            !CodeLensWorkspaceClientCapabilities.canParse(codeLens, reporter)) {
           reporter.reportError(
               'must be of type CodeLensWorkspaceClientCapabilities');
           return false;
@@ -43106,7 +43979,7 @@
       reporter.push('configuration');
       try {
         final configuration = obj['configuration'];
-        if (configuration != null && !(configuration is bool)) {
+        if (configuration != null && configuration is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -43117,8 +43990,8 @@
       try {
         final diagnostics = obj['diagnostics'];
         if (diagnostics != null &&
-            !(DiagnosticWorkspaceClientCapabilities.canParse(
-                diagnostics, reporter))) {
+            !DiagnosticWorkspaceClientCapabilities.canParse(
+                diagnostics, reporter)) {
           reporter.reportError(
               'must be of type DiagnosticWorkspaceClientCapabilities');
           return false;
@@ -43130,8 +44003,8 @@
       try {
         final didChangeConfiguration = obj['didChangeConfiguration'];
         if (didChangeConfiguration != null &&
-            !(DidChangeConfigurationClientCapabilities.canParse(
-                didChangeConfiguration, reporter))) {
+            !DidChangeConfigurationClientCapabilities.canParse(
+                didChangeConfiguration, reporter)) {
           reporter.reportError(
               'must be of type DidChangeConfigurationClientCapabilities');
           return false;
@@ -43143,8 +44016,8 @@
       try {
         final didChangeWatchedFiles = obj['didChangeWatchedFiles'];
         if (didChangeWatchedFiles != null &&
-            !(DidChangeWatchedFilesClientCapabilities.canParse(
-                didChangeWatchedFiles, reporter))) {
+            !DidChangeWatchedFilesClientCapabilities.canParse(
+                didChangeWatchedFiles, reporter)) {
           reporter.reportError(
               'must be of type DidChangeWatchedFilesClientCapabilities');
           return false;
@@ -43156,8 +44029,8 @@
       try {
         final executeCommand = obj['executeCommand'];
         if (executeCommand != null &&
-            !(ExecuteCommandClientCapabilities.canParse(
-                executeCommand, reporter))) {
+            !ExecuteCommandClientCapabilities.canParse(
+                executeCommand, reporter)) {
           reporter
               .reportError('must be of type ExecuteCommandClientCapabilities');
           return false;
@@ -43169,8 +44042,8 @@
       try {
         final fileOperations = obj['fileOperations'];
         if (fileOperations != null &&
-            !(FileOperationClientCapabilities.canParse(
-                fileOperations, reporter))) {
+            !FileOperationClientCapabilities.canParse(
+                fileOperations, reporter)) {
           reporter
               .reportError('must be of type FileOperationClientCapabilities');
           return false;
@@ -43182,8 +44055,8 @@
       try {
         final inlayHint = obj['inlayHint'];
         if (inlayHint != null &&
-            !(InlayHintWorkspaceClientCapabilities.canParse(
-                inlayHint, reporter))) {
+            !InlayHintWorkspaceClientCapabilities.canParse(
+                inlayHint, reporter)) {
           reporter.reportError(
               'must be of type InlayHintWorkspaceClientCapabilities');
           return false;
@@ -43195,8 +44068,8 @@
       try {
         final inlineValue = obj['inlineValue'];
         if (inlineValue != null &&
-            !(InlineValueWorkspaceClientCapabilities.canParse(
-                inlineValue, reporter))) {
+            !InlineValueWorkspaceClientCapabilities.canParse(
+                inlineValue, reporter)) {
           reporter.reportError(
               'must be of type InlineValueWorkspaceClientCapabilities');
           return false;
@@ -43208,8 +44081,8 @@
       try {
         final semanticTokens = obj['semanticTokens'];
         if (semanticTokens != null &&
-            !(SemanticTokensWorkspaceClientCapabilities.canParse(
-                semanticTokens, reporter))) {
+            !SemanticTokensWorkspaceClientCapabilities.canParse(
+                semanticTokens, reporter)) {
           reporter.reportError(
               'must be of type SemanticTokensWorkspaceClientCapabilities');
           return false;
@@ -43221,7 +44094,7 @@
       try {
         final symbol = obj['symbol'];
         if (symbol != null &&
-            !(WorkspaceSymbolClientCapabilities.canParse(symbol, reporter))) {
+            !WorkspaceSymbolClientCapabilities.canParse(symbol, reporter)) {
           reporter
               .reportError('must be of type WorkspaceSymbolClientCapabilities');
           return false;
@@ -43233,8 +44106,8 @@
       try {
         final workspaceEdit = obj['workspaceEdit'];
         if (workspaceEdit != null &&
-            !(WorkspaceEditClientCapabilities.canParse(
-                workspaceEdit, reporter))) {
+            !WorkspaceEditClientCapabilities.canParse(
+                workspaceEdit, reporter)) {
           reporter
               .reportError('must be of type WorkspaceEditClientCapabilities');
           return false;
@@ -43245,7 +44118,7 @@
       reporter.push('workspaceFolders');
       try {
         final workspaceFolders = obj['workspaceFolders'];
-        if (workspaceFolders != null && !(workspaceFolders is bool)) {
+        if (workspaceFolders != null && workspaceFolders is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -43355,14 +44228,17 @@
 
   /// An optional token that a server can use to report partial results (e.g.
   /// streaming) to the client.
+  @override
   final Either2<int, String>? partialResultToken;
 
   /// The currently known diagnostic reports with their previous result ids.
   final List<PreviousResultId> previousResultIds;
 
   /// An optional token that a server can use to report work done progress.
+  @override
   final Either2<int, String>? workDoneToken;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (identifier != null) {
@@ -43384,7 +44260,7 @@
       reporter.push('identifier');
       try {
         final identifier = obj['identifier'];
-        if (identifier != null && !(identifier is String)) {
+        if (identifier != null && identifier is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -43395,7 +44271,8 @@
       try {
         final partialResultToken = obj['partialResultToken'];
         if (partialResultToken != null &&
-            !((partialResultToken is int || partialResultToken is String))) {
+            partialResultToken is! int &&
+            partialResultToken is! String) {
           reporter.reportError('must be of type Either2<int, String>');
           return false;
         }
@@ -43413,9 +44290,9 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!((previousResultIds is List<Object?> &&
-            (previousResultIds.every(
-                (item) => PreviousResultId.canParse(item, reporter)))))) {
+        if (previousResultIds is! List<Object?> ||
+            previousResultIds
+                .any((item) => !PreviousResultId.canParse(item, reporter))) {
           reporter.reportError('must be of type List<PreviousResultId>');
           return false;
         }
@@ -43426,7 +44303,8 @@
       try {
         final workDoneToken = obj['workDoneToken'];
         if (workDoneToken != null &&
-            !((workDoneToken is int || workDoneToken is String))) {
+            workDoneToken is! int &&
+            workDoneToken is! String) {
           reporter.reportError('must be of type Either2<int, String>');
           return false;
         }
@@ -43501,6 +44379,7 @@
       Either2<WorkspaceFullDocumentDiagnosticReport,
           WorkspaceUnchangedDocumentDiagnosticReport>> items;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['items'] = items;
@@ -43520,12 +44399,12 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!((items is List<Object?> &&
-            (items.every((item) =>
-                (WorkspaceFullDocumentDiagnosticReport.canParse(
-                        item, reporter) ||
-                    WorkspaceUnchangedDocumentDiagnosticReport.canParse(
-                        item, reporter))))))) {
+        if (items is! List<Object?> ||
+            items.any((item) =>
+                !WorkspaceFullDocumentDiagnosticReport.canParse(
+                    item, reporter) &&
+                !WorkspaceUnchangedDocumentDiagnosticReport.canParse(
+                    item, reporter))) {
           reporter.reportError(
               'must be of type List<Either2<WorkspaceFullDocumentDiagnosticReport, WorkspaceUnchangedDocumentDiagnosticReport>>');
           return false;
@@ -43602,6 +44481,7 @@
       Either2<WorkspaceFullDocumentDiagnosticReport,
           WorkspaceUnchangedDocumentDiagnosticReport>> items;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['items'] = items;
@@ -43621,12 +44501,12 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!((items is List<Object?> &&
-            (items.every((item) =>
-                (WorkspaceFullDocumentDiagnosticReport.canParse(
-                        item, reporter) ||
-                    WorkspaceUnchangedDocumentDiagnosticReport.canParse(
-                        item, reporter))))))) {
+        if (items is! List<Object?> ||
+            items.any((item) =>
+                !WorkspaceFullDocumentDiagnosticReport.canParse(
+                    item, reporter) &&
+                !WorkspaceUnchangedDocumentDiagnosticReport.canParse(
+                    item, reporter))) {
           reporter.reportError(
               'must be of type List<Either2<WorkspaceFullDocumentDiagnosticReport, WorkspaceUnchangedDocumentDiagnosticReport>>');
           return false;
@@ -43742,6 +44622,7 @@
   final List<Either4<CreateFile, DeleteFile, RenameFile, TextDocumentEdit>>?
       documentChanges;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (changeAnnotations != null) {
@@ -43762,11 +44643,11 @@
       try {
         final changeAnnotations = obj['changeAnnotations'];
         if (changeAnnotations != null &&
-            !((changeAnnotations is Map &&
-                (changeAnnotations.keys.every((item) =>
-                    item is String &&
-                    changeAnnotations.values.every((item) =>
-                        ChangeAnnotation.canParse(item, reporter))))))) {
+            (changeAnnotations is! Map ||
+                (changeAnnotations.keys.any((item) =>
+                    item is! String ||
+                    changeAnnotations.values.any((item) =>
+                        !ChangeAnnotation.canParse(item, reporter)))))) {
           reporter.reportError('must be of type Map<String, ChangeAnnotation>');
           return false;
         }
@@ -43777,12 +44658,13 @@
       try {
         final changes = obj['changes'];
         if (changes != null &&
-            !((changes is Map &&
-                (changes.keys.every((item) =>
-                    item is String &&
-                    changes.values.every((item) => (item is List<Object?> &&
-                        (item.every((item) =>
-                            TextEdit.canParse(item, reporter)))))))))) {
+            (changes is! Map ||
+                (changes.keys.any((item) =>
+                    item is! String ||
+                    changes.values.any((item) =>
+                        item is! List<Object?> ||
+                        item.any(
+                            (item) => !TextEdit.canParse(item, reporter))))))) {
           reporter.reportError('must be of type Map<String, List<TextEdit>>');
           return false;
         }
@@ -43793,12 +44675,12 @@
       try {
         final documentChanges = obj['documentChanges'];
         if (documentChanges != null &&
-            !((documentChanges is List<Object?> &&
-                (documentChanges.every((item) =>
-                    (CreateFile.canParse(item, reporter) ||
-                        DeleteFile.canParse(item, reporter) ||
-                        RenameFile.canParse(item, reporter) ||
-                        TextDocumentEdit.canParse(item, reporter))))))) {
+            (documentChanges is! List<Object?> ||
+                documentChanges.any((item) =>
+                    !CreateFile.canParse(item, reporter) &&
+                    !DeleteFile.canParse(item, reporter) &&
+                    !RenameFile.canParse(item, reporter) &&
+                    !TextDocumentEdit.canParse(item, reporter)))) {
           reporter.reportError(
               'must be of type List<Either4<CreateFile, DeleteFile, RenameFile, TextDocumentEdit>>');
           return false;
@@ -43912,6 +44794,7 @@
   ///  @since 3.13.0
   final List<ResourceOperationKind>? resourceOperations;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (changeAnnotationSupport != null) {
@@ -43939,8 +44822,8 @@
       try {
         final changeAnnotationSupport = obj['changeAnnotationSupport'];
         if (changeAnnotationSupport != null &&
-            !(WorkspaceEditClientCapabilitiesChangeAnnotationSupport.canParse(
-                changeAnnotationSupport, reporter))) {
+            !WorkspaceEditClientCapabilitiesChangeAnnotationSupport.canParse(
+                changeAnnotationSupport, reporter)) {
           reporter.reportError(
               'must be of type WorkspaceEditClientCapabilitiesChangeAnnotationSupport');
           return false;
@@ -43951,7 +44834,7 @@
       reporter.push('documentChanges');
       try {
         final documentChanges = obj['documentChanges'];
-        if (documentChanges != null && !(documentChanges is bool)) {
+        if (documentChanges != null && documentChanges is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -43962,7 +44845,7 @@
       try {
         final failureHandling = obj['failureHandling'];
         if (failureHandling != null &&
-            !(FailureHandlingKind.canParse(failureHandling, reporter))) {
+            !FailureHandlingKind.canParse(failureHandling, reporter)) {
           reporter.reportError('must be of type FailureHandlingKind');
           return false;
         }
@@ -43972,7 +44855,7 @@
       reporter.push('normalizesLineEndings');
       try {
         final normalizesLineEndings = obj['normalizesLineEndings'];
-        if (normalizesLineEndings != null && !(normalizesLineEndings is bool)) {
+        if (normalizesLineEndings != null && normalizesLineEndings is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -43983,9 +44866,9 @@
       try {
         final resourceOperations = obj['resourceOperations'];
         if (resourceOperations != null &&
-            !((resourceOperations is List<Object?> &&
-                (resourceOperations.every((item) =>
-                    ResourceOperationKind.canParse(item, reporter)))))) {
+            (resourceOperations is! List<Object?> ||
+                resourceOperations.any((item) =>
+                    !ResourceOperationKind.canParse(item, reporter)))) {
           reporter.reportError('must be of type List<ResourceOperationKind>');
           return false;
         }
@@ -44051,6 +44934,7 @@
   /// node.
   final bool? groupsOnLabel;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (groupsOnLabel != null) {
@@ -44064,7 +44948,7 @@
       reporter.push('groupsOnLabel');
       try {
         final groupsOnLabel = obj['groupsOnLabel'];
-        if (groupsOnLabel != null && !(groupsOnLabel is bool)) {
+        if (groupsOnLabel != null && groupsOnLabel is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -44124,6 +45008,7 @@
   /// The associated URI for this workspace folder.
   final String uri;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['name'] = name;
@@ -44144,7 +45029,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(name is String)) {
+        if (name is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -44162,7 +45047,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(uri is String)) {
+        if (uri is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -44226,6 +45111,7 @@
   /// The array of the removed workspace folders
   final List<WorkspaceFolder> removed;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['added'] = added.map((item) => item.toJson()).toList();
@@ -44246,9 +45132,8 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!((added is List<Object?> &&
-            (added
-                .every((item) => WorkspaceFolder.canParse(item, reporter)))))) {
+        if (added is! List<Object?> ||
+            added.any((item) => !WorkspaceFolder.canParse(item, reporter))) {
           reporter.reportError('must be of type List<WorkspaceFolder>');
           return false;
         }
@@ -44266,9 +45151,8 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!((removed is List<Object?> &&
-            (removed
-                .every((item) => WorkspaceFolder.canParse(item, reporter)))))) {
+        if (removed is! List<Object?> ||
+            removed.any((item) => !WorkspaceFolder.canParse(item, reporter))) {
           reporter.reportError('must be of type List<WorkspaceFolder>');
           return false;
         }
@@ -44344,6 +45228,7 @@
   /// The server has support for workspace folders
   final bool? supported;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (changeNotifications != null) {
@@ -44361,7 +45246,8 @@
       try {
         final changeNotifications = obj['changeNotifications'];
         if (changeNotifications != null &&
-            !((changeNotifications is bool || changeNotifications is String))) {
+            changeNotifications is! bool &&
+            changeNotifications is! String) {
           reporter.reportError('must be of type Either2<bool, String>');
           return false;
         }
@@ -44371,7 +45257,7 @@
       reporter.push('supported');
       try {
         final supported = obj['supported'];
-        if (supported != null && !(supported is bool)) {
+        if (supported != null && supported is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -44451,13 +45337,16 @@
   }
 
   /// The actual items.
+  @override
   final List<Diagnostic> items;
 
   /// A full document diagnostic report.
+  @override
   final String kind;
 
   /// An optional result id. If provided it will be sent on the next diagnostic
   /// request for the same document.
+  @override
   final String? resultId;
 
   /// The URI for which diagnostic information is reported.
@@ -44467,6 +45356,7 @@
   /// is not marked as open `null` can be provided.
   final int? version;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['items'] = items.map((item) => item.toJson()).toList();
@@ -44492,8 +45382,8 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!((items is List<Object?> &&
-            (items.every((item) => Diagnostic.canParse(item, reporter)))))) {
+        if (items is! List<Object?> ||
+            items.any((item) => !Diagnostic.canParse(item, reporter))) {
           reporter.reportError('must be of type List<Diagnostic>');
           return false;
         }
@@ -44511,7 +45401,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(kind == 'full')) {
+        if (kind != 'full') {
           reporter.reportError('must be the literal \'full\'');
           return false;
         }
@@ -44521,7 +45411,7 @@
       reporter.push('resultId');
       try {
         final resultId = obj['resultId'];
-        if (resultId != null && !(resultId is String)) {
+        if (resultId != null && resultId is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -44539,7 +45429,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(uri is String)) {
+        if (uri is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -44553,7 +45443,7 @@
           return false;
         }
         final version = obj['version'];
-        if (version != null && !(version is int)) {
+        if (version != null && version is! int) {
           reporter.reportError('must be of type int');
           return false;
         }
@@ -44662,6 +45552,7 @@
   /// Tags for this completion item.
   final List<SymbolTag>? tags;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (containerName != null) {
@@ -44681,7 +45572,7 @@
       reporter.push('containerName');
       try {
         final containerName = obj['containerName'];
-        if (containerName != null && !(containerName is String)) {
+        if (containerName != null && containerName is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -44699,7 +45590,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(SymbolKind.canParse(kind, reporter))) {
+        if (!SymbolKind.canParse(kind, reporter)) {
           reporter.reportError('must be of type SymbolKind');
           return false;
         }
@@ -44717,8 +45608,8 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!((Location.canParse(location, reporter) ||
-            WorkspaceSymbolLocation.canParse(location, reporter)))) {
+        if (!Location.canParse(location, reporter) &&
+            !WorkspaceSymbolLocation.canParse(location, reporter)) {
           reporter.reportError(
               'must be of type Either2<Location, WorkspaceSymbolLocation>');
           return false;
@@ -44737,7 +45628,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(name is String)) {
+        if (name is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -44748,8 +45639,8 @@
       try {
         final tags = obj['tags'];
         if (tags != null &&
-            !((tags is List<Object?> &&
-                (tags.every((item) => SymbolTag.canParse(item, reporter)))))) {
+            (tags is! List<Object?> ||
+                tags.any((item) => !SymbolTag.canParse(item, reporter)))) {
           reporter.reportError('must be of type List<SymbolTag>');
           return false;
         }
@@ -44845,6 +45736,7 @@
   ///  @since 3.16.0
   final WorkspaceSymbolClientCapabilitiesTagSupport? tagSupport;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (dynamicRegistration != null) {
@@ -44867,7 +45759,7 @@
       reporter.push('dynamicRegistration');
       try {
         final dynamicRegistration = obj['dynamicRegistration'];
-        if (dynamicRegistration != null && !(dynamicRegistration is bool)) {
+        if (dynamicRegistration != null && dynamicRegistration is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -44878,8 +45770,8 @@
       try {
         final resolveSupport = obj['resolveSupport'];
         if (resolveSupport != null &&
-            !(WorkspaceSymbolClientCapabilitiesResolveSupport.canParse(
-                resolveSupport, reporter))) {
+            !WorkspaceSymbolClientCapabilitiesResolveSupport.canParse(
+                resolveSupport, reporter)) {
           reporter.reportError(
               'must be of type WorkspaceSymbolClientCapabilitiesResolveSupport');
           return false;
@@ -44891,8 +45783,8 @@
       try {
         final symbolKind = obj['symbolKind'];
         if (symbolKind != null &&
-            !(WorkspaceSymbolClientCapabilitiesSymbolKind.canParse(
-                symbolKind, reporter))) {
+            !WorkspaceSymbolClientCapabilitiesSymbolKind.canParse(
+                symbolKind, reporter)) {
           reporter.reportError(
               'must be of type WorkspaceSymbolClientCapabilitiesSymbolKind');
           return false;
@@ -44904,8 +45796,8 @@
       try {
         final tagSupport = obj['tagSupport'];
         if (tagSupport != null &&
-            !(WorkspaceSymbolClientCapabilitiesTagSupport.canParse(
-                tagSupport, reporter))) {
+            !WorkspaceSymbolClientCapabilitiesTagSupport.canParse(
+                tagSupport, reporter)) {
           reporter.reportError(
               'must be of type WorkspaceSymbolClientCapabilitiesTagSupport');
           return false;
@@ -44968,6 +45860,7 @@
   /// The properties that a client can resolve lazily. Usually `location.range`
   final List<String> properties;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['properties'] = properties;
@@ -44987,8 +45880,8 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!((properties is List<Object?> &&
-            (properties.every((item) => item is String))))) {
+        if (properties is! List<Object?> ||
+            properties.any((item) => item is! String)) {
           reporter.reportError('must be of type List<String>');
           return false;
         }
@@ -45049,6 +45942,7 @@
   /// from `File` to `Array` as defined in the initial version of the protocol.
   final List<SymbolKind>? valueSet;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (valueSet != null) {
@@ -45063,9 +45957,8 @@
       try {
         final valueSet = obj['valueSet'];
         if (valueSet != null &&
-            !((valueSet is List<Object?> &&
-                (valueSet
-                    .every((item) => SymbolKind.canParse(item, reporter)))))) {
+            (valueSet is! List<Object?> ||
+                valueSet.any((item) => !SymbolKind.canParse(item, reporter)))) {
           reporter.reportError('must be of type List<SymbolKind>');
           return false;
         }
@@ -45121,6 +46014,7 @@
   /// The tags supported by the client.
   final List<SymbolTag> valueSet;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['valueSet'] = valueSet.map((item) => item.toJson()).toList();
@@ -45140,8 +46034,8 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!((valueSet is List<Object?> &&
-            (valueSet.every((item) => SymbolTag.canParse(item, reporter)))))) {
+        if (valueSet is! List<Object?> ||
+            valueSet.any((item) => !SymbolTag.canParse(item, reporter))) {
           reporter.reportError('must be of type List<SymbolTag>');
           return false;
         }
@@ -45193,6 +46087,7 @@
 
   final String uri;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['uri'] = uri;
@@ -45212,7 +46107,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(uri is String)) {
+        if (uri is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -45271,8 +46166,10 @@
   /// workspace symbol.
   ///  @since 3.17.0
   final bool? resolveProvider;
+  @override
   final bool? workDoneProgress;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (resolveProvider != null) {
@@ -45289,7 +46186,7 @@
       reporter.push('resolveProvider');
       try {
         final resolveProvider = obj['resolveProvider'];
-        if (resolveProvider != null && !(resolveProvider is bool)) {
+        if (resolveProvider != null && resolveProvider is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -45299,7 +46196,7 @@
       reporter.push('workDoneProgress');
       try {
         final workDoneProgress = obj['workDoneProgress'];
-        if (workDoneProgress != null && !(workDoneProgress is bool)) {
+        if (workDoneProgress != null && workDoneProgress is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -45375,6 +46272,7 @@
 
   /// An optional token that a server can use to report partial results (e.g.
   /// streaming) to the client.
+  @override
   final Either2<int, String>? partialResultToken;
 
   /// A query string to filter symbols by. Clients may send an empty string here
@@ -45382,8 +46280,10 @@
   final String query;
 
   /// An optional token that a server can use to report work done progress.
+  @override
   final Either2<int, String>? workDoneToken;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (partialResultToken != null) {
@@ -45402,7 +46302,8 @@
       try {
         final partialResultToken = obj['partialResultToken'];
         if (partialResultToken != null &&
-            !((partialResultToken is int || partialResultToken is String))) {
+            partialResultToken is! int &&
+            partialResultToken is! String) {
           reporter.reportError('must be of type Either2<int, String>');
           return false;
         }
@@ -45420,7 +46321,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(query is String)) {
+        if (query is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -45431,7 +46332,8 @@
       try {
         final workDoneToken = obj['workDoneToken'];
         if (workDoneToken != null &&
-            !((workDoneToken is int || workDoneToken is String))) {
+            workDoneToken is! int &&
+            workDoneToken is! String) {
           reporter.reportError('must be of type Either2<int, String>');
           return false;
         }
@@ -45494,9 +46396,12 @@
   /// The server provides support to resolve additional information for a
   /// workspace symbol.
   ///  @since 3.17.0
+  @override
   final bool? resolveProvider;
+  @override
   final bool? workDoneProgress;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     if (resolveProvider != null) {
@@ -45513,7 +46418,7 @@
       reporter.push('resolveProvider');
       try {
         final resolveProvider = obj['resolveProvider'];
-        if (resolveProvider != null && !(resolveProvider is bool)) {
+        if (resolveProvider != null && resolveProvider is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -45523,7 +46428,7 @@
       reporter.push('workDoneProgress');
       try {
         final workDoneProgress = obj['workDoneProgress'];
-        if (workDoneProgress != null && !(workDoneProgress is bool)) {
+        if (workDoneProgress != null && workDoneProgress is! bool) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -45598,10 +46503,12 @@
 
   /// A document diagnostic report indicating no changes to the last result. A
   /// server can only return `unchanged` if result ids are provided.
+  @override
   final String kind;
 
   /// A result id which will be sent on the next diagnostic request for the same
   /// document.
+  @override
   final String resultId;
 
   /// The URI for which diagnostic information is reported.
@@ -45611,6 +46518,7 @@
   /// is not marked as open `null` can be provided.
   final int? version;
 
+  @override
   Map<String, Object?> toJson() {
     var result = <String, Object?>{};
     result['kind'] = kind;
@@ -45633,7 +46541,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(kind == 'unchanged')) {
+        if (kind != 'unchanged') {
           reporter.reportError('must be the literal \'unchanged\'');
           return false;
         }
@@ -45651,7 +46559,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(resultId is String)) {
+        if (resultId is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -45669,7 +46577,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(uri is String)) {
+        if (uri is! String) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -45683,7 +46591,7 @@
           return false;
         }
         final version = obj['version'];
-        if (version != null && !(version is int)) {
+        if (version != null && version is! int) {
           reporter.reportError('must be of type int');
           return false;
         }
diff --git a/pkg/analysis_server/lib/protocol/protocol_constants.dart b/pkg/analysis_server/lib/protocol/protocol_constants.dart
index e1e3e17..4867f3d 100644
--- a/pkg/analysis_server/lib/protocol/protocol_constants.dart
+++ b/pkg/analysis_server/lib/protocol/protocol_constants.dart
@@ -8,7 +8,7 @@
 
 // ignore_for_file: constant_identifier_names
 
-const String PROTOCOL_VERSION = '1.33.0';
+const String PROTOCOL_VERSION = '1.33.1';
 
 const String ANALYSIS_NOTIFICATION_ANALYZED_FILES = 'analysis.analyzedFiles';
 const String ANALYSIS_NOTIFICATION_ANALYZED_FILES_DIRECTORIES = 'directories';
diff --git a/pkg/analysis_server/lib/src/lsp/mapping.dart b/pkg/analysis_server/lib/src/lsp/mapping.dart
index 59eb715..d7db246 100644
--- a/pkg/analysis_server/lib/src/lsp/mapping.dart
+++ b/pkg/analysis_server/lib/src/lsp/mapping.dart
@@ -153,6 +153,7 @@
     change.linkedEditGroups,
     lineInfo,
     selectionOffset: change.selection?.offset,
+    selectionLength: change.selectionLength,
   );
 
   // Compile the edits into a TextDocumentEdit for this file.
@@ -908,6 +909,7 @@
   required List<server.LinkedEditGroup> editGroups,
   required int editOffset,
   required int? selectionOffset,
+  required int? selectionLength,
 }) {
   return lsp.SnippetTextEdit(
     insertTextFormat: lsp.InsertTextFormat.Snippet,
@@ -918,6 +920,7 @@
       editGroups: editGroups,
       editOffset: editOffset,
       selectionOffset: selectionOffset,
+      selectionLength: selectionLength,
     ),
   );
 }
@@ -982,6 +985,8 @@
     lineInfo,
     selectionOffset:
         changes.selection?.file == file ? changes.selection?.offset : null,
+    selectionLength:
+        changes.selection?.file == file ? changes.selectionLength : null,
   );
 
   // For LSP, we need to provide the main edit and other edits separately. The
@@ -1477,6 +1482,7 @@
   List<server.LinkedEditGroup> editGroups,
   LineInfo lineInfo, {
   required int? selectionOffset,
+  required int? selectionLength,
 }) {
   final snippetEdits = <lsp.SnippetTextEdit>[];
 
@@ -1497,6 +1503,7 @@
       editGroups: editGroups,
       editOffset: edit.offset + offsetDelta,
       selectionOffset: selectionOffset,
+      selectionLength: selectionLength,
     ));
 
     offsetDelta += edit.replacement.length - edit.length;
diff --git a/pkg/analysis_server/lib/src/lsp/server_capabilities_computer.dart b/pkg/analysis_server/lib/src/lsp/server_capabilities_computer.dart
index 5b47d0a..3d987f2 100644
--- a/pkg/analysis_server/lib/src/lsp/server_capabilities_computer.dart
+++ b/pkg/analysis_server/lib/src/lsp/server_capabilities_computer.dart
@@ -137,12 +137,13 @@
   Set<Registration> currentRegistrations = {};
   var _lastRegistrationId = 0;
 
-  final dartFiles = TextDocumentFilter(language: 'dart', scheme: 'file');
-  final pubspecFile = TextDocumentFilter(
+  final dartFiles =
+      TextDocumentFilterWithScheme(language: 'dart', scheme: 'file');
+  final pubspecFile = TextDocumentFilterWithScheme(
       language: 'yaml', scheme: 'file', pattern: '**/pubspec.yaml');
-  final analysisOptionsFile = TextDocumentFilter(
+  final analysisOptionsFile = TextDocumentFilterWithScheme(
       language: 'yaml', scheme: 'file', pattern: '**/analysis_options.yaml');
-  final fixDataFile = TextDocumentFilter(
+  final fixDataFile = TextDocumentFilterWithScheme(
       language: 'yaml', scheme: 'file', pattern: '**/lib/fix_data.yaml');
 
   ServerCapabilitiesComputer(this._server);
@@ -303,7 +304,8 @@
         // All published plugins use something like `*.extension` as
         // interestingFiles. Prefix a `**/` so that the glob matches nested
         // folders as well.
-        .map((glob) => TextDocumentFilter(scheme: 'file', pattern: '**/$glob'));
+        .map((glob) =>
+            TextDocumentFilterWithScheme(scheme: 'file', pattern: '**/$glob'));
     final pluginTypesExcludingDart =
         pluginTypes.where((filter) => filter.pattern != '**/*.dart');
 
diff --git a/pkg/analysis_server/lib/src/lsp/snippets.dart b/pkg/analysis_server/lib/src/lsp/snippets.dart
index 3cec1f0..afc2155 100644
--- a/pkg/analysis_server/lib/src/lsp/snippets.dart
+++ b/pkg/analysis_server/lib/src/lsp/snippets.dart
@@ -21,6 +21,7 @@
   required List<server.LinkedEditGroup> editGroups,
   required int editOffset,
   int? selectionOffset,
+  int? selectionLength,
 }) =>
     _buildSnippetString(
       text,
@@ -29,6 +30,7 @@
       editGroupsOffset: editOffset,
       selectionOffset:
           selectionOffset != null ? selectionOffset - editOffset : null,
+      selectionLength: selectionLength,
     );
 
 /// Builds an LSP snippet string with supplied ranges as tab stops.
diff --git a/pkg/analysis_server/lib/src/search/type_hierarchy.dart b/pkg/analysis_server/lib/src/search/type_hierarchy.dart
index d555525..5dc00b9 100644
--- a/pkg/analysis_server/lib/src/search/type_hierarchy.dart
+++ b/pkg/analysis_server/lib/src/search/type_hierarchy.dart
@@ -196,7 +196,7 @@
         result = clazz.getSetter(pivotName);
       }
     }
-    if (result != null && result.isAccessibleIn(_pivotLibrary)) {
+    if (result != null && result.isAccessibleIn2(_pivotLibrary)) {
       return result;
     }
     // try to find in the class mixin
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/completion_manager.dart b/pkg/analysis_server/lib/src/services/completion/dart/completion_manager.dart
index 33bc64a..8e1cc46 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/completion_manager.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/completion_manager.dart
@@ -473,6 +473,19 @@
       }
     }
 
+    if (entity is Token &&
+        entity.type == TokenType.STRING &&
+        entity.offset < offset &&
+        offset < entity.end) {
+      final uriNode = target.containingNode;
+      if (uriNode is SimpleStringLiteral && uriNode.literal == entity) {
+        final directive = uriNode.parent;
+        if (directive is UriBasedDirective && directive.uri == uriNode) {
+          return uriNode.value.substring(0, offset - uriNode.contentsOffset);
+        }
+      }
+    }
+
     while (entity is AstNode) {
       if (entity is SimpleIdentifier) {
         var identifier = entity.name;
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/fuzzy_filter_sort.dart b/pkg/analysis_server/lib/src/services/completion/dart/fuzzy_filter_sort.dart
index 1fbda62..f410bf1 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/fuzzy_filter_sort.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/fuzzy_filter_sort.dart
@@ -5,6 +5,7 @@
 import 'package:analysis_server/src/protocol_server.dart';
 import 'package:analysis_server/src/services/completion/dart/suggestion_builder.dart';
 import 'package:analysis_server/src/services/completion/filtering/fuzzy_matcher.dart';
+import 'package:collection/collection.dart';
 
 final _identifierPattern = RegExp(r'([_a-zA-Z][_a-zA-Z0-9]*)');
 
@@ -14,7 +15,11 @@
   required String pattern,
   required List<CompletionSuggestionBuilder> suggestions,
 }) {
-  var matcher = FuzzyMatcher(pattern, matchStyle: MatchStyle.SYMBOL);
+  final matchStyle =
+      suggestions.firstOrNull?.kind == CompletionSuggestionKind.IMPORT
+          ? MatchStyle.FILENAME
+          : MatchStyle.SYMBOL;
+  final matcher = FuzzyMatcher(pattern, matchStyle: matchStyle);
 
   double score(CompletionSuggestionBuilder suggestion) {
     var textToMatch = suggestion.textToMatch;
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/local_library_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/local_library_contributor.dart
index d852030..8581f4f 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/local_library_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/local_library_contributor.dart
@@ -9,6 +9,7 @@
 import 'package:analysis_server/src/services/completion/dart/suggestion_builder.dart'
     show SuggestionBuilder;
 import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/dart/element/visitor.dart';
 import 'package:analyzer_plugin/src/utilities/completion/optype.dart';
 
@@ -52,10 +53,14 @@
       _addConstructorSuggestions(element);
     }
     if (opType.includeReturnValueSuggestions) {
-      if (element.isEnum) {
-        for (var field in element.fields) {
-          if (field.isEnumConstant) {
-            builder.suggestEnumConstant(field, prefix: prefix);
+      final typeSystem = request.libraryElement.typeSystem;
+      final contextType = request.contextType;
+      if (contextType is InterfaceType) {
+        // TODO(scheglov) This looks not ideal - we should suggest getters.
+        for (final field in element.fields) {
+          if (field.isStatic &&
+              typeSystem.isSubtypeOf(field.type, contextType)) {
+            builder.suggestStaticField(field, prefix: prefix);
           }
         }
       }
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 9028362..3eb06e2 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
@@ -213,24 +213,7 @@
 
   @override
   void declaredClass(ClassDeclaration declaration) {
-    var classElt = declaration.declaredElement;
-    if (classElt != null && visibilityTracker._isVisible(classElt)) {
-      if (opType.includeTypeNameSuggestions) {
-        builder.suggestClass(classElt);
-      }
-
-      // Generate the suggestions for the constructors. We are required to loop
-      // through elements here instead of using declaredConstructor() due to
-      // implicit constructors (i.e. there is no AstNode for an implicit
-      // constructor)
-      if (!opType.isPrefixed && opType.includeConstructorSuggestions) {
-        for (var constructor in classElt.constructors) {
-          if (!classElt.isAbstract || constructor.isFactory) {
-            builder.suggestConstructor(constructor);
-          }
-        }
-      }
-    }
+    _declaredClassElement(declaration.declaredElement);
   }
 
   @override
@@ -248,20 +231,7 @@
 
   @override
   void declaredEnum(EnumDeclaration declaration) {
-    var declaredElement = declaration.declaredElement;
-    if (declaredElement != null &&
-        visibilityTracker._isVisible(declaredElement) &&
-        opType.includeTypeNameSuggestions) {
-      builder.suggestClass(declaredElement);
-      for (var enumConstant in declaration.constants) {
-        if (!enumConstant.isSynthetic) {
-          var constantElement = enumConstant.declaredElement;
-          if (constantElement is FieldElement) {
-            builder.suggestEnumConstant(constantElement);
-          }
-        }
-      }
-    }
+    _declaredClassElement(declaration.declaredElement);
   }
 
   @override
@@ -437,6 +407,38 @@
     super.visitExtendsClause(node);
   }
 
+  void _declaredClassElement(ClassElement? class_) {
+    if (class_ != null && visibilityTracker._isVisible(class_)) {
+      if (opType.includeTypeNameSuggestions) {
+        builder.suggestClass(class_);
+      }
+
+      if (!opType.isPrefixed &&
+          opType.includeConstructorSuggestions &&
+          !class_.isEnum) {
+        for (final constructor in class_.constructors) {
+          if (!class_.isAbstract || constructor.isFactory) {
+            builder.suggestConstructor(constructor);
+          }
+        }
+      }
+
+      if (!opType.isPrefixed && opType.includeReturnValueSuggestions) {
+        final typeSystem = request.libraryElement.typeSystem;
+        final contextType = request.contextType;
+        if (contextType is InterfaceType) {
+          // TODO(scheglov) This looks not ideal - we should suggest getters.
+          for (final field in class_.fields) {
+            if (field.isStatic &&
+                typeSystem.isSubtypeOf(field.type, contextType)) {
+              builder.suggestStaticField(field);
+            }
+          }
+        }
+      }
+    }
+  }
+
   /// Return `true` if the [identifier] is composed of one or more underscore
   /// characters and nothing else.
   bool _isUnused(String identifier) => RegExp(r'^_+$').hasMatch(identifier);
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/redirecting_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/redirecting_contributor.dart
index e9af2ab..9105538 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/redirecting_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/redirecting_contributor.dart
@@ -41,7 +41,7 @@
             containingClass?.declaredElement?.supertype?.element;
         if (superclassElement != null) {
           for (var constructor in superclassElement.constructors) {
-            if (constructor.isAccessibleIn(request.libraryElement)) {
+            if (constructor.isAccessibleIn2(request.libraryElement)) {
               builder.suggestConstructor(constructor, hasClassName: true);
             }
           }
@@ -69,7 +69,7 @@
                 class_.thisType, classElement.thisType)) {
               for (var constructor in class_.constructors) {
                 if (constructor != constructorElement &&
-                    constructor.isAccessibleIn(request.libraryElement)) {
+                    constructor.isAccessibleIn2(request.libraryElement)) {
                   builder.suggestConstructor(constructor);
                 }
               }
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 bc6f68f..727aa03 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
@@ -18,7 +18,7 @@
   @override
   Future<void> computeSuggestions() async {
     var library = request.libraryElement;
-    bool isVisible(Element element) => element.isAccessibleIn(library);
+    bool isVisible(Element element) => element.isAccessibleIn2(library);
     var targetId = request.target.dotTarget;
     if (targetId is Identifier && !request.target.isCascade) {
       var element = targetId.staticElement;
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 b93535a..0dc2490 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 @@
   void addSuggestionForAccessor(
       {required PropertyAccessorElement accessor,
       required double inheritanceDistance}) {
-    if (accessor.isAccessibleIn(request.libraryElement)) {
+    if (accessor.isAccessibleIn2(request.libraryElement)) {
       var member = accessor.isSynthetic ? accessor.variable : accessor;
       if (_shouldAddSuggestion(member)) {
         builder.suggestAccessor(accessor,
@@ -101,7 +101,7 @@
       {required MethodElement method,
       required CompletionSuggestionKind kind,
       required double inheritanceDistance}) {
-    if (method.isAccessibleIn(request.libraryElement) &&
+    if (method.isAccessibleIn2(request.libraryElement) &&
         _shouldAddSuggestion(method)) {
       builder.suggestMethod(method,
           kind: kind, inheritanceDistance: inheritanceDistance);
@@ -237,10 +237,17 @@
   /// invocation. The [inheritanceDistance] is the value of the inheritance
   /// distance feature computed for the accessor or `-1.0` if the accessor is a
   /// static accessor.
-  void suggestAccessor(PropertyAccessorElement accessor,
-      {required double inheritanceDistance}) {
-    assert(accessor.enclosingElement is ClassElement ||
-        accessor.enclosingElement is ExtensionElement);
+  void suggestAccessor(
+    PropertyAccessorElement accessor, {
+    required double inheritanceDistance,
+    bool withEnclosingName = false,
+  }) {
+    var enclosingPrefix = '';
+    var enclosingName = _enclosingClassOrExtensionName(accessor);
+    if (withEnclosingName && enclosingName != null) {
+      enclosingPrefix = '$enclosingName.';
+    }
+
     if (accessor.isSynthetic) {
       // Avoid visiting a field twice. All fields induce a getter, but only
       // non-final fields induce a setter, so we don't add a suggestion for a
@@ -280,6 +287,7 @@
       _addBuilder(
         _createCompletionSuggestionBuilder(
           accessor,
+          completion: enclosingPrefix + accessor.displayName,
           kind: CompletionSuggestionKind.IDENTIFIER,
           relevance: relevance,
           isNotImported: isNotImportedLibrary,
@@ -926,6 +934,43 @@
     );
   }
 
+  /// Add a suggestion for a static field declared within a class or extension.
+  /// If the field is synthetic, add the corresponding getter instead.
+  ///
+  /// If the enclosing element can only be referenced using a prefix, then
+  /// the [prefix] should be provided.
+  void suggestStaticField(FieldElement element, {String? prefix}) {
+    assert(element.isStatic);
+    if (element.isSynthetic) {
+      var getter = element.getter;
+      if (getter != null) {
+        suggestAccessor(
+          getter,
+          inheritanceDistance: 0.0,
+          withEnclosingName: true,
+        );
+      }
+    } else {
+      var enclosingPrefix = '';
+      var enclosingName = _enclosingClassOrExtensionName(element);
+      if (enclosingName != null) {
+        enclosingPrefix = '$enclosingName.';
+      }
+      var relevance =
+          _computeTopLevelRelevance(element, elementType: element.type);
+      _addBuilder(
+        _createCompletionSuggestionBuilder(
+          element,
+          completion: enclosingPrefix + element.name,
+          kind: CompletionSuggestionKind.IDENTIFIER,
+          prefix: prefix,
+          relevance: relevance,
+          isNotImported: isNotImportedLibrary,
+        ),
+      );
+    }
+  }
+
   /// Add a suggestion to reference a [parameter] in a super formal parameter.
   void suggestSuperFormalParameter(ParameterElement parameter) {
     _addBuilder(
@@ -1289,6 +1334,22 @@
     );
   }
 
+  /// Return the name of the enclosing class or extension.
+  ///
+  /// The enclosing element must be either a class, or extension; otherwise
+  /// we either fail with assertion, or return `null`.
+  String? _enclosingClassOrExtensionName(Element element) {
+    var enclosing = element.enclosingElement;
+    if (enclosing is ClassElement) {
+      return enclosing.name;
+    } else if (enclosing is ExtensionElement) {
+      return enclosing.name;
+    } else {
+      assert(false, 'Expected ClassElement or ExtensionElement');
+      return null;
+    }
+  }
+
   /// If the [element] has a documentation comment, return it.
   _ElementDocumentation? _getDocumentation(Element element) {
     var documentationCache = request.documentationCache;
diff --git a/pkg/analysis_server/lib/src/services/refactoring/refactoring_internal.dart b/pkg/analysis_server/lib/src/services/refactoring/refactoring_internal.dart
index 6fb1f3b..d1b121e 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/refactoring_internal.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/refactoring_internal.dart
@@ -83,6 +83,9 @@
 
   bool get isResolved => _match.isResolved;
 
+  /// Return the [LibraryElement] for the [file].
+  LibraryElement get libraryElement => _match.libraryElement;
+
   SourceRange get range => _match.sourceRange;
 
   Source get unitSource => _match.unitSource;
diff --git a/pkg/analysis_server/lib/src/services/refactoring/rename_class_member.dart b/pkg/analysis_server/lib/src/services/refactoring/rename_class_member.dart
index 8065f1f..ce85fb8 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/rename_class_member.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/rename_class_member.dart
@@ -108,11 +108,8 @@
         continue;
       }
       // check the element being renamed is accessible
-      {
-        var whereLibrary = reference.element.library;
-        if (!element.isAccessibleIn(whereLibrary)) {
-          continue;
-        }
+      if (!element.isAccessibleIn2(reference.libraryElement)) {
+        continue;
       }
       // add edit
       reference.addEdit(change, newName, id: _newPotentialId());
diff --git a/pkg/analysis_server/lib/src/services/snippets/dart/flutter_snippet_producers.dart b/pkg/analysis_server/lib/src/services/snippets/dart/flutter_snippet_producers.dart
index 71a53d6..9644c99 100644
--- a/pkg/analysis_server/lib/src/services/snippets/dart/flutter_snippet_producers.dart
+++ b/pkg/analysis_server/lib/src/services/snippets/dart/flutter_snippet_producers.dart
@@ -17,6 +17,7 @@
   final flutter = Flutter.instance;
 
   late ClassElement? classWidget;
+  late ClassElement? classContainer;
 
   FlutterSnippetProducer(super.request);
 
@@ -27,6 +28,10 @@
       return false;
     }
 
+    if ((classContainer = await _getClass('Container')) == null) {
+      return false;
+    }
+
     return super.isValid();
   }
 
@@ -344,6 +349,7 @@
     // Checked by isValid() before this will be called.
     final classBuildContext = this.classBuildContext!;
     final classWidget = this.classWidget!;
+    final classContainer = this.classContainer!;
 
     // Add the build method.
     builder.writeln('  @override');
@@ -359,9 +365,12 @@
       },
       bodyWriter: () {
         builder.writeln('{');
-        builder.write('    ');
-        builder.selectHere();
-        builder.writeln();
+        builder.write('    return ');
+        builder.selectAll(() {
+          builder.writeType(_getType(classContainer));
+          builder.write('()');
+        });
+        builder.writeln(';');
         builder.writeln('  }');
       },
     );
diff --git a/pkg/analysis_server/pubspec.yaml b/pkg/analysis_server/pubspec.yaml
index 4b7314d..93103cb 100644
--- a/pkg/analysis_server/pubspec.yaml
+++ b/pkg/analysis_server/pubspec.yaml
@@ -5,6 +5,7 @@
 environment:
   sdk: '>=2.17.0 <3.0.0'
 
+# Use 'any' constraints here; we get our versions from the DEPS file.
 dependencies:
   _fe_analyzer_shared: any
   analyzer: any
@@ -25,6 +26,7 @@
   watcher: any
   yaml: any
 
+# Use 'any' constraints here; we get our versions from the DEPS file.
 dev_dependencies:
   analyzer_utilities: any
   cli_util: any
diff --git a/pkg/analysis_server/test/analysis/get_navigation_test.dart b/pkg/analysis_server/test/analysis/get_navigation_test.dart
index e0c55b0..e12cbc1 100644
--- a/pkg/analysis_server/test/analysis/get_navigation_test.dart
+++ b/pkg/analysis_server/test/analysis/get_navigation_test.dart
@@ -314,6 +314,64 @@
     }
   }
 
+  Future<void> test_partDirective() async {
+    final partFile = newFile(
+      '$testPackageLibPath/a.dart',
+      '''
+part of 'test.dart';
+''',
+    );
+    addTestFile('''
+part 'a.dart';
+''');
+    await waitForTasksFinished();
+    await _getNavigation(offset: 8, length: 0);
+    expect(regions, hasLength(1));
+    assertHasRegionString("'a.dart'");
+    expect(testTargets, hasLength(1));
+    expect(testTargets[0].kind, ElementKind.COMPILATION_UNIT);
+    assertHasFileTarget(partFile.path, 0, 0);
+  }
+
+  Future<void> test_partOfDirective_named() async {
+    final partOfFile = newFile(
+      '$testPackageLibPath/a.dart',
+      '''
+library foo;
+part 'test.dart';
+''',
+    );
+    addTestFile('''
+part of foo;
+''');
+    await waitForTasksFinished();
+    await _getNavigation(offset: 10, length: 0);
+    expect(regions, hasLength(1));
+    assertHasRegionString("foo");
+    expect(testTargets, hasLength(1));
+    expect(testTargets[0].kind, ElementKind.LIBRARY);
+    assertHasFileTarget(partOfFile.path, 8, 3); // library [[foo]]
+  }
+
+  Future<void> test_partOfDirective_uri() async {
+    final partOfFile = newFile(
+      '$testPackageLibPath/a.dart',
+      '''
+part 'test.dart';
+''',
+    );
+    addTestFile('''
+part of 'a.dart';
+''');
+    await waitForTasksFinished();
+    await _getNavigation(offset: 11, length: 0);
+    expect(regions, hasLength(1));
+    assertHasRegionString("'a.dart'");
+    expect(testTargets, hasLength(1));
+    expect(testTargets[0].kind, ElementKind.LIBRARY);
+    assertHasFileTarget(partOfFile.path, 0, 0);
+  }
+
   Future<void> test_zeroLength_end() async {
     addTestFile('''
 void f() {
diff --git a/pkg/analysis_server/test/analysis/notification_highlights2_test.dart b/pkg/analysis_server/test/analysis/notification_highlights2_test.dart
index f8d77d0..a1aa517 100644
--- a/pkg/analysis_server/test/analysis/notification_highlights2_test.dart
+++ b/pkg/analysis_server/test/analysis/notification_highlights2_test.dart
@@ -339,7 +339,7 @@
 
   Future<void> test_BUILT_IN_partOf() async {
     addTestFile('''
-part of lib;
+part of my.lib.name;
 void f() {
   var part = 1;
   var of = 2;
@@ -613,11 +613,14 @@
 
   Future<void> test_DIRECTIVE_partOf() async {
     addTestFile('''
-part of lib;
+part of my.lib.name;
 ''');
     _addLibraryForTestPart();
     await prepareHighlights();
-    assertHasStringRegion(HighlightRegionType.DIRECTIVE, 'part of lib;');
+    assertHasStringRegion(
+      HighlightRegionType.DIRECTIVE,
+      'part of my.lib.name;',
+    );
   }
 
   Future<void> test_DYNAMIC_LOCAL_VARIABLE() async {
@@ -1695,7 +1698,7 @@
 
   void _addLibraryForTestPart() {
     newFile('$testPackageLibPath/my_lib.dart', '''
-library lib;
+library my.lib.name;
 part 'test.dart';
     ''');
   }
diff --git a/pkg/analysis_server/test/analysis/notification_outline_test.dart b/pkg/analysis_server/test/analysis/notification_outline_test.dart
index 4347bad..8bce6e6 100644
--- a/pkg/analysis_server/test/analysis/notification_outline_test.dart
+++ b/pkg/analysis_server/test/analysis/notification_outline_test.dart
@@ -97,7 +97,7 @@
 
   Future<void> test_libraryName_hasPartOfDirective() async {
     newFile('$testPackageLibPath/a.dart', r'''
-library lib;
+library my.lib;
 
 part 'test.dart';
 ''');
diff --git a/pkg/analysis_server/test/client/completion_driver_test.dart b/pkg/analysis_server/test/client/completion_driver_test.dart
index 0508315..9d8f5e4 100644
--- a/pkg/analysis_server/test/client/completion_driver_test.dart
+++ b/pkg/analysis_server/test/client/completion_driver_test.dart
@@ -267,7 +267,7 @@
   @override
   TestingCompletionProtocol get protocol => TestingCompletionProtocol.version1;
 
-  @failingTest
+  @FailingTest(reason: 'This test fails with available suggestions')
   @override
   Future<void> test_project_lib_multipleExports() async {
     return super.test_project_lib_multipleExports();
@@ -329,7 +329,7 @@
     await addTestFile('''
 import 'a.dart';
 void f() {
-  ^
+  E v = ^
 }
 ''');
     assertSuggestion(
@@ -605,7 +605,7 @@
   Future<void> test_project_lib_setters_static() async {
     newFile('$testPackageLibPath/a.dart', r'''
 class A {
-  static set g(int g) {}
+  static set foo(int _) {}
 }
 ''');
 
@@ -619,7 +619,7 @@
 }
 ''');
 
-    assertNoSuggestion(completion: 'A.g');
+    assertNoSuggestion(completion: 'A.foo');
   }
 
   /// See: https://github.com/dart-lang/sdk/issues/40626
diff --git a/pkg/analysis_server/test/client/impl/completion_driver.dart b/pkg/analysis_server/test/client/impl/completion_driver.dart
index 6695249..c6b01d4 100644
--- a/pkg/analysis_server/test/client/impl/completion_driver.dart
+++ b/pkg/analysis_server/test/client/impl/completion_driver.dart
@@ -276,6 +276,8 @@
     } else if (notification.event == ANALYSIS_NOTIFICATION_ERRORS) {
       var decoded = AnalysisErrorsParams.fromNotification(notification);
       filesErrors[decoded.file] = decoded.errors;
+    } else if (notification.event == ANALYSIS_NOTIFICATION_FLUSH_RESULTS) {
+      // Ignored.
     } else if (notification.event == SERVER_NOTIFICATION_ERROR) {
       throw Exception('server error: ${notification.toJson()}');
     } else if (notification.event == SERVER_NOTIFICATION_CONNECTED) {
diff --git a/pkg/analysis_server/test/domain_completion_test.dart b/pkg/analysis_server/test/domain_completion_test.dart
index f86e1d8..3a86b88 100644
--- a/pkg/analysis_server/test/domain_completion_test.dart
+++ b/pkg/analysis_server/test/domain_completion_test.dart
@@ -391,44 +391,6 @@
       ..suggestions.withElementClass.isEmpty;
   }
 
-  Future<void> test_notImported_lowerRelevance_enumConstant() async {
-    newFile('$testPackageLibPath/a.dart', '''
-enum E1 {
-  foo01
-}
-''');
-
-    newFile('$testPackageLibPath/b.dart', '''
-enum E2 {
-  foo02
-}
-''');
-
-    await _configureWithWorkspaceRoot();
-
-    var response = await _getTestCodeSuggestions('''
-import 'b.dart';
-
-void f() {
-  foo0^
-}
-''');
-
-    check(response)
-      ..assertComplete()
-      ..hasReplacement(left: 4);
-
-    // `foo01` relevance is decreased because it is not yet imported.
-    check(response).suggestions.matches([
-      (suggestion) => suggestion
-        ..completion.isEqualTo('E2.foo02')
-        ..libraryUriToImport.isNull,
-      (suggestion) => suggestion
-        ..completion.isEqualTo('E1.foo01')
-        ..libraryUriToImport.isEqualTo('package:test/a.dart'),
-    ]);
-  }
-
   Future<void> test_notImported_lowerRelevance_extension_getter() async {
     await _configureWithWorkspaceRoot();
 
diff --git a/pkg/analysis_server/test/integration/support/protocol_matchers.dart b/pkg/analysis_server/test/integration/support/protocol_matchers.dart
index b006a51..6998661 100644
--- a/pkg/analysis_server/test/integration/support/protocol_matchers.dart
+++ b/pkg/analysis_server/test/integration/support/protocol_matchers.dart
@@ -1622,6 +1622,7 @@
 ///   "edits": List<SourceFileEdit>
 ///   "linkedEditGroups": List<LinkedEditGroup>
 ///   "selection": optional Position
+///   "selectionLength": optional int
 ///   "id": optional String
 /// }
 final Matcher isSourceChange =
@@ -1631,6 +1632,7 @@
           'linkedEditGroups': isListOf(isLinkedEditGroup)
         }, optionalFields: {
           'selection': isPosition,
+          'selectionLength': isInt,
           'id': isString
         }));
 
diff --git a/pkg/analysis_server/test/lsp/completion_dart_test.dart b/pkg/analysis_server/test/lsp/completion_dart_test.dart
index ff5a000..648d17a 100644
--- a/pkg/analysis_server/test/lsp/completion_dart_test.dart
+++ b/pkg/analysis_server/test/lsp/completion_dart_test.dart
@@ -2854,6 +2854,7 @@
 class FlutterSnippetCompletionTest extends SnippetCompletionTest {
   /// Standard import statements expected for basic Widgets.
   String get expectedImports => '''
+import 'package:flutter/src/widgets/container.dart';
 import 'package:flutter/src/widgets/framework.dart';''';
 
   /// Nullability suffix expected in this test class.
@@ -2908,7 +2909,7 @@
 class _\${1:MyWidget}State extends State<\${1:MyWidget}> {
   @override
   Widget build(BuildContext context) {
-    \$0
+    return \${0:Container()};
   }
 }
 
@@ -2965,7 +2966,7 @@
 
   @override
   Widget build(BuildContext context) {
-    \$0
+    return \${0:Container()};
   }
 }
 
@@ -3001,7 +3002,7 @@
 
   @override
   Widget build(BuildContext context) {
-    \$0
+    return \${0:Container()};
   }
 }
 
@@ -3035,7 +3036,7 @@
 
   @override
   Widget build(BuildContext context) {
-    \$0
+    return \${0:Container()};
   }
 }
 
@@ -3063,7 +3064,7 @@
 
   @override
   Widget build(BuildContext context) {
-    \$0
+    return \${0:Container()};
   }
 }
 ''');
@@ -3089,7 +3090,7 @@
 
   @override
   Widget build(BuildContext context) {
-    \$0
+    return \${0:Container()};
   }
 }
 ''');
@@ -3131,6 +3132,7 @@
   @override
   String get expectedImports => '''
 import 'package:flutter/src/foundation/key.dart';
+import 'package:flutter/src/widgets/container.dart';
 import 'package:flutter/src/widgets/framework.dart';''';
 
   @override
diff --git a/pkg/analysis_server/test/lsp/definition_test.dart b/pkg/analysis_server/test/lsp/definition_test.dart
index 6f574ca..aa59e35 100644
--- a/pkg/analysis_server/test/lsp/definition_test.dart
+++ b/pkg/analysis_server/test/lsp/definition_test.dart
@@ -284,6 +284,46 @@
     );
   }
 
+  Future<void> test_partFilename() async {
+    final mainContents = '''
+part 'pa^rt.dart';
+    ''';
+
+    final partContents = '''
+part of 'main.dart';
+    ''';
+
+    final partFileUri = Uri.file(join(projectFolderPath, 'lib', 'part.dart'));
+
+    await initialize();
+    await openFile(mainFileUri, withoutMarkers(mainContents));
+    await openFile(partFileUri, withoutMarkers(partContents));
+    final res = await getDefinitionAsLocation(
+        mainFileUri, positionFromMarker(mainContents));
+
+    expect(res.single.uri, equals(partFileUri.toString()));
+  }
+
+  Future<void> test_partOfFilename() async {
+    final mainContents = '''
+part 'part.dart';
+    ''';
+
+    final partContents = '''
+part of 'ma^in.dart';
+    ''';
+
+    final partFileUri = Uri.file(join(projectFolderPath, 'lib', 'part.dart'));
+
+    await initialize();
+    await openFile(mainFileUri, withoutMarkers(mainContents));
+    await openFile(partFileUri, withoutMarkers(partContents));
+    final res = await getDefinitionAsLocation(
+        partFileUri, positionFromMarker(partContents));
+
+    expect(res.single.uri, equals(mainFileUri.toString()));
+  }
+
   Future<void> test_sameLine() async {
     final contents = '''
 int plusOne(int [[value]]) => 1 + val^ue;
diff --git a/pkg/analysis_server/test/lsp/initialization_test.dart b/pkg/analysis_server/test/lsp/initialization_test.dart
index a70a2db..e4a8ece 100644
--- a/pkg/analysis_server/test/lsp/initialization_test.dart
+++ b/pkg/analysis_server/test/lsp/initialization_test.dart
@@ -491,9 +491,9 @@
             .registrations;
 
     final documentFilterSql =
-        TextDocumentFilter(scheme: 'file', pattern: '**/*.sql');
+        TextDocumentFilterWithScheme(scheme: 'file', pattern: '**/*.sql');
     final documentFilterDart =
-        TextDocumentFilter(language: 'dart', scheme: 'file');
+        TextDocumentFilterWithScheme(language: 'dart', scheme: 'file');
 
     expect(
       registrations,
diff --git a/pkg/analysis_server/test/search/element_references_test.dart b/pkg/analysis_server/test/search/element_references_test.dart
index 8e86727..de8f23e 100644
--- a/pkg/analysis_server/test/search/element_references_test.dart
+++ b/pkg/analysis_server/test/search/element_references_test.dart
@@ -742,8 +742,8 @@
 }
 ''');
     await findElementReferences('fff(p) {}', false);
-    // A part without library, no results.
-    expect(results, isEmpty);
+    expect(results, hasLength(1));
+    assertHasResult(SearchResultKind.INVOCATION, 'fff(10);');
   }
 
   Future<void> test_parameter() 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 ff98794..0a2ffad 100644
--- a/pkg/analysis_server/test/services/completion/dart/completion_check.dart
+++ b/pkg/analysis_server/test/services/completion/dart/completion_check.dart
@@ -220,6 +220,10 @@
     element.isNotNull.kind.isGetter;
   }
 
+  void get isImport {
+    kind.isImport;
+  }
+
   void get isImportPrefix {
     kind.isIdentifier;
     element.isNotNull.kind.isPrefix;
@@ -262,6 +266,20 @@
     element.isNotNull.kind.isSetter;
   }
 
+  void get isStatic {
+    element.isNotNull.isStatic.isTrue;
+  }
+
+  void get isStaticField {
+    isStatic;
+    isField;
+  }
+
+  void get isStaticGetter {
+    isStatic;
+    isGetter;
+  }
+
   void get isTopLevelVariable {
     kind.isIdentifier;
     element.isNotNull.kind.isTopLevelVariable;
@@ -373,6 +391,10 @@
     isEqualTo(CompletionSuggestionKind.IDENTIFIER);
   }
 
+  void get isImport {
+    isEqualTo(CompletionSuggestionKind.IMPORT);
+  }
+
   void get isInvocation {
     isEqualTo(CompletionSuggestionKind.INVOCATION);
   }
@@ -397,6 +419,45 @@
   }
 
   @useResult
+  CheckTarget<Iterable<CompletionSuggestionForTesting>> get fields {
+    var result = value
+        .where((suggestion) =>
+            suggestion.suggestion.kind == CompletionSuggestionKind.IDENTIFIER &&
+            suggestion.suggestion.element?.kind == ElementKind.FIELD)
+        .toList();
+    return nest(
+      result,
+      (selected) => 'fields ${valueStr(selected)}',
+    );
+  }
+
+  @useResult
+  CheckTarget<Iterable<CompletionSuggestionForTesting>> get getters {
+    var result = value
+        .where((suggestion) =>
+            suggestion.suggestion.kind == CompletionSuggestionKind.IDENTIFIER &&
+            suggestion.suggestion.element?.kind == ElementKind.GETTER)
+        .toList();
+    return nest(
+      result,
+      (selected) => 'getters ${valueStr(selected)}',
+    );
+  }
+
+  @useResult
+  CheckTarget<Iterable<CompletionSuggestionForTesting>> get methods {
+    var result = value
+        .where((suggestion) =>
+            suggestion.suggestion.kind == CompletionSuggestionKind.IDENTIFIER &&
+            suggestion.suggestion.element?.kind == ElementKind.METHOD)
+        .toList();
+    return nest(
+      result,
+      (selected) => 'setters ${valueStr(selected)}',
+    );
+  }
+
+  @useResult
   CheckTarget<Iterable<CompletionSuggestionForTesting>> get namedArguments {
     var result = value
         .where((suggestion) =>
@@ -422,6 +483,19 @@
   }
 
   @useResult
+  CheckTarget<Iterable<CompletionSuggestionForTesting>> get setters {
+    var result = value
+        .where((suggestion) =>
+            suggestion.suggestion.kind == CompletionSuggestionKind.IDENTIFIER &&
+            suggestion.suggestion.element?.kind == ElementKind.SETTER)
+        .toList();
+    return nest(
+      result,
+      (selected) => 'setters ${valueStr(selected)}',
+    );
+  }
+
+  @useResult
   CheckTarget<Iterable<CompletionSuggestionForTesting>> get withElementClass {
     return nest(
       value.where((e) {
@@ -446,6 +520,14 @@
 
 extension ElementExtension on CheckTarget<Element> {
   @useResult
+  CheckTarget<bool> get isStatic {
+    return nest(
+      value.isStatic,
+      (selected) => 'isStatic ${valueStr(selected)}',
+    );
+  }
+
+  @useResult
   CheckTarget<ElementKind> get kind {
     return nest(
       value.kind,
diff --git a/pkg/analysis_server/test/services/completion/dart/declaration/class_test.dart b/pkg/analysis_server/test/services/completion/dart/declaration/class_test.dart
new file mode 100644
index 0000000..cd5382bb
--- /dev/null
+++ b/pkg/analysis_server/test/services/completion/dart/declaration/class_test.dart
@@ -0,0 +1,249 @@
+// 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_utilities/check/check.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../../../../client/completion_driver_test.dart';
+import '../completion_check.dart';
+
+void main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(ClassStaticMembersWithoutClassNameTest);
+  });
+}
+
+@reflectiveTest
+class ClassStaticMembersWithoutClassNameTest
+    extends AbstractCompletionDriverTest with _Helpers {
+  @override
+  TestingCompletionProtocol get protocol => TestingCompletionProtocol.version2;
+
+  Future<void> test_field_hasContextType_exact() async {
+    await _checkLocations(
+      classCode: r'''
+class A {
+  static final int foo01 = 0;
+  static final num foo02 = 0;
+  static final double foo03 = 0;
+  final int foo04 = 0;
+}
+''',
+      contextCode: r'''
+void f() {
+  int a = foo0^
+}
+''',
+      validator: (response) {
+        check(response).suggestions.fields.completions.matchesInAnyOrder([
+          (e) => e.isEqualTo('A.foo01'),
+        ]);
+      },
+    );
+  }
+
+  Future<void> test_field_hasContextType_subtypes() async {
+    await _checkLocations(
+      classCode: r'''
+class A {
+  static final int foo01 = 0;
+  static final double foo02 = 0;
+  static final num foo03 = 0;
+  static final Object foo04 = '';
+}
+''',
+      contextCode: r'''
+void f() {
+  num a = foo0^
+}
+''',
+      validator: (response) {
+        check(response).suggestions.fields.completions.matchesInAnyOrder([
+          (e) => e.isEqualTo('A.foo01'),
+          (e) => e.isEqualTo('A.foo02'),
+          (e) => e.isEqualTo('A.foo03'),
+        ]);
+      },
+    );
+  }
+
+  Future<void> test_field_noContextType() async {
+    await _checkLocations(
+      classCode: r'''
+class A {
+  static final foo01 = 0;
+  static final foo02 = 0;
+  final foo03 = 0;
+}
+''',
+      contextCode: r'''
+void f() {
+  foo0^
+}
+''',
+      validator: (response) {
+        check(response).suggestions.fields.isEmpty;
+      },
+    );
+  }
+
+  Future<void> test_getter_hasContextType_exact() async {
+    await _checkLocations(
+      classCode: r'''
+class A {
+  static int get foo01 => 0;
+  static num get foo02 => 0;
+  static double get foo03 => 0;
+}
+''',
+      contextCode: r'''
+void f() {
+  int a = foo0^
+}
+''',
+      validator: (response) {
+        check(response).suggestions.getters.completions.matchesInAnyOrder([
+          (e) => e.isEqualTo('A.foo01'),
+        ]);
+      },
+    );
+  }
+
+  Future<void> test_getter_hasContextType_subtypes() async {
+    await _checkLocations(
+      classCode: r'''
+class A {
+  static int get foo01 => 0;
+  static double get foo02 => 0;
+  static num get foo03 => 0;
+  static Object get foo04 => '';
+}
+''',
+      contextCode: r'''
+void f() {
+  num a = foo0^
+}
+''',
+      validator: (response) {
+        check(response).suggestions.getters.completions.matchesInAnyOrder([
+          (e) => e.isEqualTo('A.foo01'),
+          (e) => e.isEqualTo('A.foo02'),
+          (e) => e.isEqualTo('A.foo03'),
+        ]);
+      },
+    );
+  }
+
+  Future<void> test_getter_noContextType() async {
+    await _checkLocations(
+      classCode: r'''
+class A {
+  static int get foo01 => 0;
+}
+''',
+      contextCode: r'''
+void f() {
+  foo0^
+}
+''',
+      validator: (response) {
+        check(response).suggestions.getters.isEmpty;
+      },
+    );
+  }
+
+  Future<void> test_method() async {
+    await _checkLocations(
+      classCode: r'''
+class A {
+  static void foo01() {}
+}
+''',
+      contextCode: r'''
+void f() {
+  foo0^
+}
+''',
+      validator: (response) {
+        check(response).suggestions.methods.isEmpty;
+      },
+    );
+  }
+
+  Future<void> test_setter_hasContextType() async {
+    await _checkLocations(
+      classCode: r'''
+class A {
+  static set foo01(int _) {}
+  static set foo02(num _) {}
+  static set foo03(double _) {}
+}
+''',
+      contextCode: r'''
+void f() {
+  int a = foo0^
+}
+''',
+      validator: (response) {
+        check(response).suggestions.setters.isEmpty;
+      },
+    );
+  }
+
+  Future<void> test_setter_noContextType() async {
+    await _checkLocations(
+      classCode: r'''
+class A {
+  static set foo01(int _) {}
+}
+''',
+      contextCode: r'''
+void f() {
+  foo0^
+}
+''',
+      validator: (response) {
+        check(response).suggestions.setters.isEmpty;
+      },
+    );
+  }
+}
+
+mixin _Helpers on AbstractCompletionDriverTest {
+  Future<void> _checkLocations({
+    required String classCode,
+    required String contextCode,
+    required void Function(CompletionResponseForTesting response) validator,
+  }) async {
+    // local
+    {
+      final response = await getTestCodeSuggestions('''
+$classCode
+
+$contextCode
+''');
+      validator(response);
+    }
+
+    // imported, without prefix
+    {
+      newFile('$testPackageLibPath/a.dart', classCode);
+      final response = await getTestCodeSuggestions('''
+import 'a.dart';
+
+$contextCode
+''');
+      validator(response);
+    }
+
+    // not imported
+    {
+      newFile('$testPackageLibPath/a.dart', classCode);
+      final response = await getTestCodeSuggestions('''
+$contextCode
+''');
+      validator(response);
+    }
+  }
+}
diff --git a/pkg/analysis_server/test/services/completion/dart/declaration/enum_test.dart b/pkg/analysis_server/test/services/completion/dart/declaration/enum_test.dart
index cb88047..e15b337 100644
--- a/pkg/analysis_server/test/services/completion/dart/declaration/enum_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/declaration/enum_test.dart
@@ -30,8 +30,12 @@
 mixin EnumTestCases on AbstractCompletionDriverTest {
   Future<void> test_enumConstantName() async {
     await _check_locations(
-      declaration: 'enum MyEnum { foo01 }',
-      codeAtCompletion: 'foo0^',
+      declaration: '''
+enum MyEnum { foo01 }
+enum OtherEnum { foo02 }
+''',
+      declarationForContextType: 'void useMyEnum(MyEnum _) {}',
+      codeAtCompletion: 'useMyEnum(foo0^);',
       validator: (response) {
         check(response).hasReplacement(left: 4);
 
@@ -61,6 +65,7 @@
   Future<void> test_enumConstantName_imported_withPrefix() async {
     newFile('$testPackageLibPath/a.dart', r'''
 enum MyEnum { foo01 }
+enum OtherEnum { foo02 }
 ''');
 
     if (isProtocolVersion1) {
@@ -70,8 +75,10 @@
     var response = await getTestCodeSuggestions('''
 import 'a.dart' as prefix;
 
+void useMyEnum(prefix.MyEnum _) {}
+
 void f() {
-  foo0^
+  useMyEnum(foo0^);
 }
 ''');
 
@@ -223,7 +230,8 @@
   Future<void> test_nothing() async {
     await _check_locations(
       declaration: 'enum MyEnum { v }',
-      codeAtCompletion: '^',
+      declarationForContextType: 'void useMyEnum(MyEnum _) {}',
+      codeAtCompletion: 'useMyEnum(^);',
       validator: (response) {
         check(response).hasEmptyReplacement();
 
@@ -257,8 +265,10 @@
     var response = await getTestCodeSuggestions('''
 import 'a.dart' as prefix;
 
+void useMyEnum(prefix.MyEnum _) {}
+
 void f() {
-  ^
+  useMyEnum(^);
 }
 ''');
 
@@ -288,6 +298,7 @@
 
   Future<void> _check_locations({
     required String declaration,
+    String declarationForContextType = '',
     required String codeAtCompletion,
     required void Function(CompletionResponseForTesting response) validator,
   }) async {
@@ -295,6 +306,7 @@
     {
       var response = await getTestCodeSuggestions('''
 $declaration
+$declarationForContextType
 void f() {
   $codeAtCompletion
 }
@@ -312,6 +324,7 @@
       }
       var response = await getTestCodeSuggestions('''
 import 'a.dart';
+$declarationForContextType
 void f() {
   $codeAtCompletion
 }
@@ -324,10 +337,15 @@
       newFile('$testPackageLibPath/a.dart', '''
 $declaration
 ''');
+      newFile('$testPackageLibPath/context_type.dart', '''
+import 'a.dart'; // ignore: unused_import
+$declarationForContextType
+''');
       if (isProtocolVersion1) {
         await waitForSetWithUri('package:test/a.dart');
       }
       var response = await getTestCodeSuggestions('''
+import 'context_type.dart';
 void f() {
   $codeAtCompletion
 }
diff --git a/pkg/analysis_server/test/services/completion/dart/declaration/test_all.dart b/pkg/analysis_server/test/services/completion/dart/declaration/test_all.dart
index 12cf693..c74d1a0 100644
--- a/pkg/analysis_server/test/services/completion/dart/declaration/test_all.dart
+++ b/pkg/analysis_server/test/services/completion/dart/declaration/test_all.dart
@@ -4,12 +4,14 @@
 
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
+import 'class_test.dart' as class_;
 import 'enum_test.dart' as enum_;
 import 'library_test.dart' as library_;
 
 /// Tests suggestions produced for various kinds of declarations.
 void main() {
   defineReflectiveSuite(() {
+    class_.main();
     enum_.main();
     library_.main();
   });
diff --git a/pkg/analysis_server/test/services/completion/dart/imported_reference_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/imported_reference_contributor_test.dart
index 3b05dc9..e0d0fad 100644
--- a/pkg/analysis_server/test/services/completion/dart/imported_reference_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/imported_reference_contributor_test.dart
@@ -1923,8 +1923,8 @@
     assertSuggestEnumConst('E.two');
 
     assertSuggestEnum('F');
-    assertSuggestEnumConst('F.three');
-    assertSuggestEnumConst('F.four');
+    assertNotSuggested('F.three');
+    assertNotSuggested('F.four');
   }
 
   Future<void> test_ExpressionStatement_identifier() async {
diff --git a/pkg/analysis_server/test/services/completion/dart/keyword_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/keyword_contributor_test.dart
index f6e0668..0d839ec 100644
--- a/pkg/analysis_server/test/services/completion/dart/keyword_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/keyword_contributor_test.dart
@@ -2272,7 +2272,6 @@
     assertSuggestKeywords([]);
   }
 
-  @FailingTest(issue: 'https://github.com/dart-lang/sdk/issues/49046')
   Future<void> test_part_of() async {
     addTestSource('part of foo;^');
     await computeSuggestions();
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 3cfdb13..db03ff4 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
@@ -2312,7 +2312,7 @@
   }
 
   Future<void> test_enum() async {
-    addTestSource('enum E { one, two } void f() {^}');
+    addTestSource('enum E { one, two } void f() {E v = ^}');
     await computeSuggestions();
     assertSuggestEnum('E');
     assertSuggestEnumConst('E.one');
@@ -2322,7 +2322,7 @@
   }
 
   Future<void> test_enum_deprecated() async {
-    addTestSource('@deprecated enum E { one, two } void f() {^}');
+    addTestSource('@deprecated enum E { one, two } void f() {E v = ^}');
     await computeSuggestions();
     assertSuggestEnum('E', isDeprecated: true);
     assertSuggestEnumConst('E.one', isDeprecated: true);
@@ -2349,8 +2349,8 @@
     assertSuggestEnumConst('E.two');
 
     assertSuggestEnum('F');
-    assertSuggestEnumConst('F.three');
-    assertSuggestEnumConst('F.four');
+    assertNotSuggested('F.three');
+    assertNotSuggested('F.four');
   }
 
   Future<void> test_enum_filter_assignment() async {
@@ -2370,8 +2370,8 @@
     assertSuggestEnumConst('E.two');
 
     assertSuggestEnum('F');
-    assertSuggestEnumConst('F.three');
-    assertSuggestEnumConst('F.four');
+    assertNotSuggested('F.three');
+    assertNotSuggested('F.four');
   }
 
   Future<void> test_enum_filter_binaryEquals() async {
@@ -2412,8 +2412,8 @@
     assertSuggestEnumConst('E.two');
 
     assertSuggestEnum('F');
-    assertSuggestEnumConst('F.three');
-    assertSuggestEnumConst('F.four');
+    assertNotSuggested('F.three');
+    assertNotSuggested('F.four');
   }
 
   Future<void> test_enum_filter_variableDeclaration() async {
@@ -2432,8 +2432,8 @@
     assertSuggestEnumConst('E.two');
 
     assertSuggestEnum('F');
-    assertSuggestEnumConst('F.three');
-    assertSuggestEnumConst('F.four');
+    assertNotSuggested('F.three');
+    assertNotSuggested('F.four');
   }
 
   Future<void> test_enum_shadowed() async {
diff --git a/pkg/analysis_server/test/services/completion/dart/location/directive_uri_test.dart b/pkg/analysis_server/test/services/completion/dart/location/directive_uri_test.dart
new file mode 100644
index 0000000..1c1ceb2
--- /dev/null
+++ b/pkg/analysis_server/test/services/completion/dart/location/directive_uri_test.dart
@@ -0,0 +1,95 @@
+// 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/test_utilities/package_config_file_builder.dart';
+import 'package:analyzer_utilities/check/check.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../../../../client/completion_driver_test.dart';
+import '../completion_check.dart';
+
+void main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(DirectiveUriTest);
+  });
+}
+
+@reflectiveTest
+class DirectiveUriTest extends AbstractCompletionDriverTest {
+  @override
+  TestingCompletionProtocol get protocol => TestingCompletionProtocol.version2;
+
+  Future<void> test_uri_end() async {
+    await _checkDirectives(
+      uriContent: 'foo0^',
+      validator: (response) {
+        // We have both `foo0x`, but no `bar`.
+        check(response).suggestions.matchesInAnyOrder([
+          (suggestion) => suggestion
+            ..isImport
+            ..completion.isEqualTo('package:foo/foo01.dart'),
+          (suggestion) => suggestion
+            ..isImport
+            ..completion.isEqualTo('package:foo/foo02.dart'),
+        ]);
+      },
+    );
+  }
+
+  Future<void> test_uri_notEnd() async {
+    await _checkDirectives(
+      uriContent: 'foo0^xyz',
+      validator: (response) {
+        // We ignore 'xyz' after the caret.
+        check(response).suggestions.matchesInAnyOrder([
+          (suggestion) => suggestion
+            ..isImport
+            ..completion.isEqualTo('package:foo/foo01.dart'),
+          (suggestion) => suggestion
+            ..isImport
+            ..completion.isEqualTo('package:foo/foo02.dart'),
+        ]);
+      },
+    );
+  }
+
+  Future<void> _checkDirectives({
+    required String uriContent,
+    required void Function(CompletionResponseForTesting response) validator,
+  }) async {
+    _configurePackagesFooBar();
+
+    {
+      var response = await getTestCodeSuggestions('''
+export '$uriContent';
+''');
+      validator(response);
+    }
+
+    {
+      var response = await getTestCodeSuggestions('''
+import '$uriContent';
+''');
+      validator(response);
+    }
+  }
+
+  void _configurePackagesFooBar() {
+    final fooPackageRoot = getFolder('$packagesRootPath/foo');
+    newFile('$packagesRootPath/foo/lib/foo01.dart', '');
+    newFile('$packagesRootPath/foo/lib/foo02.dart', '');
+    // We use this file to check that exactly `foo0` is used as prefix.
+    // So, we don't have one-off and don't use just `foo`.
+    newFile('$packagesRootPath/foo/lib/foo11.dart', '');
+
+    final barPackageRoot = getFolder('$packagesRootPath/bar');
+    newFile('$packagesRootPath/bar/lib/bar01.dart', '');
+
+    writeTestPackageConfig(
+      config: PackageConfigFileBuilder()
+        ..add(name: 'foo', rootPath: fooPackageRoot.path)
+        ..add(name: 'bar', rootPath: barPackageRoot.path),
+    );
+  }
+}
diff --git a/pkg/analysis_server/test/services/completion/dart/location/test_all.dart b/pkg/analysis_server/test/services/completion/dart/location/test_all.dart
index b0fe488..467a484 100644
--- a/pkg/analysis_server/test/services/completion/dart/location/test_all.dart
+++ b/pkg/analysis_server/test/services/completion/dart/location/test_all.dart
@@ -6,6 +6,7 @@
 
 import 'class_body_test.dart' as class_body;
 import 'compilation_unit_test.dart' as compilation_unit;
+import 'directive_uri_test.dart' as directive_uri;
 import 'enum_constant_test.dart' as enum_constant;
 import 'enum_test.dart' as enum_;
 import 'field_formal_parameter_test.dart' as field_formal_parameter;
@@ -17,6 +18,7 @@
   defineReflectiveSuite(() {
     class_body.main();
     compilation_unit.main();
+    directive_uri.main();
     enum_constant.main();
     enum_.main();
     field_formal_parameter.main();
diff --git a/pkg/analysis_server/test/services/snippets/dart/flutter_snippet_producers_test.dart b/pkg/analysis_server/test/services/snippets/dart/flutter_snippet_producers_test.dart
index 61a2ca0..fcce56b 100644
--- a/pkg/analysis_server/test/services/snippets/dart/flutter_snippet_producers_test.dart
+++ b/pkg/analysis_server/test/services/snippets/dart/flutter_snippet_producers_test.dart
@@ -91,6 +91,7 @@
     }
     expect(code, '''
 import 'package:flutter/src/foundation/key.dart';
+import 'package:flutter/src/widgets/container.dart';
 import 'package:flutter/src/widgets/framework.dart';
 
 class MyWidget extends StatefulWidget {
@@ -103,7 +104,7 @@
 class _MyWidgetState extends State<MyWidget> {
   @override
   Widget build(BuildContext context) {
-    
+    return Container();
   }
 }''');
   }
@@ -126,6 +127,7 @@
       code = SourceEdit.applySequence(code, edit.edits);
     }
     expect(code, '''
+import 'package:flutter/src/widgets/container.dart';
 import 'package:flutter/src/widgets/framework.dart';
 
 class MyWidget extends StatefulWidget {
@@ -138,20 +140,21 @@
 class _MyWidgetState extends State<MyWidget> {
   @override
   Widget build(BuildContext context) {
-    
+    return Container();
   }
 }''');
     expect(snippet.change.selection!.file, testFile);
-    expect(snippet.change.selection!.offset, 296);
+    expect(snippet.change.selection!.offset, 356);
+    expect(snippet.change.selectionLength, 11);
     expect(snippet.change.linkedEditGroups.map((group) => group.toJson()), [
       {
         'positions': [
-          {'file': testFile, 'offset': 60},
-          {'file': testFile, 'offset': 102},
-          {'file': testFile, 'offset': 146},
-          {'file': testFile, 'offset': 174},
-          {'file': testFile, 'offset': 201},
-          {'file': testFile, 'offset': 229},
+          {'file': testFile, 'offset': 113},
+          {'file': testFile, 'offset': 155},
+          {'file': testFile, 'offset': 199},
+          {'file': testFile, 'offset': 227},
+          {'file': testFile, 'offset': 254},
+          {'file': testFile, 'offset': 282},
         ],
         'length': 8,
         'suggestions': []
@@ -189,6 +192,7 @@
     expect(code, '''
 import 'package:flutter/src/animation/animation_controller.dart';
 import 'package:flutter/src/foundation/key.dart';
+import 'package:flutter/src/widgets/container.dart';
 import 'package:flutter/src/widgets/framework.dart';
 import 'package:flutter/src/widgets/ticker_provider.dart';
 
@@ -217,7 +221,7 @@
 
   @override
   Widget build(BuildContext context) {
-    
+    return Container();
   }
 }''');
   }
@@ -241,6 +245,7 @@
     }
     expect(code, '''
 import 'package:flutter/src/animation/animation_controller.dart';
+import 'package:flutter/src/widgets/container.dart';
 import 'package:flutter/src/widgets/framework.dart';
 import 'package:flutter/src/widgets/ticker_provider.dart';
 
@@ -269,20 +274,21 @@
 
   @override
   Widget build(BuildContext context) {
-    
+    return Container();
   }
 }''');
     expect(snippet.change.selection!.file, testFile);
-    expect(snippet.change.selection!.offset, 699);
+    expect(snippet.change.selection!.offset, 759);
+    expect(snippet.change.selectionLength, 11);
     expect(snippet.change.linkedEditGroups.map((group) => group.toJson()), [
       {
         'positions': [
-          {'file': testFile, 'offset': 185},
-          {'file': testFile, 'offset': 227},
-          {'file': testFile, 'offset': 271},
-          {'file': testFile, 'offset': 299},
-          {'file': testFile, 'offset': 326},
-          {'file': testFile, 'offset': 354},
+          {'file': testFile, 'offset': 238},
+          {'file': testFile, 'offset': 280},
+          {'file': testFile, 'offset': 324},
+          {'file': testFile, 'offset': 352},
+          {'file': testFile, 'offset': 379},
+          {'file': testFile, 'offset': 407},
         ],
         'length': 8,
         'suggestions': []
@@ -316,6 +322,7 @@
     }
     expect(code, '''
 import 'package:flutter/src/foundation/key.dart';
+import 'package:flutter/src/widgets/container.dart';
 import 'package:flutter/src/widgets/framework.dart';
 
 class MyWidget extends StatelessWidget {
@@ -323,7 +330,7 @@
 
   @override
   Widget build(BuildContext context) {
-    
+    return Container();
   }
 }''');
   }
@@ -346,6 +353,7 @@
       code = SourceEdit.applySequence(code, edit.edits);
     }
     expect(code, '''
+import 'package:flutter/src/widgets/container.dart';
 import 'package:flutter/src/widgets/framework.dart';
 
 class MyWidget extends StatelessWidget {
@@ -353,16 +361,17 @@
 
   @override
   Widget build(BuildContext context) {
-    
+    return Container();
   }
 }''');
     expect(snippet.change.selection!.file, testFile);
-    expect(snippet.change.selection!.offset, 182);
+    expect(snippet.change.selection!.offset, 242);
+    expect(snippet.change.selectionLength, 11);
     expect(snippet.change.linkedEditGroups.map((group) => group.toJson()), [
       {
         'positions': [
-          {'file': testFile, 'offset': 60},
-          {'file': testFile, 'offset': 103},
+          {'file': testFile, 'offset': 113},
+          {'file': testFile, 'offset': 156},
         ],
         'length': 8,
         'suggestions': []
diff --git a/pkg/analysis_server/test/src/cider/completion_test.dart b/pkg/analysis_server/test/src/cider/completion_test.dart
index e270153..2fd1095 100644
--- a/pkg/analysis_server/test/src/cider/completion_test.dart
+++ b/pkg/analysis_server/test/src/cider/completion_test.dart
@@ -401,7 +401,7 @@
     _assertHasClass(text: 'String');
     _assertHasConstructor(text: 'A');
     _assertHasConstructor(text: 'B');
-    _assertHasEnumConstant(text: 'E.e');
+    _assertHasEnum(text: 'E');
     _assertHasMethod(text: 'foo');
     _assertHasMethod(text: 'bar');
     _assertHasParameter(text: 'a');
@@ -661,10 +661,10 @@
     return matching.single;
   }
 
-  CompletionSuggestion _assertHasEnumConstant({required String text}) {
+  CompletionSuggestion _assertHasEnum({required String text}) {
     var matching = _matchingCompletions(
       text: text,
-      elementKind: ElementKind.ENUM_CONSTANT,
+      elementKind: ElementKind.ENUM,
     );
     expect(matching, hasLength(1), reason: 'Expected exactly one completion');
     return matching.single;
diff --git a/pkg/analysis_server/test/src/services/correction/fix/add_missing_parameter_required_test.dart b/pkg/analysis_server/test/src/services/correction/fix/add_missing_parameter_required_test.dart
index 7c1d58c..74236cce 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/add_missing_parameter_required_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/add_missing_parameter_required_test.dart
@@ -105,7 +105,6 @@
 ''');
   }
 
-  @FailingTest(issue: 'https://github.com/dart-lang/sdk/issues/49046')
   Future<void> test_function_hasZero_partOfName_noLibrary() async {
     await resolveTestCode('''
 part of my_lib;
diff --git a/pkg/analysis_server/test/src/services/correction/fix/create_constructor_test.dart b/pkg/analysis_server/test/src/services/correction/fix/create_constructor_test.dart
index c00ab29..62309a8 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/create_constructor_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/create_constructor_test.dart
@@ -79,7 +79,6 @@
 ''', target: a);
   }
 
-  @FailingTest(issue: 'https://github.com/dart-lang/sdk/issues/49046')
   Future<void> test_inPart_partOfName_noLibrary() async {
     await resolveTestCode('''
 part of my_lib;
diff --git a/pkg/analysis_server/test/src/services/correction/fix/create_field_test.dart b/pkg/analysis_server/test/src/services/correction/fix/create_field_test.dart
index 0cc45cd..af26bc4 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/create_field_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/create_field_test.dart
@@ -383,7 +383,6 @@
     });
   }
 
-  @FailingTest(issue: 'https://github.com/dart-lang/sdk/issues/49046')
   Future<void> test_inPart_self() async {
     await resolveTestCode('''
 part of lib;
diff --git a/pkg/analysis_server/test/src/services/correction/fix/create_getter_test.dart b/pkg/analysis_server/test/src/services/correction/fix/create_getter_test.dart
index f7f443f..7566168 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/create_getter_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/create_getter_test.dart
@@ -326,7 +326,6 @@
     });
   }
 
-  @FailingTest(issue: 'https://github.com/dart-lang/sdk/issues/49046')
   Future<void> test_qualified_instance_inPart_self() async {
     await resolveTestCode('''
 part of lib;
diff --git a/pkg/analysis_server/test/src/services/correction/fix/create_setter_test.dart b/pkg/analysis_server/test/src/services/correction/fix/create_setter_test.dart
index db18da2..fea7674 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/create_setter_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/create_setter_test.dart
@@ -320,7 +320,6 @@
     });
   }
 
-  @FailingTest(issue: 'https://github.com/dart-lang/sdk/issues/49046')
   Future<void> test_qualified_instance_inPart_self() async {
     await resolveTestCode('''
 part of lib;
diff --git a/pkg/analysis_server/test/tool/lsp_spec/generated_classes_test.dart b/pkg/analysis_server/test/tool/lsp_spec/generated_classes_test.dart
index f10b8ce..772f091 100644
--- a/pkg/analysis_server/test/tool/lsp_spec/generated_classes_test.dart
+++ b/pkg/analysis_server/test/tool/lsp_spec/generated_classes_test.dart
@@ -29,10 +29,10 @@
 
     test('with aliased list fields can be checked for equality', () {
       final a = TextDocumentRegistrationOptions(documentSelector: [
-        TextDocumentFilter(language: 'dart', scheme: 'file')
+        TextDocumentFilterWithScheme(language: 'dart', scheme: 'file')
       ]);
       final b = TextDocumentRegistrationOptions(documentSelector: [
-        TextDocumentFilter(language: 'dart', scheme: 'file')
+        TextDocumentFilterWithScheme(language: 'dart', scheme: 'file')
       ]);
 
       expect(a, equals(b));
@@ -87,12 +87,12 @@
 
     test('consider subclasses when checking for equality', () {
       final a = TextDocumentRegistrationOptions(documentSelector: [
-        TextDocumentFilter(language: 'dart', scheme: 'file')
+        TextDocumentFilterWithScheme(language: 'dart', scheme: 'file')
       ]);
       final b = TextDocumentSaveRegistrationOptions(
           includeText: true,
           documentSelector: [
-            TextDocumentFilter(language: 'dart', scheme: 'file')
+            TextDocumentFilterWithScheme(language: 'dart', scheme: 'file')
           ]);
 
       expect(a, isNot(equals(b)));
diff --git a/pkg/analysis_server/tool/lsp_spec/codegen_dart.dart b/pkg/analysis_server/tool/lsp_spec/codegen_dart.dart
index 14e8620..2fe1e2e 100644
--- a/pkg/analysis_server/tool/lsp_spec/codegen_dart.dart
+++ b/pkg/analysis_server/tool/lsp_spec/codegen_dart.dart
@@ -73,23 +73,26 @@
     //   the migration to JSON meta_model.
     'ClientCapabilitiesWindow': 'WindowClientCapabilities',
     'ClientCapabilitiesWorkspace': 'WorkspaceClientCapabilities',
-    'ClientCapabilitiesFileOperations': 'FileOperationClientCapabilities',
-    'ServerCapabilitiesFileOperations': 'FileOperationOptions',
+    'ClientCapabilitiesWorkspaceFileOperations':
+        'FileOperationClientCapabilities',
+    'ServerCapabilitiesWorkspaceFileOperations': 'FileOperationOptions',
     'ClientCapabilitiesGeneral': 'GeneralClientCapabilities',
-    'CompletionClientCapabilitiesInsertTextModeSupport':
+    'CompletionClientCapabilitiesCompletionItemInsertTextModeSupport':
         'CompletionItemInsertTextModeSupport',
-    'CompletionClientCapabilitiesResolveSupport':
+    'CompletionClientCapabilitiesCompletionItemResolveSupport':
         'CompletionItemResolveSupport',
-    'CompletionClientCapabilitiesTagSupport': 'CompletionItemTagSupport',
-    'CodeActionClientCapabilitiesCodeActionKind':
+    'CompletionClientCapabilitiesCompletionItemTagSupport':
+        'CompletionItemTagSupport',
+    'CodeActionClientCapabilitiesCodeActionLiteralSupportCodeActionKind':
         'CodeActionLiteralSupportCodeActionKind',
-    'DocumentFilter': 'TextDocumentFilter',
-    'ClientCapabilitiesStaleRequestSupport':
+    // In JSON model this becomes a union of literals which we assign improved
+    // names to (to avoid numeric suffixes).
+    'DocumentFilter': 'TextDocumentFilterWithScheme',
+    'ClientCapabilitiesGeneralStaleRequestSupport':
         'GeneralClientCapabilitiesStaleRequestSupport',
-    'SignatureHelpClientCapabilitiesParameterInformation':
+    'SignatureHelpClientCapabilitiesSignatureInformationParameterInformation':
         'SignatureInformationParameterInformation',
-    'NotebookDocumentChangeEventStructure':
-        'NotebookDocumentChangeEventCellsStructure',
+    'CompletionListItemDefaultsEditRange': 'CompletionItemEditRange',
   };
 
   for (final type in types) {
@@ -218,6 +221,21 @@
   }
 }
 
+bool _isOverride(Interface interface, Field field) {
+  for (var parentType in interface.baseTypes) {
+    var parent = _interfaces[(parentType as Type).name];
+    if (parent != null) {
+      if (parent.members.any((m) => m.name == field.name)) {
+        return true;
+      }
+      if (_isOverride(parent, field)) {
+        return true;
+      }
+    }
+  }
+  return false;
+}
+
 bool _isSimpleType(TypeBase type) {
   const literals = ['num', 'String', 'bool', 'int'];
   return type is Type && literals.contains(type.dartType);
@@ -364,14 +382,15 @@
         ..writeIndentedln('}');
     }
     buffer.writeIndented('if (');
-    if (field.allowsNull || field.allowsUndefined) {
+    final nullCheck = field.allowsNull || field.allowsUndefined;
+    if (nullCheck) {
       buffer.write('$localName != null && ');
     }
-    buffer.write('!(');
     _writeTypeCheckCondition(
-        buffer, interface, localName, field.type, 'reporter');
+        buffer, interface, localName, field.type, 'reporter',
+        negation: true, parenForCollection: nullCheck);
     buffer
-      ..write(')) {')
+      ..write(') {')
       ..indent()
       ..writeIndentedln(
           "reporter.reportError('${_getTypeCheckFailureMessage(field.type).replaceAll("'", "\\'")}');")
@@ -528,14 +547,14 @@
   });
   buffer
     ..writeln()
-    ..writeIndentedln('Object toJson() => _value;')
+    ..writeIndentedln('@override Object toJson() => _value;')
     ..writeln()
     ..writeIndentedln('@override String toString() => _value.toString();')
     ..writeln()
     ..writeIndentedln('@override int get hashCode => _value.hashCode;')
     ..writeln()
     ..writeIndentedln(
-        'bool operator ==(Object other) => other is $namespaceName && other._value == _value;')
+        '@override bool operator ==(Object other) => other is $namespaceName && other._value == _value;')
     ..outdent()
     ..writeln('}')
     ..writeln();
@@ -587,10 +606,14 @@
   }
 }
 
-void _writeField(IndentableStringBuffer buffer, Field field) {
+void _writeField(
+    IndentableStringBuffer buffer, Interface interface, Field field) {
   _writeDocCommentsAndAnnotations(buffer, field);
   final needsNullable =
       (field.allowsNull || field.allowsUndefined) && !isAnyType(field.type);
+  if (_isOverride(interface, field)) {
+    buffer.writeIndentedln('@override');
+  }
   buffer
     ..writeIndented('final ')
     ..write(field.type.dartTypeWithTypeArgs)
@@ -628,7 +651,10 @@
     // Lists need to be map()'d so we can recursively call writeFromJsonCode
     // as they may need fromJson on each element.
     final listCast = requiresCast ? ' as List<Object?>$nullOperator' : '';
-    buffer.write('($valueCode$listCast)$nullOperator.map((item) => ');
+    final leftParen = requiresCast ? '(' : '';
+    final rightParen = requiresCast ? ')' : '';
+    buffer.write(
+        '$leftParen$valueCode$listCast$rightParen$nullOperator.map((item) => ');
     _writeFromJsonCode(buffer, type.elementType, 'item', allowsNull: false);
     buffer.write(').toList()');
   } else if (type is MapType) {
@@ -818,9 +844,9 @@
   final consts = interface.members.whereType<Const>().toList();
   final fields = _getAllFields(interface);
   buffer.writeln();
-  _writeMembers(buffer, consts);
+  _writeMembers(buffer, interface, consts);
   buffer.writeln();
-  _writeMembers(buffer, fields);
+  _writeMembers(buffer, interface, fields);
   buffer.writeln();
   _writeToJsonMethod(buffer, interface);
   _writeCanParseMethod(buffer, interface);
@@ -863,9 +889,10 @@
   }
 }
 
-void _writeMember(IndentableStringBuffer buffer, Member member) {
+void _writeMember(
+    IndentableStringBuffer buffer, Interface interface, Member member) {
   if (member is Field) {
-    _writeField(buffer, member);
+    _writeField(buffer, interface, member);
   } else if (member is Const) {
     _writeConst(buffer, member);
   } else {
@@ -873,8 +900,9 @@
   }
 }
 
-void _writeMembers(IndentableStringBuffer buffer, List<Member> members) {
-  _getSortedUnique(members).forEach((m) => _writeMember(buffer, m));
+void _writeMembers(
+    IndentableStringBuffer buffer, Interface interface, List<Member> members) {
+  _getSortedUnique(members).forEach((m) => _writeMember(buffer, interface, m));
 }
 
 void _writeToJsonCode(IndentableStringBuffer buffer, TypeBase type,
@@ -918,11 +946,22 @@
 }
 
 void _writeToJsonMethod(IndentableStringBuffer buffer, Interface interface) {
-  final mapName = _determineVariableName(interface,
-      ['result', 'map', 'json', 'toReturn', 'results', 'value', 'values']);
+  final fields = _getAllFields(interface);
 
   buffer
-    ..writeIndentedln('Map<String, Object?> toJson() {')
+    ..writeIndentedln('@override')
+    ..write('Map<String, Object?> toJson() ');
+  if (fields.isEmpty) {
+    buffer
+      ..writeIndentedln('=> {};')
+      ..writeln();
+    return;
+  }
+
+  final mapName = _determineVariableName(interface,
+      ['result', 'map', 'json', 'toReturn', 'results', 'value', 'values']);
+  buffer
+    ..writeIndentedln('{')
     ..indent()
     ..writeIndentedln('var $mapName = <String, Object?>{};');
   // ResponseMessage must confirm to JSON-RPC which says only one of
@@ -931,7 +970,7 @@
   if (interface.name == 'ResponseMessage') {
     _writeToJsonFieldsForResponseMessage(buffer, interface, mapName);
   } else {
-    for (var field in _getAllFields(interface)) {
+    for (var field in fields) {
       _writeJsonMapAssignment(buffer, field, mapName);
     }
   }
@@ -963,62 +1002,88 @@
 }
 
 void _writeTypeCheckCondition(IndentableStringBuffer buffer,
-    Interface? interface, String valueCode, TypeBase type, String reporter) {
+    Interface? interface, String valueCode, TypeBase type, String reporter,
+    {bool negation = false, bool parenForCollection = false}) {
   type = resolveTypeAlias(type);
 
   final dartType = type.dartType;
   final fullDartType = type.dartTypeWithTypeArgs;
+
+  final operator = negation ? '!' : '';
+  final and = negation ? '||' : '&&';
+  final every = negation ? 'any' : 'every';
+
   if (fullDartType == 'Object?') {
-    buffer.write('true');
+    buffer.write(negation ? 'false' : 'true');
   } else if (_isSimpleType(type)) {
-    buffer.write('$valueCode is $fullDartType');
+    buffer.write('$valueCode is$operator $fullDartType');
   } else if (type is LiteralType) {
-    buffer.write('$valueCode == ${type.literal}');
+    final equals = negation ? '!=' : '==';
+    buffer.write('$valueCode $equals ${type.literal}');
   } else if (_isSpecType(type)) {
-    buffer.write('$dartType.canParse($valueCode, $reporter)');
+    buffer.write('$operator$dartType.canParse($valueCode, $reporter)');
   } else if (type is ArrayType) {
-    buffer.write('($valueCode is List<Object?>');
+    if (parenForCollection) {
+      buffer.write('(');
+    }
+    buffer.write('$valueCode is$operator List<Object?>');
     if (fullDartType != 'Object?') {
       // TODO(dantup): If we're happy to assume we never have two lists in a union
       // we could skip this bit.
-      buffer.write(' && ($valueCode.every((item) => ');
+      buffer.write(' $and $valueCode.$every((item) => ');
       _writeTypeCheckCondition(
-          buffer, interface, 'item', type.elementType, reporter);
-      buffer.write('))');
+          buffer, interface, 'item', type.elementType, reporter,
+          negation: negation);
+      buffer.write(')');
     }
-    buffer.write(')');
+    if (parenForCollection) {
+      buffer.write(')');
+    }
   } else if (type is MapType) {
-    buffer.write('($valueCode is Map');
+    if (parenForCollection) {
+      buffer.write('(');
+    }
+    buffer.write('$valueCode is$operator Map');
     if (fullDartType != 'Object?') {
       buffer
-        ..write(' && (')
-        ..write('$valueCode.keys.every((item) => ');
+        ..write(' $and (')
+        ..write('$valueCode.keys.$every((item) => ');
       _writeTypeCheckCondition(
-          buffer, interface, 'item', type.indexType, reporter);
-      buffer.write('&& $valueCode.values.every((item) => ');
+          buffer, interface, 'item', type.indexType, reporter,
+          negation: negation);
+      buffer.write('$and $valueCode.values.$every((item) => ');
       _writeTypeCheckCondition(
-          buffer, interface, 'item', type.valueType, reporter);
+          buffer, interface, 'item', type.valueType, reporter,
+          negation: negation);
       buffer.write(')))');
     }
-    buffer.write(')');
+    if (parenForCollection) {
+      buffer.write(')');
+    }
   } else if (type is UnionType) {
+    if (parenForCollection && !negation) {
+      buffer.write('(');
+    }
+    var or = negation ? '&&' : '||';
     // To type check a union, we just recursively check against each of its types.
-    buffer.write('(');
     for (var i = 0; i < type.types.length; i++) {
       if (i != 0) {
-        buffer.write(' || ');
+        buffer.write(' $or ');
       }
       _writeTypeCheckCondition(
-          buffer, interface, valueCode, type.types[i], reporter);
+          buffer, interface, valueCode, type.types[i], reporter,
+          negation: negation);
     }
-    buffer.write(')');
+    if (parenForCollection && !negation) {
+      buffer.write(')');
+    }
   } else if (interface != null &&
       interface.typeArgs.any((typeArg) => typeArg.lexeme == fullDartType)) {
-    final comment = '/* $fullDartType.canParse($valueCode) */';
+    final comment = '/* $operator$fullDartType.canParse($valueCode) */';
     print(
         'WARN: Unable to write a type check for $valueCode with generic type $fullDartType. '
         'Please review the generated code annotated with $comment');
-    buffer.write('true $comment');
+    buffer.write('${negation ? 'false' : 'true'} $comment');
   } else {
     throw 'Unable to type check $valueCode against $fullDartType';
   }
diff --git a/pkg/analysis_server/tool/lsp_spec/generate_all.dart b/pkg/analysis_server/tool/lsp_spec/generate_all.dart
index 5952649..d22b884 100644
--- a/pkg/analysis_server/tool/lsp_spec/generate_all.dart
+++ b/pkg/analysis_server/tool/lsp_spec/generate_all.dart
@@ -166,10 +166,6 @@
 // To regenerate the file, use the script
 // "pkg/analysis_server/tool/lsp_spec/generate_all.dart".
 
-// ignore_for_file: annotate_overrides
-// ignore_for_file: prefer_is_not_operator
-// ignore_for_file: unnecessary_parenthesis
-
 import 'dart:core' hide deprecated;
 import 'dart:core' as core show deprecated;
 import 'dart:convert' show JsonEncoder;
diff --git a/pkg/analysis_server/tool/lsp_spec/lsp_specification.md b/pkg/analysis_server/tool/lsp_spec/lsp_specification.md
index 55fd7f4..5bee93f 100644
--- a/pkg/analysis_server/tool/lsp_spec/lsp_specification.md
+++ b/pkg/analysis_server/tool/lsp_spec/lsp_specification.md
@@ -3819,6 +3819,11 @@
 	 * return value for the corresponding server capability as well.
 	 */
 	dynamicRegistration?: boolean;
+
+	/**
+	 * The client supports sending execution summary data per cell.
+	 */
+	executionSummarySupport?: boolean;
 }
 ```
 
@@ -3857,7 +3862,7 @@
 	 	 * value is provided it matches against the
 	     * notebook type. '*' matches every notebook.
 		 */
-		notebookDocument: string | NotebookDocumentFilter;
+		notebook: string | NotebookDocumentFilter;
 
 		/**
 		 * The cells of the matching notebook to be synced.
@@ -3869,7 +3874,7 @@
 	 	 * value is provided it matches against the
 	     * notebook type. '*' matches every notebook.
 		 */
-		notebookDocument?: string | NotebookDocumentFilter;
+		notebook?: string | NotebookDocumentFilter;
 
 		/**
 		 * The cells of the matching notebook to be synced.
@@ -4735,7 +4740,7 @@
 <div class="anchorHolder"><a href="#typeHierarchyClientCapabilities" name="typeHierarchyClientCapabilities" class="linkableAnchor"></a></div>
 
 ```typescript
-type TypeHierarchyClientCapabilities = {
+export interface TypeHierarchyClientCapabilities {
 	/**
 	 * Whether implementation supports dynamic registration. If this is set to
 	 * `true` the client supports the new `(TextDocumentRegistrationOptions &
@@ -5998,6 +6003,10 @@
 	number = 'number',
 	regexp = 'regexp',
 	operator = 'operator'
+	/**
+	 * @since 3.17.0
+	 */
+	decorator = 'decorator'
 }
 ```
 
@@ -7601,6 +7610,13 @@
 		 * @since 3.17.0
 		 */
 		insertTextMode?: InsertTextMode;
+
+		/**
+		 * A default data value.
+		 *
+		 * @since 3.17.0
+		 */
+		data?: LSPAny;
 	}
 
 	/**
@@ -9883,7 +9899,7 @@
 export namespace PrepareSupportDefaultBehavior {
 	/**
 	 * The client's default behavior is to select the identifier
-	 * according the to language's syntax rule.
+	 * according to the language's syntax rule.
 	 */
 	 export const Identifier: 1 = 1;
 }
@@ -9992,7 +10008,7 @@
 <div class="anchorHolder"><a href="#prepareRenameParams" name="prepareRenameParams" class="linkableAnchor"></a></div>
 
 ```typescript
-export interface PrepareRenameParams extends TextDocumentPositionParams {
+export interface PrepareRenameParams extends TextDocumentPositionParams, WorkDoneProgressParams {
 }
 ```
 
diff --git a/pkg/analysis_server/tool/lsp_spec/typescript_parser.dart b/pkg/analysis_server/tool/lsp_spec/typescript_parser.dart
index d074460..3f790e3 100644
--- a/pkg/analysis_server/tool/lsp_spec/typescript_parser.dart
+++ b/pkg/analysis_server/tool/lsp_spec/typescript_parser.dart
@@ -623,9 +623,10 @@
       TypeBase type;
       if (_match([TokenType.LEFT_BRACE])) {
         // Inline interfaces.
+        final generatedName = _getAvailableName(containerName, fieldName);
         final members = <Member>[];
         while (!_check(TokenType.RIGHT_BRACE)) {
-          members.add(_member(containerName));
+          members.add(_member(generatedName));
         }
 
         _consume(TokenType.RIGHT_BRACE, 'Expected }');
@@ -638,7 +639,6 @@
           type = MapType(indexer.indexType, indexer.valueType);
         } else {
           // Add a synthetic interface to the parsers list of nodes to represent this type.
-          final generatedName = _getAvailableName(containerName, fieldName);
           _addNode(InlineInterface(generatedName, members));
           // Record the type as a simple type that references this interface.
           type = Type.identifier(generatedName);
diff --git a/pkg/analysis_server/tool/spec/generated/java/types/SourceChange.java b/pkg/analysis_server/tool/spec/generated/java/types/SourceChange.java
index 55b2761..687d00d 100644
--- a/pkg/analysis_server/tool/spec/generated/java/types/SourceChange.java
+++ b/pkg/analysis_server/tool/spec/generated/java/types/SourceChange.java
@@ -56,6 +56,12 @@
   private final Position selection;
 
   /**
+   * The length of the selection (starting at Position) that should be selected after the edits have
+   * been applied.
+   */
+  private final Integer selectionLength;
+
+  /**
    * The optional identifier of the change kind. The identifier remains stable even if the message
    * changes, or is parameterized.
    */
@@ -64,11 +70,12 @@
   /**
    * Constructor for {@link SourceChange}.
    */
-  public SourceChange(String message, List<SourceFileEdit> edits, List<LinkedEditGroup> linkedEditGroups, Position selection, String id) {
+  public SourceChange(String message, List<SourceFileEdit> edits, List<LinkedEditGroup> linkedEditGroups, Position selection, Integer selectionLength, String id) {
     this.message = message;
     this.edits = edits;
     this.linkedEditGroups = linkedEditGroups;
     this.selection = selection;
+    this.selectionLength = selectionLength;
     this.id = id;
   }
 
@@ -81,6 +88,7 @@
         ObjectUtilities.equals(other.edits, edits) &&
         ObjectUtilities.equals(other.linkedEditGroups, linkedEditGroups) &&
         ObjectUtilities.equals(other.selection, selection) &&
+        ObjectUtilities.equals(other.selectionLength, selectionLength) &&
         ObjectUtilities.equals(other.id, id);
     }
     return false;
@@ -91,8 +99,9 @@
     List<SourceFileEdit> edits = SourceFileEdit.fromJsonArray(jsonObject.get("edits").getAsJsonArray());
     List<LinkedEditGroup> linkedEditGroups = LinkedEditGroup.fromJsonArray(jsonObject.get("linkedEditGroups").getAsJsonArray());
     Position selection = jsonObject.get("selection") == null ? null : Position.fromJson(jsonObject.get("selection").getAsJsonObject());
+    Integer selectionLength = jsonObject.get("selectionLength") == null ? null : jsonObject.get("selectionLength").getAsInt();
     String id = jsonObject.get("id") == null ? null : jsonObject.get("id").getAsString();
-    return new SourceChange(message, edits, linkedEditGroups, selection, id);
+    return new SourceChange(message, edits, linkedEditGroups, selection, selectionLength, id);
   }
 
   public static List<SourceChange> fromJsonArray(JsonArray jsonArray) {
@@ -143,6 +152,14 @@
     return selection;
   }
 
+  /**
+   * The length of the selection (starting at Position) that should be selected after the edits have
+   * been applied.
+   */
+  public Integer getSelectionLength() {
+    return selectionLength;
+  }
+
   @Override
   public int hashCode() {
     HashCodeBuilder builder = new HashCodeBuilder();
@@ -150,6 +167,7 @@
     builder.append(edits);
     builder.append(linkedEditGroups);
     builder.append(selection);
+    builder.append(selectionLength);
     builder.append(id);
     return builder.toHashCode();
   }
@@ -170,6 +188,9 @@
     if (selection != null) {
       jsonObject.add("selection", selection.toJson());
     }
+    if (selectionLength != null) {
+      jsonObject.addProperty("selectionLength", selectionLength);
+    }
     if (id != null) {
       jsonObject.addProperty("id", id);
     }
@@ -188,6 +209,8 @@
     builder.append(StringUtils.join(linkedEditGroups, ", ") + ", ");
     builder.append("selection=");
     builder.append(selection + ", ");
+    builder.append("selectionLength=");
+    builder.append(selectionLength + ", ");
     builder.append("id=");
     builder.append(id);
     builder.append("]");
diff --git a/pkg/analysis_server/tool/spec/spec_input.html b/pkg/analysis_server/tool/spec/spec_input.html
index aaaeeb5..a368876 100644
--- a/pkg/analysis_server/tool/spec/spec_input.html
+++ b/pkg/analysis_server/tool/spec/spec_input.html
@@ -7,7 +7,7 @@
 <body>
 <h1>Analysis Server API Specification</h1>
 <h1 style="color:#999999">Version
-  <version>1.33.0</version>
+  <version>1.33.1</version>
 </h1>
 <p>
   This document contains a specification of the API provided by the
@@ -134,6 +134,11 @@
   ignoring the item or treating it with some default/fallback handling.
 </p>
 <h3>Changelog</h3>
+<h4>1.33.1</h4>
+<ul>
+  <li><tt>SourceChange</tt> now has an optional <tt>selectionLength</tt> that may be
+  provided when <tt>selection</tt> is.</li>
+</ul>
 <h4>1.33.0</h4>
 <ul>
   <li>Requests <tt>getSuggestions2</tt> and <tt>getSuggestionDetails2</tt>
diff --git a/pkg/analysis_server_client/lib/src/protocol/protocol_common.dart b/pkg/analysis_server_client/lib/src/protocol/protocol_common.dart
index 363d7e8..e9534c1 100644
--- a/pkg/analysis_server_client/lib/src/protocol/protocol_common.dart
+++ b/pkg/analysis_server_client/lib/src/protocol/protocol_common.dart
@@ -4276,6 +4276,7 @@
 ///   "edits": List<SourceFileEdit>
 ///   "linkedEditGroups": List<LinkedEditGroup>
 ///   "selection": optional Position
+///   "selectionLength": optional int
 ///   "id": optional String
 /// }
 ///
@@ -4294,6 +4295,10 @@
   /// The position that should be selected after the edits have been applied.
   Position? selection;
 
+  /// The length of the selection (starting at Position) that should be
+  /// selected after the edits have been applied.
+  int? selectionLength;
+
   /// The optional identifier of the change kind. The identifier remains stable
   /// even if the message changes, or is parameterized.
   String? id;
@@ -4302,6 +4307,7 @@
       {List<SourceFileEdit>? edits,
       List<LinkedEditGroup>? linkedEditGroups,
       this.selection,
+      this.selectionLength,
       this.id})
       : edits = edits ?? <SourceFileEdit>[],
         linkedEditGroups = linkedEditGroups ?? <LinkedEditGroup>[];
@@ -4342,6 +4348,11 @@
         selection = Position.fromJson(
             jsonDecoder, jsonPath + '.selection', json['selection']);
       }
+      int? selectionLength;
+      if (json.containsKey('selectionLength')) {
+        selectionLength = jsonDecoder.decodeInt(
+            jsonPath + '.selectionLength', json['selectionLength']);
+      }
       String? id;
       if (json.containsKey('id')) {
         id = jsonDecoder.decodeString(jsonPath + '.id', json['id']);
@@ -4350,6 +4361,7 @@
           edits: edits,
           linkedEditGroups: linkedEditGroups,
           selection: selection,
+          selectionLength: selectionLength,
           id: id);
     } else {
       throw jsonDecoder.mismatch(jsonPath, 'SourceChange', json);
@@ -4369,6 +4381,10 @@
     if (selection != null) {
       result['selection'] = selection.toJson();
     }
+    var selectionLength = this.selectionLength;
+    if (selectionLength != null) {
+      result['selectionLength'] = selectionLength;
+    }
     var id = this.id;
     if (id != null) {
       result['id'] = id;
@@ -4411,6 +4427,7 @@
           listEqual(linkedEditGroups, other.linkedEditGroups,
               (LinkedEditGroup a, LinkedEditGroup b) => a == b) &&
           selection == other.selection &&
+          selectionLength == other.selectionLength &&
           id == other.id;
     }
     return false;
@@ -4422,6 +4439,7 @@
         edits,
         linkedEditGroups,
         selection,
+        selectionLength,
         id,
       );
 }
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 e1e3e17..4867f3d 100644
--- a/pkg/analysis_server_client/lib/src/protocol/protocol_constants.dart
+++ b/pkg/analysis_server_client/lib/src/protocol/protocol_constants.dart
@@ -8,7 +8,7 @@
 
 // ignore_for_file: constant_identifier_names
 
-const String PROTOCOL_VERSION = '1.33.0';
+const String PROTOCOL_VERSION = '1.33.1';
 
 const String ANALYSIS_NOTIFICATION_ANALYZED_FILES = 'analysis.analyzedFiles';
 const String ANALYSIS_NOTIFICATION_ANALYZED_FILES_DIRECTORIES = 'directories';
diff --git a/pkg/analysis_server_client/pubspec.yaml b/pkg/analysis_server_client/pubspec.yaml
index c243b32..a5438e9 100644
--- a/pkg/analysis_server_client/pubspec.yaml
+++ b/pkg/analysis_server_client/pubspec.yaml
@@ -13,11 +13,12 @@
   path: ^1.8.0
   pub_semver: ^2.0.0
 
+# We use 'any' version constraints here as we get our package versions from
+# the dart-lang/sdk repo's DEPS file. Note that this is a special case; the
+# best practice for packages is to specify their compatible version ranges.
+# See also https://dart.dev/tools/pub/dependencies.
 dev_dependencies:
-  analyzer:
-    path: ../analyzer
-  analysis_server:
-    path: ../analysis_server
-  analyzer_utilities:
-    path: ../analyzer_utilities
-  test: ^1.14.2
+  analyzer: any
+  analysis_server: any
+  analyzer_utilities: any
+  test: any
diff --git a/pkg/analyzer/CHANGELOG.md b/pkg/analyzer/CHANGELOG.md
index 4cda143..d40a6e6 100644
--- a/pkg/analyzer/CHANGELOG.md
+++ b/pkg/analyzer/CHANGELOG.md
@@ -1,5 +1,7 @@
 ## 4.2.0-dev
 * Update SDK constraints to `>=2.17.0 <3.0.0`.
+* Deprecated `ImportDirective.COMPARATOR`, use appropriate custom logic, if necessary.
+* Deprecated `Element.isAccessibleIn()`, use `isAccessibleIn2()` instead.
 
 ## 4.1.0
 * Deprecated `ParameterElement.isNotOptional`, use `isRequired` instead.
diff --git a/pkg/analyzer/lib/dart/analysis/results.dart b/pkg/analyzer/lib/dart/analysis/results.dart
index 200ebaf..97198d9 100644
--- a/pkg/analyzer/lib/dart/analysis/results.dart
+++ b/pkg/analyzer/lib/dart/analysis/results.dart
@@ -195,22 +195,6 @@
   CompilationUnit get unit;
 }
 
-/// The type of [InvalidResult] returned when the file is a part, and its
-/// containing library is not known.
-///
-/// Clients may not extend, implement or mix-in this class.
-///
-/// TODO(scheglov) Add an error that points at the `part of` location.
-abstract class PartWithoutLibraryResult
-    implements
-        InvalidResult,
-        SomeErrorsResult,
-        SomeResolvedUnitResult,
-        SomeUnitElementResult {
-  /// The absolute and normalized path of the file.
-  String get path;
-}
-
 /// The result of building resolved AST(s) for the whole library.
 ///
 /// Clients may not extend, implement or mix-in this class.
diff --git a/pkg/analyzer/lib/dart/ast/ast.dart b/pkg/analyzer/lib/dart/ast/ast.dart
index 53a072f..a00f66a 100644
--- a/pkg/analyzer/lib/dart/ast/ast.dart
+++ b/pkg/analyzer/lib/dart/ast/ast.dart
@@ -2733,6 +2733,7 @@
 ///
 /// Clients may not extend, implement or mix-in this class.
 abstract class ImportDirective implements NamespaceDirective {
+  @Deprecated('This kind of syntactic equality is rarely useful')
   static Comparator<ImportDirective> COMPARATOR =
       (ImportDirective import1, ImportDirective import2) {
     //
diff --git a/pkg/analyzer/lib/dart/element/element.dart b/pkg/analyzer/lib/dart/element/element.dart
index 6ed4c00..4291006 100644
--- a/pkg/analyzer/lib/dart/element/element.dart
+++ b/pkg/analyzer/lib/dart/element/element.dart
@@ -397,7 +397,7 @@
 /// An element representing a compilation unit.
 ///
 /// Clients may not extend, implement or mix-in this class.
-abstract class CompilationUnitElement implements Element, UriReferencedElement {
+abstract class CompilationUnitElement implements UriReferencedElement {
   /// Return a list containing all of the top-level accessors (getters and
   /// setters) contained in this compilation unit.
   List<PropertyAccessorElement> get accessors;
@@ -726,10 +726,18 @@
   /// A declaration <i>m</i> is accessible to library <i>L</i> if <i>m</i> is
   /// declared in <i>L</i> or if <i>m</i> is public.
   /// </blockquote>
-  ///
-  /// TODO(migration): should not be nullable
+  @Deprecated('Use isAccessibleIn2() instead')
   bool isAccessibleIn(LibraryElement? library);
 
+  /// Return `true` if this element, assuming that it is within scope, is
+  /// accessible to code in the given [library]. This is defined by the Dart
+  /// Language Specification in section 6.2:
+  /// <blockquote>
+  /// A declaration <i>m</i> is accessible to a library <i>L</i> if <i>m</i> is
+  /// declared in <i>L</i> or if <i>m</i> is public.
+  /// </blockquote>
+  bool isAccessibleIn2(LibraryElement library);
+
   /// Return either this element or the most immediate ancestor of this element
   /// for which the [predicate] returns `true`, or `null` if there is no such
   /// element.
@@ -1132,7 +1140,7 @@
 /// An export directive within a library.
 ///
 /// Clients may not extend, implement or mix-in this class.
-abstract class ExportElement implements Element, UriReferencedElement {
+abstract class ExportElement implements UriReferencedElement {
   /// Return a list containing the combinators that were specified as part of
   /// the export directive in the order in which they were specified.
   List<NamespaceCombinator> get combinators;
@@ -1288,7 +1296,7 @@
 /// A single import directive within a library.
 ///
 /// Clients may not extend, implement or mix-in this class.
-abstract class ImportElement implements Element, UriReferencedElement {
+abstract class ImportElement implements UriReferencedElement {
   /// Return a list containing the combinators that were specified as part of
   /// the import directive in the order in which they were specified.
   List<NamespaceCombinator> get combinators;
diff --git a/pkg/analyzer/lib/src/dart/analysis/analysis_context_collection.dart b/pkg/analyzer/lib/src/dart/analysis/analysis_context_collection.dart
index 4b4946f..d6d58b7 100644
--- a/pkg/analyzer/lib/src/dart/analysis/analysis_context_collection.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/analysis_context_collection.dart
@@ -43,12 +43,14 @@
     bool enableIndex = false,
     required List<String> includedPaths,
     List<String>? excludedPaths,
+    List<String>? librarySummaryPaths,
     String? optionsFile,
     String? packagesFile,
     PerformanceLog? performanceLog,
     ResourceProvider? resourceProvider,
     bool retainDataForTesting = false,
     String? sdkPath,
+    String? sdkSummaryPath,
     AnalysisDriverScheduler? scheduler,
     FileContentCache? fileContentCache,
     void Function(AnalysisOptionsImpl)? updateAnalysisOptions,
@@ -78,9 +80,11 @@
         declaredVariables: DeclaredVariables.fromMap(declaredVariables ?? {}),
         drainStreams: drainStreams,
         enableIndex: enableIndex,
+        librarySummaryPaths: librarySummaryPaths,
         performanceLog: performanceLog,
         retainDataForTesting: retainDataForTesting,
         sdkPath: sdkPath,
+        sdkSummaryPath: sdkSummaryPath,
         scheduler: scheduler,
         updateAnalysisOptions: updateAnalysisOptions,
         fileContentCache: fileContentCache,
@@ -118,13 +122,17 @@
     throw StateError('Unable to find the context to $path');
   }
 
-  void dispose() {
+  void dispose({
+    bool forTesting = false,
+  }) {
     for (var analysisContext in contexts) {
       analysisContext.driver.dispose();
     }
     macroExecutor.close();
     // If there are other collections, they will have to start it again.
-    KernelCompilationService.dispose();
+    if (!forTesting) {
+      KernelCompilationService.dispose();
+    }
   }
 
   /// Check every element with [_throwIfNotAbsoluteNormalizedPath].
diff --git a/pkg/analyzer/lib/src/dart/analysis/dependency/library_builder.dart b/pkg/analyzer/lib/src/dart/analysis/dependency/library_builder.dart
deleted file mode 100644
index 2def037..0000000
--- a/pkg/analyzer/lib/src/dart/analysis/dependency/library_builder.dart
+++ /dev/null
@@ -1,792 +0,0 @@
-// Copyright (c) 2018, 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:typed_data';
-
-import 'package:analyzer/dart/ast/ast.dart';
-import 'package:analyzer/dart/ast/token.dart';
-import 'package:analyzer/src/dart/analysis/dependency/node.dart';
-import 'package:analyzer/src/dart/analysis/dependency/reference_collector.dart';
-import 'package:analyzer/src/dart/ast/token.dart';
-import 'package:analyzer/src/summary/api_signature.dart';
-
-/// Build [Library] that describes nodes and dependencies of the library
-/// with the given [uri] and [units].
-///
-/// If the [units] are just parsed, then only token signatures and referenced
-/// names of nodes can be computed. If the [units] are fully resolved, then
-/// also class member references can be recorded.
-Library buildLibrary(Uri uri, List<CompilationUnit> units) {
-  return _LibraryBuilder(uri, units).build();
-}
-
-/// The `show` or `hide` namespace combinator.
-class Combinator {
-  final bool isShow;
-  final List<String> names;
-
-  Combinator(this.isShow, this.names);
-
-  @override
-  String toString() {
-    if (isShow) {
-      return 'show ${names.join(', ')}';
-    } else {
-      return 'hide ${names.join(', ')}';
-    }
-  }
-}
-
-/// The `export` directive.
-class Export {
-  /// The absolute URI of the exported library.
-  final Uri uri;
-
-  /// The list of namespace combinators to apply, not `null`.
-  final List<Combinator> combinators;
-
-  Export(this.uri, this.combinators);
-
-  @override
-  String toString() {
-    return 'Export(uri: $uri, combinators: $combinators)';
-  }
-}
-
-/// The `import` directive.
-class Import {
-  /// The absolute URI of the imported library.
-  final Uri uri;
-
-  /// The import prefix, or `null` if not specified.
-  final String? prefix;
-
-  /// The list of namespace combinators to apply, not `null`.
-  final List<Combinator> combinators;
-
-  Import(this.uri, this.prefix, this.combinators);
-
-  @override
-  String toString() {
-    return 'Import(uri: $uri, prefix: $prefix, combinators: $combinators)';
-  }
-}
-
-/// The collection of imports, exports, and top-level nodes.
-class Library {
-  /// The absolute URI of the library.
-  final Uri uri;
-
-  /// The list of imports in this library.
-  final List<Import> imports;
-
-  /// The list of exports in this library.
-  final List<Export> exports;
-
-  /// The list of libraries that correspond to the [imports].
-  List<Library>? importedLibraries;
-
-  /// The list of top-level nodes defined in the library.
-  ///
-  /// This list is sorted.
-  final List<Node> declaredNodes;
-
-  /// The map of [declaredNodes], used for fast search.
-  /// TODO(scheglov) consider using binary search instead.
-  final Map<LibraryQualifiedName, Node> declaredNodeMap = {};
-
-  /// The list of nodes exported from this library, either using `export`
-  /// directives, or declared in this library.
-  ///
-  /// This list is sorted.
-  List<Node>? exportedNodes;
-
-  /// The map of nodes that are visible in the library, either imported,
-  /// or declared in this library.
-  ///
-  /// TODO(scheglov) support for imports with prefixes
-  Map<String, Node>? libraryScope;
-
-  Library(this.uri, this.imports, this.exports, this.declaredNodes) {
-    for (var node in declaredNodes) {
-      declaredNodeMap[node.name] = node;
-    }
-  }
-
-  @override
-  String toString() => '$uri';
-}
-
-class _LibraryBuilder {
-  /// The URI of the library.
-  final Uri uri;
-
-  /// The units of the library, parsed or fully resolved.
-  final List<CompilationUnit> units;
-
-  /// The instance of the referenced names, class members collector.
-  final ReferenceCollector referenceCollector = ReferenceCollector();
-
-  /// The list of imports in the library.
-  final List<Import> imports = [];
-
-  /// The list of exports in the library.
-  final List<Export> exports = [];
-
-  /// The top-level nodes declared in the library.
-  final List<Node> declaredNodes = [];
-
-  /// The precomputed signature of the [uri].
-  ///
-  /// It is mixed into every API token signature, because for example even
-  /// though types of two functions might be the same, their locations
-  /// are different.
-  late Uint8List uriSignature;
-
-  /// The precomputed signature of the enclosing class name, or `null` if
-  /// outside a class.
-  ///
-  /// It is mixed into every API token signature of every class member, because
-  /// for example even though types of two methods might be the same, their
-  /// locations are different.
-  Uint8List? enclosingClassNameSignature;
-
-  _LibraryBuilder(this.uri, this.units);
-
-  Library build() {
-    uriSignature = (ApiSignature()..addString(uri.toString())).toByteList();
-
-    _addImports();
-    _addExports();
-
-    for (var unit in units) {
-      _addUnit(unit);
-    }
-    declaredNodes.sort(Node.compare);
-
-    return Library(uri, imports, exports, declaredNodes);
-  }
-
-  void _addClassOrMixin(ClassOrMixinDeclaration node) {
-    var enclosingClassName = node.name.name;
-
-    NamedType? enclosingSuperClass;
-    if (node is ClassDeclaration) {
-      enclosingSuperClass = node.extendsClause?.superclass;
-    }
-
-    enclosingClassNameSignature =
-        (ApiSignature()..addString(enclosingClassName)).toByteList();
-
-    var apiTokenSignature = _computeTokenSignature(
-      node.beginToken,
-      node.leftBracket,
-    );
-
-    var typeParameters = node.typeParameters;
-
-    Dependencies api;
-    if (node is ClassDeclaration) {
-      api = referenceCollector.collect(
-        apiTokenSignature,
-        thisNodeName: enclosingClassName,
-        typeParameters: typeParameters,
-        extendsClause: node.extendsClause,
-        withClause: node.withClause,
-        implementsClause: node.implementsClause,
-      );
-    } else if (node is MixinDeclaration) {
-      api = referenceCollector.collect(
-        apiTokenSignature,
-        thisNodeName: enclosingClassName,
-        typeParameters: typeParameters,
-        onClause: node.onClause,
-        implementsClause: node.implementsClause,
-      );
-    } else {
-      throw UnimplementedError('(${node.runtimeType}) $node');
-    }
-
-    var enclosingClass = Node(
-      LibraryQualifiedName(uri, enclosingClassName),
-      node is MixinDeclaration ? NodeKind.MIXIN : NodeKind.CLASS,
-      api,
-      Dependencies.none,
-    );
-
-    var hasConstConstructor = node.members.any(
-      (m) => m is ConstructorDeclaration && m.constKeyword != null,
-    );
-
-    // TODO(scheglov) do we need type parameters at all?
-    List<Node> classTypeParameters;
-    if (typeParameters != null) {
-      classTypeParameters = <Node>[];
-      for (var typeParameter in typeParameters.typeParameters) {
-        var api = referenceCollector.collect(
-          _computeNodeTokenSignature(typeParameter),
-          enclosingClassName: enclosingClassName,
-          thisNodeName: typeParameter.name.name,
-          type: typeParameter.bound,
-        );
-        classTypeParameters.add(Node(
-          LibraryQualifiedName(uri, typeParameter.name.name),
-          NodeKind.TYPE_PARAMETER,
-          api,
-          Dependencies.none,
-          enclosingClass: enclosingClass,
-        ));
-      }
-      classTypeParameters.sort(Node.compare);
-      enclosingClass.setTypeParameters(classTypeParameters);
-    }
-
-    var classMembers = <Node>[];
-    var hasConstructor = false;
-    for (var member in node.members) {
-      if (member is ConstructorDeclaration) {
-        hasConstructor = true;
-        _addConstructor(
-          enclosingClass,
-          enclosingSuperClass,
-          classMembers,
-          member,
-        );
-      } else if (member is FieldDeclaration) {
-        _addVariables(
-          enclosingClass,
-          classMembers,
-          member.metadata,
-          member.fields,
-          hasConstConstructor,
-        );
-      } else if (member is MethodDeclaration) {
-        _addMethod(enclosingClass, classMembers, member);
-      } else {
-        throw UnimplementedError('(${member.runtimeType}) $member');
-      }
-    }
-
-    if (node is ClassDeclaration && !hasConstructor) {
-      classMembers.add(Node(
-        LibraryQualifiedName(uri, ''),
-        NodeKind.CONSTRUCTOR,
-        Dependencies.none,
-        Dependencies.none,
-        enclosingClass: enclosingClass,
-      ));
-    }
-
-    classMembers.sort(Node.compare);
-    enclosingClass.setClassMembers(classMembers);
-
-    declaredNodes.add(enclosingClass);
-    enclosingClassNameSignature = null;
-  }
-
-  void _addClassTypeAlias(ClassTypeAlias node) {
-    var apiTokenSignature = _computeNodeTokenSignature(node);
-    var api = referenceCollector.collect(
-      apiTokenSignature,
-      typeParameters: node.typeParameters,
-      superClass: node.superclass,
-      withClause: node.withClause,
-      implementsClause: node.implementsClause,
-    );
-
-    declaredNodes.add(Node(
-      LibraryQualifiedName(uri, node.name.name),
-      NodeKind.CLASS_TYPE_ALIAS,
-      api,
-      Dependencies.none,
-    ));
-  }
-
-  void _addConstructor(
-    Node enclosingClass,
-    NamedType? enclosingSuperClass,
-    List<Node> classMembers,
-    ConstructorDeclaration node,
-  ) {
-    var builder = _newApiSignatureBuilder();
-    _appendMetadataTokens(builder, node.metadata);
-    _appendFormalParametersTokens(builder, node.parameters);
-    var apiTokenSignature = builder.toByteList();
-
-    var api = referenceCollector.collect(
-      apiTokenSignature,
-      enclosingClassName: enclosingClass.name.name,
-      formalParameters: node.parameters,
-    );
-
-    var implTokenSignature = _computeNodeTokenSignature(node.body);
-    var impl = referenceCollector.collect(
-      implTokenSignature,
-      enclosingClassName: enclosingClass.name.name,
-      enclosingSuperClass: enclosingSuperClass,
-      formalParametersForImpl: node.parameters,
-      constructorInitializers: node.initializers,
-      redirectedConstructor: node.redirectedConstructor,
-      functionBody: node.body,
-    );
-
-    classMembers.add(Node(
-      LibraryQualifiedName(uri, node.name?.name ?? ''),
-      NodeKind.CONSTRUCTOR,
-      api,
-      impl,
-      enclosingClass: enclosingClass,
-    ));
-  }
-
-  void _addEnum(EnumDeclaration node) {
-    var enumTokenSignature = _newApiSignatureBuilder().toByteList();
-
-    var enumNode = Node(
-      LibraryQualifiedName(uri, node.name.name),
-      NodeKind.ENUM,
-      Dependencies(enumTokenSignature, [], [], [], [], []),
-      Dependencies.none,
-    );
-
-    Dependencies fieldDependencies;
-    {
-      var builder = _newApiSignatureBuilder();
-      builder.addString(node.name.name);
-      _appendTokens(builder, node.leftBracket, node.rightBracket);
-      var tokenSignature = builder.toByteList();
-      fieldDependencies = Dependencies(tokenSignature, [], [], [], [], []);
-    }
-
-    var members = <Node>[];
-    for (var constant in node.constants) {
-      members.add(Node(
-        LibraryQualifiedName(uri, constant.name.name),
-        NodeKind.GETTER,
-        fieldDependencies,
-        Dependencies.none,
-        enclosingClass: enumNode,
-      ));
-    }
-
-    members.add(Node(
-      LibraryQualifiedName(uri, 'index'),
-      NodeKind.GETTER,
-      fieldDependencies,
-      Dependencies.none,
-      enclosingClass: enumNode,
-    ));
-
-    members.add(Node(
-      LibraryQualifiedName(uri, 'values'),
-      NodeKind.GETTER,
-      fieldDependencies,
-      Dependencies.none,
-      enclosingClass: enumNode,
-    ));
-
-    members.sort(Node.compare);
-    enumNode.setClassMembers(members);
-
-    declaredNodes.add(enumNode);
-  }
-
-  /// Fill [exports] with information about exports.
-  void _addExports() {
-    for (var directive in units.first.directives) {
-      if (directive is ExportDirective) {
-        var refUri = directive.uri.stringValue;
-        if (refUri != null) {
-          var importUri = uri.resolve(refUri);
-          var combinators = _getCombinators(directive);
-          exports.add(Export(importUri, combinators));
-        }
-      }
-    }
-  }
-
-  void _addFunction(FunctionDeclaration node) {
-    var functionExpression = node.functionExpression;
-
-    var builder = _newApiSignatureBuilder();
-    _appendMetadataTokens(builder, node.metadata);
-    _appendNodeTokens(builder, node.returnType);
-    _appendNodeTokens(builder, functionExpression.typeParameters);
-    _appendFormalParametersTokens(builder, functionExpression.parameters);
-    var apiTokenSignature = builder.toByteList();
-
-    var rawName = node.name.name;
-    var name = LibraryQualifiedName(uri, node.isSetter ? '$rawName=' : rawName);
-
-    NodeKind kind;
-    if (node.isGetter) {
-      kind = NodeKind.GETTER;
-    } else if (node.isSetter) {
-      kind = NodeKind.SETTER;
-    } else {
-      kind = NodeKind.FUNCTION;
-    }
-
-    var api = referenceCollector.collect(
-      apiTokenSignature,
-      thisNodeName: node.name.name,
-      typeParameters: functionExpression.typeParameters,
-      formalParameters: functionExpression.parameters,
-      returnType: node.returnType,
-    );
-
-    var body = functionExpression.body;
-    var implTokenSignature = _computeNodeTokenSignature(body);
-    var impl = referenceCollector.collect(
-      implTokenSignature,
-      thisNodeName: node.name.name,
-      formalParametersForImpl: functionExpression.parameters,
-      functionBody: body,
-    );
-
-    declaredNodes.add(Node(name, kind, api, impl));
-  }
-
-  void _addFunctionTypeAlias(FunctionTypeAlias node) {
-    var builder = _newApiSignatureBuilder();
-    _appendMetadataTokens(builder, node.metadata);
-    _appendNodeTokens(builder, node.typeParameters);
-    _appendNodeTokens(builder, node.returnType);
-    _appendFormalParametersTokens(builder, node.parameters);
-    var apiTokenSignature = builder.toByteList();
-
-    var api = referenceCollector.collect(
-      apiTokenSignature,
-      thisNodeName: node.name.name,
-      typeParameters: node.typeParameters,
-      formalParameters: node.parameters,
-      returnType: node.returnType,
-    );
-
-    declaredNodes.add(Node(
-      LibraryQualifiedName(uri, node.name.name),
-      NodeKind.FUNCTION_TYPE_ALIAS,
-      api,
-      Dependencies.none,
-    ));
-  }
-
-  void _addGenericTypeAlias(GenericTypeAlias node) {
-    // TODO(scheglov) Support all types.
-    var functionType = node.functionType;
-
-    var builder = _newApiSignatureBuilder();
-    _appendMetadataTokens(builder, node.metadata);
-    _appendNodeTokens(builder, node.typeParameters);
-    _appendNodeTokens(builder, functionType?.returnType);
-    _appendNodeTokens(builder, functionType?.typeParameters);
-    _appendFormalParametersTokens(builder, functionType?.parameters);
-    var apiTokenSignature = builder.toByteList();
-
-    var api = referenceCollector.collect(
-      apiTokenSignature,
-      typeParameters: node.typeParameters,
-      typeParameters2: functionType?.typeParameters,
-      formalParameters: functionType?.parameters,
-      returnType: functionType?.returnType,
-    );
-
-    declaredNodes.add(Node(
-      LibraryQualifiedName(uri, node.name.name),
-      NodeKind.GENERIC_TYPE_ALIAS,
-      api,
-      Dependencies.none,
-    ));
-  }
-
-  /// Fill [imports] with information about imports.
-  void _addImports() {
-    var hasDartCoreImport = false;
-    for (var directive in units.first.directives) {
-      if (directive is ImportDirective) {
-        var refUri = directive.uri.stringValue;
-        if (refUri == null) {
-          continue;
-        }
-
-        var importUri = uri.resolve(refUri);
-
-        if (importUri.toString() == 'dart:core') {
-          hasDartCoreImport = true;
-        }
-
-        var combinators = _getCombinators(directive);
-
-        var prefix = directive.prefix;
-        imports.add(Import(importUri, prefix?.name, combinators));
-
-        if (prefix != null) {
-          referenceCollector.addImportPrefix(prefix.name);
-        }
-      }
-    }
-
-    if (!hasDartCoreImport) {
-      imports.add(Import(Uri.parse('dart:core'), null, []));
-    }
-  }
-
-  void _addMethod(
-    Node enclosingClass,
-    List<Node> classMembers,
-    MethodDeclaration node,
-  ) {
-    var builder = _newApiSignatureBuilder();
-    _appendMetadataTokens(builder, node.metadata);
-    _appendNodeTokens(builder, node.returnType);
-    _appendNodeTokens(builder, node.typeParameters);
-    _appendFormalParametersTokens(builder, node.parameters);
-    var apiTokenSignature = builder.toByteList();
-
-    NodeKind kind;
-    if (node.isGetter) {
-      kind = NodeKind.GETTER;
-    } else if (node.isSetter) {
-      kind = NodeKind.SETTER;
-    } else {
-      kind = NodeKind.METHOD;
-    }
-
-    // TODO(scheglov) metadata, here and everywhere
-    var api = referenceCollector.collect(
-      apiTokenSignature,
-      enclosingClassName: enclosingClass.name.name,
-      thisNodeName: node.name.name,
-      typeParameters: node.typeParameters,
-      formalParameters: node.parameters,
-      returnType: node.returnType,
-    );
-
-    var implTokenSignature = _computeNodeTokenSignature(node.body);
-    var impl = referenceCollector.collect(
-      implTokenSignature,
-      enclosingClassName: enclosingClass.name.name,
-      thisNodeName: node.name.name,
-      formalParametersForImpl: node.parameters,
-      functionBody: node.body,
-    );
-
-    var name = LibraryQualifiedName(uri, node.name.name);
-    classMembers.add(
-      Node(name, kind, api, impl, enclosingClass: enclosingClass),
-    );
-  }
-
-  void _addUnit(CompilationUnit unit) {
-    for (var declaration in unit.declarations) {
-      if (declaration is ClassOrMixinDeclaration) {
-        _addClassOrMixin(declaration);
-      } else if (declaration is ClassTypeAlias) {
-        _addClassTypeAlias(declaration);
-      } else if (declaration is EnumDeclaration) {
-        _addEnum(declaration);
-      } else if (declaration is FunctionDeclaration) {
-        _addFunction(declaration);
-      } else if (declaration is FunctionTypeAlias) {
-        _addFunctionTypeAlias(declaration);
-      } else if (declaration is GenericTypeAlias) {
-        _addGenericTypeAlias(declaration);
-      } else if (declaration is TopLevelVariableDeclaration) {
-        _addVariables(
-          null,
-          declaredNodes,
-          declaration.metadata,
-          declaration.variables,
-          false,
-        );
-      } else {
-        throw UnimplementedError('(${declaration.runtimeType}) $declaration');
-      }
-    }
-  }
-
-  void _addVariables(
-    Node? enclosingClass,
-    List<Node> variableNodes,
-    List<Annotation> metadata,
-    VariableDeclarationList variables,
-    bool appendInitializerToApi,
-  ) {
-    if (variables.isConst || variables.type == null) {
-      appendInitializerToApi = true;
-    }
-
-    for (var variable in variables.variables) {
-      var initializer = variable.initializer;
-
-      var builder = _newApiSignatureBuilder();
-      builder.addInt(variables.isConst ? 1 : 0); // const flag
-      _appendMetadataTokens(builder, metadata);
-      _appendNodeTokens(builder, variables.type);
-      if (appendInitializerToApi) {
-        _appendNodeTokens(builder, initializer);
-      }
-
-      var apiTokenSignature = builder.toByteList();
-      var api = referenceCollector.collect(
-        apiTokenSignature,
-        enclosingClassName: enclosingClass?.name.name,
-        thisNodeName: variable.name.name,
-        type: variables.type,
-        expression: appendInitializerToApi ? initializer : null,
-      );
-
-      var implTokenSignature = _computeNodeTokenSignature(initializer);
-      var impl = referenceCollector.collect(
-        implTokenSignature,
-        enclosingClassName: enclosingClass?.name.name,
-        thisNodeName: variable.name.name,
-        expression: initializer,
-      );
-
-      var rawName = variable.name.name;
-      variableNodes.add(Node(
-        LibraryQualifiedName(uri, rawName),
-        NodeKind.GETTER,
-        api,
-        impl,
-        enclosingClass: enclosingClass,
-      ));
-
-      if (!variables.isConst && !variables.isFinal) {
-        // Note that one set of dependencies is enough for body.
-        // So, the setter has empty "impl" dependencies.
-        variableNodes.add(
-          Node(
-            LibraryQualifiedName(uri, '$rawName='),
-            NodeKind.SETTER,
-            api,
-            Dependencies.none,
-            enclosingClass: enclosingClass,
-          ),
-        );
-      }
-    }
-  }
-
-  /// Return the signature for all tokens of the [node].
-  Uint8List _computeNodeTokenSignature(AstNode? node) {
-    if (node == null) {
-      return Uint8List(0);
-    }
-    return _computeTokenSignature(node.beginToken, node.endToken);
-  }
-
-  /// Return the signature for tokens from [begin] to [end] (both including).
-  Uint8List _computeTokenSignature(Token begin, Token end) {
-    var signature = _newApiSignatureBuilder();
-    _appendTokens(signature, begin, end);
-    return signature.toByteList();
-  }
-
-  /// Return a new signature builder, primed with the current context salts.
-  ApiSignature _newApiSignatureBuilder() {
-    var builder = ApiSignature();
-    builder.addBytes(uriSignature);
-
-    final enclosingClassNameSignature = this.enclosingClassNameSignature;
-    if (enclosingClassNameSignature != null) {
-      builder.addBytes(enclosingClassNameSignature);
-    }
-
-    return builder;
-  }
-
-  /// Append tokens of the given [parameters] to the [signature].
-  static void _appendFormalParametersTokens(
-      ApiSignature signature, FormalParameterList? parameters) {
-    if (parameters == null) return;
-
-    for (var parameter in parameters.parameters) {
-      if (parameter.isRequiredPositional) {
-        signature.addInt(1);
-      } else if (parameter.isRequiredNamed) {
-        signature.addInt(4);
-      } else if (parameter.isOptionalPositional) {
-        signature.addInt(2);
-      } else if (parameter.isOptionalNamed) {
-        signature.addInt(3);
-      }
-
-      // If a simple not named parameter, we don't need its name.
-      // We should be careful to include also annotations.
-      if (parameter is SimpleFormalParameter) {
-        var type = parameter.type;
-        if (type != null) {
-          _appendTokens(signature, parameter.beginToken, type.endToken);
-          continue;
-        }
-      }
-
-      // We don't know anything better than adding the whole parameter.
-      _appendNodeTokens(signature, parameter);
-    }
-  }
-
-  static void _appendMetadataTokens(
-      ApiSignature signature, List<Annotation> metadata) {
-    for (var annotation in metadata) {
-      _appendNodeTokens(signature, annotation);
-    }
-  }
-
-  /// Append tokens of the given [node] to the [signature].
-  static void _appendNodeTokens(ApiSignature signature, AstNode? node) {
-    if (node != null) {
-      _appendTokens(signature, node.beginToken, node.endToken);
-    }
-  }
-
-  /// Append tokens from [begin] to [end] (both including) to the [signature].
-  static void _appendTokens(ApiSignature signature, Token begin, Token end) {
-    if (begin is CommentToken) {
-      begin = begin.parent!;
-    }
-
-    Token? token = begin;
-    while (token != null) {
-      signature.addString(token.lexeme);
-
-      if (token == end) {
-        break;
-      }
-
-      var nextToken = token.next;
-      if (nextToken == token) {
-        break;
-      }
-
-      token = nextToken;
-    }
-  }
-
-  /// Return [Combinator]s for the given import or export [directive].
-  static List<Combinator> _getCombinators(NamespaceDirective directive) {
-    var combinators = <Combinator>[];
-    for (var combinator in directive.combinators) {
-      if (combinator is ShowCombinator) {
-        combinators.add(
-          Combinator(
-            true,
-            combinator.shownNames.map((id) => id.name).toList(),
-          ),
-        );
-      }
-      if (combinator is HideCombinator) {
-        combinators.add(
-          Combinator(
-            false,
-            combinator.hiddenNames.map((id) => id.name).toList(),
-          ),
-        );
-      }
-    }
-    return combinators;
-  }
-}
diff --git a/pkg/analyzer/lib/src/dart/analysis/dependency/node.dart b/pkg/analyzer/lib/src/dart/analysis/dependency/node.dart
deleted file mode 100644
index 1243762..0000000
--- a/pkg/analyzer/lib/src/dart/analysis/dependency/node.dart
+++ /dev/null
@@ -1,245 +0,0 @@
-// Copyright (c) 2018, 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:typed_data';
-
-import 'package:convert/convert.dart';
-
-/// The reference to a class member.
-class ClassMemberReference {
-  /// The target class name.
-  ///
-  /// This is different from the class that actually turned out to define
-  /// the referenced member at the time of recording this reference. So, we
-  /// will notice added overrides in the target class, or anywhere in between.
-  final LibraryQualifiedName target;
-
-  /// The name referenced in the [target].
-  final String name;
-
-  @override
-  final int hashCode;
-
-  ClassMemberReference(this.target, this.name)
-      : hashCode = Object.hash(target, name);
-
-  @override
-  bool operator ==(Object other) {
-    return other is ClassMemberReference &&
-        other.target == target &&
-        other.name == name;
-  }
-
-  @override
-  String toString() {
-    return '($target, $name)';
-  }
-
-  static int compare(ClassMemberReference first, ClassMemberReference second) {
-    var result = LibraryQualifiedName.compare(first.target, second.target);
-    if (result != 0) return result;
-
-    return first.name.compareTo(second.name);
-  }
-}
-
-/// The dependencies of the API or implementation portion of a node.
-class Dependencies {
-  static final none = Dependencies(Uint8List(0), [], [], [], [], []);
-
-  /// The token signature of this portion of the node. It depends on all
-  /// tokens that might affect the node API or implementation resolution.
-  final Uint8List tokenSignature;
-
-  /// The names that appear unprefixed in this portion of the node, and are
-  /// not defined locally in the node. Locally defined names themselves
-  /// depend on some non-local nodes, which will also recorded here.
-  ///
-  /// This list is sorted.
-  final List<String> unprefixedReferencedNames;
-
-  /// The names of import prefixes used to reference names in this node.
-  ///
-  /// This list is sorted.
-  final List<String> importPrefixes;
-
-  /// The names referenced by this node with the import prefix at the
-  /// corresponding index in [importPrefixes].
-  ///
-  /// This list is sorted.
-  final List<List<String>> importPrefixedReferencedNames;
-
-  /// The names that appear prefixed with `super` in this portion of the node.
-  ///
-  /// This list is sorted.
-  final List<String> superReferencedNames;
-
-  /// The class members referenced in this portion of the node.
-  ///
-  /// This list is sorted.
-  final List<ClassMemberReference> classMemberReferences;
-
-  /// All referenced nodes, computed from [unprefixedReferencedNames],
-  /// [importPrefixedReferencedNames], and [classMemberReferences].
-  List<Node>? referencedNodes;
-
-  /// The transitive signature of this portion of the node, computed using
-  /// the [tokenSignature] of this node, and API signatures of the
-  /// [referencedNodes].
-  Uint8List? transitiveSignature;
-
-  Dependencies(
-      this.tokenSignature,
-      this.unprefixedReferencedNames,
-      this.importPrefixes,
-      this.importPrefixedReferencedNames,
-      this.superReferencedNames,
-      this.classMemberReferences);
-
-  String get tokenSignatureHex => hex.encode(tokenSignature);
-}
-
-/// A name qualified by a library URI.
-class LibraryQualifiedName {
-  /// The URI of the defining library.
-  /// Not `null`.
-  final Uri libraryUri;
-
-  /// The name of this name object.
-  /// If the name starts with `_`, then the name is private.
-  /// Names of setters end with `=`.
-  final String name;
-
-  /// Whether this name is private, and its [name] starts with `_`.
-  final bool isPrivate;
-
-  /// The cached, pre-computed hash code.
-  @override
-  final int hashCode;
-
-  factory LibraryQualifiedName(Uri libraryUri, String name) {
-    var isPrivate = name.startsWith('_');
-    var hashCode = Object.hash(libraryUri, name);
-    return LibraryQualifiedName._internal(
-        libraryUri, name, isPrivate, hashCode);
-  }
-
-  LibraryQualifiedName._internal(
-      this.libraryUri, this.name, this.isPrivate, this.hashCode);
-
-  @override
-  bool operator ==(Object other) {
-    return other is LibraryQualifiedName &&
-        other.hashCode == hashCode &&
-        name == other.name &&
-        libraryUri == other.libraryUri;
-  }
-
-  /// Whether this name us accessible for the library with the given
-  /// [libraryUri], i.e. when the name is public, or is defined in a library
-  /// with the same URI.
-  bool isAccessibleFor(Uri libraryUri) {
-    return !isPrivate || this.libraryUri == libraryUri;
-  }
-
-  @override
-  String toString() => '$libraryUri::$name';
-
-  /// Compare given names by their raw names.
-  ///
-  /// This method should be used only for sorting, it does not follow the
-  /// complete semantics of [==] and [hashCode].
-  static int compare(LibraryQualifiedName first, LibraryQualifiedName second) {
-    return first.name.compareTo(second.name);
-  }
-}
-
-/// A dependency node - anything that has a name, and can be referenced.
-class Node {
-  /// The API or implementation signature used in [Dependencies]
-  /// as a marker that this node is changed, explicitly because its token
-  /// signature changed, or implicitly - because it references a changed node.
-  static final changedSignature = Uint8List.fromList([0xDE, 0xAD, 0xBE, 0xEF]);
-
-  final LibraryQualifiedName name;
-  final NodeKind kind;
-
-  /// Dependencies that affect the API of the node, so affect API or
-  /// implementation dependencies of the nodes that use this node.
-  final Dependencies api;
-
-  /// Additional (to the [api]) dependencies that affect only the
-  /// "implementation" of the node, e.g. the body of a method, but are not
-  /// visible outside of the node, and so don't affect any other nodes.
-  final Dependencies impl;
-
-  /// If the node is a class member, the node of the enclosing class.
-  /// Otherwise `null`.
-  final Node? enclosingClass;
-
-  /// If the node is a class, the nodes of its type parameters.
-  /// Otherwise `null`.
-  List<Node>? classTypeParameters;
-
-  /// If the node is a class, the sorted list of members in this class.
-  /// Otherwise `null`.
-  List<Node>? classMembers;
-
-  Node(this.name, this.kind, this.api, this.impl,
-      {this.enclosingClass, this.classTypeParameters});
-
-  /// Return the node that can be referenced by the given [name] from the
-  /// library with the given [libraryUri].
-  Node? getClassMember(Uri libraryUri, String name) {
-    // TODO(scheglov) The list is sorted, use this fact to search faster.
-    // TODO(scheglov) Collect superclass members here or outside.
-    for (var i = 0; i < classMembers!.length; ++i) {
-      var member = classMembers![i];
-      var memberName = member.name;
-      if (memberName.name == name && memberName.isAccessibleFor(libraryUri)) {
-        return member;
-      }
-    }
-    return null;
-  }
-
-  /// Set new class members for this class.
-  void setClassMembers(List<Node> newClassMembers) {
-    classMembers = newClassMembers;
-  }
-
-  /// Set new class type parameters for this class.
-  void setTypeParameters(List<Node> newTypeParameters) {
-    classTypeParameters = newTypeParameters;
-  }
-
-  @override
-  String toString() {
-    if (enclosingClass != null) {
-      return '$enclosingClass::${name.name}';
-    }
-    return name.toString();
-  }
-
-  /// Compare given nodes by their names.
-  static int compare(Node first, Node second) {
-    return LibraryQualifiedName.compare(first.name, second.name);
-  }
-}
-
-/// Kinds of nodes.
-enum NodeKind {
-  CLASS,
-  CLASS_TYPE_ALIAS,
-  CONSTRUCTOR,
-  ENUM,
-  FUNCTION,
-  FUNCTION_TYPE_ALIAS,
-  GENERIC_TYPE_ALIAS,
-  GETTER,
-  METHOD,
-  MIXIN,
-  SETTER,
-  TYPE_PARAMETER,
-}
diff --git a/pkg/analyzer/lib/src/dart/analysis/dependency/reference_collector.dart b/pkg/analyzer/lib/src/dart/analysis/dependency/reference_collector.dart
deleted file mode 100644
index 706248e..0000000
--- a/pkg/analyzer/lib/src/dart/analysis/dependency/reference_collector.dart
+++ /dev/null
@@ -1,957 +0,0 @@
-// Copyright (c) 2018, 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:typed_data';
-
-import 'package:analyzer/dart/ast/ast.dart';
-import 'package:analyzer/dart/ast/token.dart';
-import 'package:analyzer/dart/element/element.dart';
-import 'package:analyzer/dart/element/type.dart';
-import 'package:analyzer/src/dart/analysis/dependency/node.dart';
-
-/// Collector of information about external nodes referenced by a node.
-///
-/// The workflow for using it is that the library builder creates a new
-/// instance, fills it with names of import prefixes using [addImportPrefix].
-/// Then for each node defined in the library, [collect] is called with
-/// corresponding AST nodes to record references to external names, and
-/// construct the API or implementation [Dependencies].
-class ReferenceCollector {
-  /// Local scope inside the node, containing local names such as parameters,
-  /// local variables, local functions, local type parameters, etc.
-  final _LocalScopes _localScopes = _LocalScopes();
-
-  /// The list of names that are referenced without any prefix, neither an
-  /// import prefix, nor a target expression.
-  _NameSet _unprefixedReferences = _NameSet();
-
-  /// The list of names that are referenced using an import prefix.
-  ///
-  /// It is filled by [addImportPrefix] and shared across all nodes.
-  final List<_ReferencedImportPrefixedNames> _importPrefixedReferences = [];
-
-  /// The list of names that are referenced with `super`.
-  _NameSet _superReferences = _NameSet();
-
-  /// The set of referenced class members.
-  _ClassMemberReferenceSet _memberReferences = _ClassMemberReferenceSet();
-
-  /// Record that the [name] is a name of an import prefix.
-  ///
-  /// So, when we see code like `prefix.foo` we know that `foo` should be
-  /// resolved in the import scope that corresponds to `prefix` (unless the
-  /// name `prefix` is shadowed by a local declaration).
-  void addImportPrefix(String name) {
-    assert(_localScopes.isEmpty);
-    for (var import in _importPrefixedReferences) {
-      if (import.prefix == name) {
-        return;
-      }
-    }
-    _importPrefixedReferences.add(_ReferencedImportPrefixedNames(name));
-  }
-
-  /// Construct and return a new [Dependencies] with the given [tokenSignature]
-  /// and all recorded references to external nodes in the given AST nodes.
-  Dependencies collect(Uint8List tokenSignature,
-      {String? enclosingClassName,
-      String? thisNodeName,
-      List<ConstructorInitializer>? constructorInitializers,
-      NamedType? enclosingSuperClass,
-      Expression? expression,
-      ExtendsClause? extendsClause,
-      FormalParameterList? formalParameters,
-      FormalParameterList? formalParametersForImpl,
-      FunctionBody? functionBody,
-      ImplementsClause? implementsClause,
-      OnClause? onClause,
-      ConstructorName? redirectedConstructor,
-      TypeAnnotation? returnType,
-      NamedType? superClass,
-      TypeAnnotation? type,
-      TypeParameterList? typeParameters,
-      TypeParameterList? typeParameters2,
-      WithClause? withClause}) {
-    _localScopes.enter();
-
-    // The name of the node shadows any external names.
-    if (enclosingClassName != null) {
-      _localScopes.add(enclosingClassName);
-    }
-    if (thisNodeName != null) {
-      _localScopes.add(thisNodeName);
-    }
-
-    // Add type parameters first, they might be referenced later.
-    _visitTypeParameterList(typeParameters);
-    _visitTypeParameterList(typeParameters2);
-
-    // Parts of classes.
-    _visitTypeAnnotation(extendsClause?.superclass);
-    _visitTypeAnnotation(superClass);
-    _visitTypeAnnotations(withClause?.mixinTypes);
-    _visitTypeAnnotations(onClause?.superclassConstraints);
-    _visitTypeAnnotations(implementsClause?.interfaces);
-
-    // Parts of executables.
-    _visitFormalParameterList(formalParameters);
-    _visitFormalParameterListImpl(formalParametersForImpl);
-    _visitTypeAnnotation(returnType);
-    _visitFunctionBody(functionBody);
-
-    // Parts of constructors.
-    _visitConstructorInitializers(enclosingSuperClass, constructorInitializers);
-    _visitConstructorName(redirectedConstructor);
-
-    // Parts of variables.
-    _visitTypeAnnotation(type);
-    _visitExpression(expression);
-
-    _localScopes.exit();
-
-    var unprefixedReferencedNames = _unprefixedReferences.toList();
-    _unprefixedReferences = _NameSet();
-
-    var importPrefixes = <String>[];
-    var importPrefixedReferencedNames = <List<String>>[];
-    for (var i = 0; i < _importPrefixedReferences.length; i++) {
-      var import = _importPrefixedReferences[i];
-
-      if (import.names.isNotEmpty) {
-        importPrefixes.add(import.prefix);
-        importPrefixedReferencedNames.add(import.names.toList());
-      }
-
-      import.clear();
-    }
-
-    var superReferencedNames = _superReferences.toList();
-    _superReferences = _NameSet();
-
-    var classMemberReferences = _memberReferences.toList();
-    _memberReferences = _ClassMemberReferenceSet();
-
-    return Dependencies(
-      tokenSignature,
-      unprefixedReferencedNames,
-      importPrefixes,
-      importPrefixedReferencedNames,
-      superReferencedNames,
-      classMemberReferences,
-    );
-  }
-
-  /// Return the collector for the import prefix with the given [name].
-  _ReferencedImportPrefixedNames _importPrefix(String name) {
-    assert(!_localScopes.contains(name));
-    for (var i = 0; i < _importPrefixedReferences.length; i++) {
-      var references = _importPrefixedReferences[i];
-      if (references.prefix == name) {
-        return references;
-      }
-    }
-    throw StateError('Expected prefix: $name');
-  }
-
-  void _recordClassMemberReference(
-      {Expression? target, DartType? targetType, required String name}) {
-    if (target is Identifier) {
-      var element = target.staticElement;
-      if (element is ClassElement) {
-        _memberReferences.add(element, name);
-        return;
-      }
-    }
-    targetType ??= target!.staticType;
-
-    if (targetType is InterfaceType) {
-      _memberReferences.add(targetType.element, name);
-    }
-  }
-
-  /// Record a new unprefixed name reference.
-  void _recordUnprefixedReference(String name) {
-    assert(!_localScopes.contains(name));
-    _unprefixedReferences.add(name);
-  }
-
-  void _visitAdjacentStrings(AdjacentStrings node) {
-    var strings = node.strings;
-    for (var i = 0; i < strings.length; i++) {
-      var string = strings[i];
-      _visitExpression(string);
-    }
-  }
-
-  void _visitArgumentList(ArgumentList? node) {
-    if (node == null) return;
-
-    var arguments = node.arguments;
-    for (var i = 0; i < arguments.length; i++) {
-      var argument = arguments[i];
-      _visitExpression(argument);
-    }
-  }
-
-  void _visitAssignmentExpression(AssignmentExpression node) {
-    var assignmentType = node.operator.type;
-
-    _visitExpression(node.leftHandSide,
-        get: assignmentType != TokenType.EQ, set: true);
-    _visitExpression(node.rightHandSide);
-
-    if (assignmentType != TokenType.EQ &&
-        assignmentType != TokenType.QUESTION_QUESTION_EQ) {
-      var operatorType = assignmentType.binaryOperatorOfCompoundAssignment;
-      if (operatorType != null) {
-        _recordClassMemberReference(
-          targetType: node.readType,
-          name: operatorType.lexeme,
-        );
-      }
-    }
-  }
-
-  void _visitBinaryExpression(BinaryExpression node) {
-    var operatorName = node.operator.lexeme;
-    var leftOperand = node.leftOperand;
-    if (leftOperand is SuperExpression) {
-      _superReferences.add(operatorName);
-    } else {
-      _visitExpression(leftOperand);
-      _recordClassMemberReference(
-        targetType: leftOperand.staticType,
-        name: operatorName,
-      );
-    }
-    _visitExpression(node.rightOperand);
-  }
-
-  void _visitBlock(Block? node) {
-    if (node == null) return;
-
-    _visitStatements(node.statements);
-  }
-
-  void _visitCascadeExpression(CascadeExpression node) {
-    _visitExpression(node.target);
-    var sections = node.cascadeSections;
-    for (var i = 0; i < sections.length; i++) {
-      var section = sections[i];
-      _visitExpression(section);
-    }
-  }
-
-  void _visitCollectionElement(CollectionElement? node) {
-    if (node == null) {
-      return;
-    } else if (node is Expression) {
-      _visitExpression(node);
-    } else if (node is ForElement) {
-      _visitForLoopParts(node.forLoopParts);
-      _visitCollectionElement(node.body);
-    } else if (node is IfElement) {
-      _visitExpression(node.condition);
-      _visitCollectionElement(node.thenElement);
-      _visitCollectionElement(node.elseElement);
-    } else if (node is MapLiteralEntry) {
-      _visitExpression(node.key);
-      _visitExpression(node.value);
-    } else if (node is SpreadElement) {
-      _visitExpression(node.expression);
-    } else {
-      throw UnimplementedError('(${node.runtimeType}) $node');
-    }
-  }
-
-  /// Record reference to the constructor of the [type] with the given [name].
-  void _visitConstructor(NamedType type, SimpleIdentifier? name) {
-    _visitTypeAnnotation(type);
-
-    if (name != null) {
-      _recordClassMemberReference(targetType: type.type, name: name.name);
-    } else {
-      _recordClassMemberReference(targetType: type.type, name: '');
-    }
-  }
-
-  void _visitConstructorInitializers(
-      NamedType? superClass, List<ConstructorInitializer>? initializers) {
-    if (initializers == null) return;
-
-    for (var i = 0; i < initializers.length; i++) {
-      var initializer = initializers[i];
-      if (initializer is AssertInitializer) {
-        _visitExpression(initializer.condition);
-        _visitExpression(initializer.message);
-      } else if (initializer is ConstructorFieldInitializer) {
-        _visitExpression(initializer.expression);
-      } else if (initializer is SuperConstructorInvocation) {
-        _visitConstructor(superClass!, initializer.constructorName);
-        _visitArgumentList(initializer.argumentList);
-      } else if (initializer is RedirectingConstructorInvocation) {
-        _visitArgumentList(initializer.argumentList);
-        // Strongly speaking, we reference a field of the enclosing class.
-        //
-        // However the current plan is to resolve the whole library on a change.
-        // So, we will resolve the enclosing constructor anyway.
-      } else {
-        throw UnimplementedError('(${initializer.runtimeType}) $initializer');
-      }
-    }
-  }
-
-  void _visitConstructorName(ConstructorName? node) {
-    if (node == null) return;
-
-    _visitConstructor(node.type, node.name);
-  }
-
-  void _visitExpression(Expression? node, {bool get = true, bool set = false}) {
-    if (node == null) return;
-
-    if (node is AdjacentStrings) {
-      _visitAdjacentStrings(node);
-    } else if (node is AsExpression) {
-      _visitExpression(node.expression);
-      _visitTypeAnnotation(node.type);
-    } else if (node is AssignmentExpression) {
-      _visitAssignmentExpression(node);
-    } else if (node is AwaitExpression) {
-      _visitExpression(node.expression);
-    } else if (node is BinaryExpression) {
-      _visitBinaryExpression(node);
-    } else if (node is BooleanLiteral) {
-      // no dependencies
-    } else if (node is CascadeExpression) {
-      _visitCascadeExpression(node);
-    } else if (node is ConditionalExpression) {
-      _visitExpression(node.condition);
-      _visitExpression(node.thenExpression);
-      _visitExpression(node.elseExpression);
-    } else if (node is DoubleLiteral) {
-      // no dependencies
-    } else if (node is FunctionExpression) {
-      _visitFunctionExpression(node);
-    } else if (node is FunctionExpressionInvocation) {
-      _visitExpression(node.function);
-      _visitTypeArguments(node.typeArguments);
-      _visitArgumentList(node.argumentList);
-    } else if (node is IndexExpression) {
-      _visitIndexExpression(node, get: get, set: set);
-    } else if (node is InstanceCreationExpression) {
-      _visitInstanceCreationExpression(node);
-    } else if (node is IntegerLiteral) {
-      // no dependencies
-    } else if (node is IsExpression) {
-      _visitExpression(node.expression);
-      _visitTypeAnnotation(node.type);
-    } else if (node is ListLiteral) {
-      _visitListLiteral(node);
-    } else if (node is MethodInvocation) {
-      _visitMethodInvocation(node);
-    } else if (node is NamedExpression) {
-      _visitExpression(node.expression);
-    } else if (node is NullLiteral) {
-      // no dependencies
-    } else if (node is ParenthesizedExpression) {
-      _visitExpression(node.expression);
-    } else if (node is PostfixExpression) {
-      _visitPostfixExpression(node);
-    } else if (node is PrefixExpression) {
-      _visitPrefixExpression(node);
-    } else if (node is PrefixedIdentifier) {
-      _visitPrefixedIdentifier(node);
-    } else if (node is PropertyAccess) {
-      _visitPropertyAccess(node, get: get, set: set);
-    } else if (node is RethrowExpression) {
-      // no dependencies
-    } else if (node is SetOrMapLiteral) {
-      _visitSetOrMapLiteral(node);
-    } else if (node is SimpleIdentifier) {
-      _visitSimpleIdentifier(node, get: get, set: set);
-    } else if (node is SimpleStringLiteral) {
-      // no dependencies
-    } else if (node is StringInterpolation) {
-      _visitStringInterpolation(node);
-    } else if (node is SymbolLiteral) {
-      // no dependencies
-    } else if (node is ThisExpression) {
-      // Strongly speaking, "this" should add dependencies.
-      // Just like any class reference, it depends on the class hierarchy.
-      // For example adding a new type to the `implements` clause might make
-      // it OK to pass `this` as an argument of an invocation.
-      //
-      // However the current plan is to resolve the whole library on a change.
-      // So, we will resolve all implementations that reference `this`.
-    } else if (node is ThrowExpression) {
-      _visitExpression(node.expression);
-    } else {
-      throw UnimplementedError('(${node.runtimeType}) $node');
-    }
-  }
-
-  void _visitExpressionList(NodeList<Expression> nodes) {
-    for (Expression node in nodes) {
-      _visitExpression(node);
-    }
-  }
-
-  void _visitForLoopParts(ForLoopParts? node) {
-    if (node == null) {
-      return;
-    } else if (node is ForPartsWithDeclarations) {
-      _visitVariableList(node.variables);
-      _visitExpression(node.condition);
-      _visitExpressionList(node.updaters);
-    } else if (node is ForPartsWithExpression) {
-      _visitExpression(node.initialization);
-      _visitExpression(node.condition);
-      _visitExpressionList(node.updaters);
-    } else if (node is ForEachPartsWithDeclaration) {
-      var variable = node.loopVariable;
-      _visitTypeAnnotation(variable.type);
-      _visitExpression(node.iterable);
-      _localScopes.add(variable.identifier.name);
-    } else if (node is ForEachPartsWithIdentifier) {
-      _visitExpression(node.identifier);
-      _visitExpression(node.iterable);
-    } else {
-      throw UnimplementedError('(${node.runtimeType}) $node');
-    }
-  }
-
-  void _visitFormalParameterList(FormalParameterList? node) {
-    if (node == null) return;
-
-    var parameters = node.parameters;
-    for (var i = 0; i < parameters.length; i++) {
-      FormalParameter parameter = parameters[i];
-      if (parameter is DefaultFormalParameter) {
-        DefaultFormalParameter defaultParameter = parameter;
-        parameter = defaultParameter.parameter;
-      }
-
-      var identifier = parameter.identifier;
-      if (identifier != null) {
-        _localScopes.add(identifier.name);
-      }
-
-      if (parameter is FieldFormalParameter) {
-        _visitTypeAnnotation(parameter.type);
-        // Strongly speaking, we reference a field of the enclosing class.
-        //
-        // However the current plan is to resolve the whole library on a change.
-        // So, we will resolve the enclosing constructor anyway.
-      } else if (parameter is FunctionTypedFormalParameter) {
-        _visitTypeAnnotation(parameter.returnType);
-        _visitFormalParameterList(parameter.parameters);
-      } else if (parameter is SimpleFormalParameter) {
-        _visitTypeAnnotation(parameter.type);
-      } else {
-        throw StateError('Unexpected: (${parameter.runtimeType}) $parameter');
-      }
-    }
-  }
-
-  void _visitFormalParameterListImpl(FormalParameterList? node) {
-    if (node == null) return;
-
-    var parameters = node.parameters;
-    for (var i = 0; i < parameters.length; i++) {
-      FormalParameter parameter = parameters[i];
-
-      if (parameter is DefaultFormalParameter) {
-        DefaultFormalParameter defaultParameter = parameter;
-        _visitExpression(defaultParameter.defaultValue);
-        parameter = defaultParameter.parameter;
-      }
-
-      var identifier = parameter.identifier;
-      if (identifier != null) {
-        _localScopes.add(identifier.name);
-      }
-    }
-  }
-
-  void _visitForStatement(ForStatement node) {
-    _localScopes.enter();
-
-    _visitForLoopParts(node.forLoopParts);
-    _visitStatement(node.body);
-
-    _localScopes.exit();
-  }
-
-  void _visitFunctionBody(FunctionBody? node) {
-    if (node == null) return;
-
-    if (node is BlockFunctionBody) {
-      _visitStatement(node.block);
-    } else if (node is EmptyFunctionBody) {
-      return;
-    } else if (node is ExpressionFunctionBody) {
-      _visitExpression(node.expression);
-    } else {
-      throw UnimplementedError('(${node.runtimeType}) $node');
-    }
-  }
-
-  void _visitFunctionDeclarationStatement(FunctionDeclarationStatement node) {
-    var function = node.functionDeclaration;
-    _visitTypeAnnotation(function.returnType);
-    _visitFunctionExpression(function.functionExpression);
-  }
-
-  void _visitFunctionExpression(FunctionExpression node) {
-    _localScopes.enter();
-    _visitTypeParameterList(node.typeParameters);
-    _visitFormalParameterList(node.parameters);
-    _visitFormalParameterListImpl(node.parameters);
-    _visitFunctionBody(node.body);
-    _localScopes.exit();
-  }
-
-  void _visitIndexExpression(IndexExpression node,
-      {required bool get, required bool set}) {
-    var target = node.target;
-    if (target == null) {
-      // no dependencies
-    } else if (target is SuperExpression) {
-      if (get) {
-        _superReferences.add('[]');
-      }
-      if (set) {
-        _superReferences.add('[]=');
-      }
-    } else {
-      _visitExpression(target);
-      var targetType = target.staticType;
-      if (get) {
-        _recordClassMemberReference(targetType: targetType, name: '[]');
-      }
-      if (set) {
-        _recordClassMemberReference(targetType: targetType, name: '[]=');
-      }
-    }
-
-    _visitExpression(node.index);
-  }
-
-  void _visitInstanceCreationExpression(InstanceCreationExpression node) {
-    _visitConstructorName(node.constructorName);
-    _visitArgumentList(node.argumentList);
-  }
-
-  void _visitListLiteral(ListLiteral node) {
-    _visitTypeArguments(node.typeArguments);
-    var elements = node.elements;
-    for (var i = 0; i < elements.length; i++) {
-      var element = elements[i];
-      _visitCollectionElement(element);
-    }
-  }
-
-  void _visitMethodInvocation(MethodInvocation node) {
-    var realTarget = node.realTarget;
-    if (realTarget == null) {
-      _visitExpression(node.methodName);
-    } else if (realTarget is SuperExpression) {
-      _superReferences.add(node.methodName.name);
-    } else {
-      _visitExpression(node.target);
-      _recordClassMemberReference(
-          target: realTarget, name: node.methodName.name);
-    }
-    _visitTypeArguments(node.typeArguments);
-    _visitArgumentList(node.argumentList);
-  }
-
-  void _visitPostfixExpression(PostfixExpression node) {
-    _visitExpression(node.operand);
-
-    var operator = node.operator.type;
-    if (operator == TokenType.MINUS_MINUS) {
-      _recordClassMemberReference(
-        targetType: node.readType,
-        name: '-',
-      );
-    } else if (operator == TokenType.PLUS_PLUS) {
-      _recordClassMemberReference(
-        targetType: node.readType,
-        name: '+',
-      );
-    } else {
-      throw UnimplementedError('$operator');
-    }
-  }
-
-  void _visitPrefixedIdentifier(PrefixedIdentifier node) {
-    var prefix = node.prefix;
-    var prefixElement = prefix.staticElement;
-    if (prefixElement is PrefixElement) {
-      var prefixName = prefix.name;
-      var importPrefix = _importPrefix(prefixName);
-      importPrefix.add(node.identifier.name);
-    } else {
-      _visitExpression(prefix);
-      _recordClassMemberReference(target: prefix, name: node.identifier.name);
-    }
-  }
-
-  void _visitPrefixExpression(PrefixExpression node) {
-    _visitExpression(node.operand);
-
-    var operatorName = node.operator.lexeme;
-    if (operatorName == '-') operatorName = 'unary-';
-
-    _recordClassMemberReference(
-      targetType: node.operand.staticType,
-      name: operatorName,
-    );
-  }
-
-  void _visitPropertyAccess(PropertyAccess node,
-      {required bool get, required bool set}) {
-    var realTarget = node.realTarget;
-    var name = node.propertyName.name;
-
-    if (realTarget is SuperExpression) {
-      if (get) {
-        _superReferences.add(name);
-      }
-      if (set) {
-        _superReferences.add('$name=');
-      }
-    } else {
-      _visitExpression(node.target);
-      if (get) {
-        _recordClassMemberReference(target: realTarget, name: name);
-      }
-      if (set) {
-        _recordClassMemberReference(target: realTarget, name: '$name=');
-      }
-    }
-  }
-
-  void _visitSetOrMapLiteral(SetOrMapLiteral node) {
-    _visitTypeArguments(node.typeArguments);
-    var elements = node.elements;
-    for (var i = 0; i < elements.length; i++) {
-      var element = elements[i];
-      _visitCollectionElement(element);
-    }
-  }
-
-  void _visitSimpleIdentifier(SimpleIdentifier node,
-      {required bool get, required bool set}) {
-    if (node.isSynthetic) return;
-
-    var name = node.name;
-    if (_localScopes.contains(name) ||
-        name == 'void' ||
-        name == 'dynamic' ||
-        name == 'Never') {
-      return;
-    }
-
-    if (get) {
-      _recordUnprefixedReference(name);
-    }
-    if (set) {
-      _recordUnprefixedReference('$name=');
-    }
-  }
-
-  void _visitStatement(Statement? node) {
-    if (node == null) return;
-
-    if (node is AssertStatement) {
-      _visitExpression(node.condition);
-      _visitExpression(node.message);
-    } else if (node is Block) {
-      _visitBlock(node);
-    } else if (node is BreakStatement) {
-      // nothing
-    } else if (node is ContinueStatement) {
-      // nothing
-    } else if (node is DoStatement) {
-      _visitStatement(node.body);
-      _visitExpression(node.condition);
-    } else if (node is EmptyStatement) {
-      // nothing
-    } else if (node is ExpressionStatement) {
-      _visitExpression(node.expression);
-    } else if (node is ForStatement) {
-      _visitForStatement(node);
-    } else if (node is FunctionDeclarationStatement) {
-      _visitFunctionDeclarationStatement(node);
-    } else if (node is IfStatement) {
-      _visitExpression(node.condition);
-      _visitStatement(node.thenStatement);
-      _visitStatement(node.elseStatement);
-    } else if (node is LabeledStatement) {
-      _visitStatement(node.statement);
-    } else if (node is ReturnStatement) {
-      _visitExpression(node.expression);
-    } else if (node is SwitchStatement) {
-      _visitSwitchStatement(node);
-    } else if (node is TryStatement) {
-      _visitTryStatement(node);
-    } else if (node is VariableDeclarationStatement) {
-      _visitVariableList(node.variables);
-    } else if (node is WhileStatement) {
-      _visitExpression(node.condition);
-      _visitStatement(node.body);
-    } else if (node is YieldStatement) {
-      _visitExpression(node.expression);
-    } else {
-      throw UnimplementedError('(${node.runtimeType}) $node');
-    }
-  }
-
-  void _visitStatements(List<Statement> statements) {
-    _localScopes.enter();
-
-    for (var i = 0; i < statements.length; i++) {
-      var statement = statements[i];
-      if (statement is FunctionDeclarationStatement) {
-        _localScopes.add(statement.functionDeclaration.name.name);
-      } else if (statement is VariableDeclarationStatement) {
-        var variables = statement.variables.variables;
-        for (int i = 0; i < variables.length; i++) {
-          _localScopes.add(variables[i].name.name);
-        }
-      }
-    }
-
-    for (var i = 0; i < statements.length; i++) {
-      var statement = statements[i];
-      _visitStatement(statement);
-    }
-
-    _localScopes.exit();
-  }
-
-  void _visitStringInterpolation(StringInterpolation node) {
-    var elements = node.elements;
-    for (var i = 0; i < elements.length; i++) {
-      var element = elements[i];
-      if (element is InterpolationExpression) {
-        _visitExpression(element.expression);
-      }
-    }
-  }
-
-  void _visitSwitchStatement(SwitchStatement node) {
-    _visitExpression(node.expression);
-    var members = node.members;
-    for (var i = 0; i < members.length; i++) {
-      var member = members[i];
-      if (member is SwitchCase) {
-        _visitExpression(member.expression);
-      }
-      _visitStatements(member.statements);
-    }
-  }
-
-  void _visitTryStatement(TryStatement node) {
-    _visitBlock(node.body);
-
-    var catchClauses = node.catchClauses;
-    for (var i = 0; i < catchClauses.length; i++) {
-      var catchClause = catchClauses[i];
-      _visitTypeAnnotation(catchClause.exceptionType);
-
-      _localScopes.enter();
-
-      var exceptionParameter = catchClause.exceptionParameter;
-      if (exceptionParameter != null) {
-        _localScopes.add(exceptionParameter.name);
-      }
-
-      var stackTraceParameter = catchClause.stackTraceParameter;
-      if (stackTraceParameter != null) {
-        _localScopes.add(stackTraceParameter.name);
-      }
-
-      _visitBlock(catchClause.body);
-
-      _localScopes.exit();
-    }
-
-    _visitBlock(node.finallyBlock);
-  }
-
-  void _visitTypeAnnotation(TypeAnnotation? node) {
-    if (node == null) return;
-
-    if (node is GenericFunctionType) {
-      _localScopes.enter();
-
-      var typeParameterList = node.typeParameters;
-      if (typeParameterList != null) {
-        var typeParameters = typeParameterList.typeParameters;
-        for (var i = 0; i < typeParameters.length; i++) {
-          var typeParameter = typeParameters[i];
-          _localScopes.add(typeParameter.name.name);
-        }
-        for (var i = 0; i < typeParameters.length; i++) {
-          var typeParameter = typeParameters[i];
-          _visitTypeAnnotation(typeParameter.bound);
-        }
-      }
-
-      _visitTypeAnnotation(node.returnType);
-      _visitFormalParameterList(node.parameters);
-
-      _localScopes.exit();
-    } else if (node is NamedType) {
-      var identifier = node.name;
-      _visitExpression(identifier);
-      _visitTypeArguments(node.typeArguments);
-    } else {
-      throw UnimplementedError('(${node.runtimeType}) $node');
-    }
-  }
-
-  void _visitTypeAnnotations(List<TypeAnnotation>? typeAnnotations) {
-    if (typeAnnotations == null) return;
-
-    for (var i = 0; i < typeAnnotations.length; i++) {
-      var typeAnnotation = typeAnnotations[i];
-      _visitTypeAnnotation(typeAnnotation);
-    }
-  }
-
-  void _visitTypeArguments(TypeArgumentList? node) {
-    if (node == null) return;
-
-    _visitTypeAnnotations(node.arguments);
-  }
-
-  void _visitTypeParameterList(TypeParameterList? node) {
-    if (node == null) return;
-
-    var typeParameters = node.typeParameters;
-
-    // Define all type parameters in the local scope.
-    for (var i = 0; i < typeParameters.length; i++) {
-      var typeParameter = typeParameters[i];
-      _localScopes.add(typeParameter.name.name);
-    }
-
-    // Record bounds.
-    for (var i = 0; i < typeParameters.length; i++) {
-      var typeParameter = typeParameters[i];
-      _visitTypeAnnotation(typeParameter.bound);
-    }
-  }
-
-  void _visitVariableList(VariableDeclarationList? node) {
-    if (node == null) return;
-
-    _visitTypeAnnotation(node.type);
-
-    var variables = node.variables;
-    for (int i = 0; i < variables.length; i++) {
-      var variable = variables[i];
-      _localScopes.add(variable.name.name);
-      _visitExpression(variable.initializer);
-    }
-  }
-}
-
-/// The sorted set of [ClassMemberReference]s.
-class _ClassMemberReferenceSet {
-  final List<ClassMemberReference> references = [];
-
-  void add(ClassElement class_, String name) {
-    var target = LibraryQualifiedName(class_.library.source.uri, class_.name);
-    var reference = ClassMemberReference(target, name);
-    if (!references.contains(reference)) {
-      references.add(reference);
-    }
-  }
-
-  /// Return the sorted list of unique class member references.
-  List<ClassMemberReference> toList() {
-    references.sort(ClassMemberReference.compare);
-    return references;
-  }
-}
-
-/// The stack of names that are defined in a local scope inside the node,
-/// such as parameters, local variables, local functions, local type
-/// parameters, etc.
-class _LocalScopes {
-  /// The stack of name sets.
-  final List<_NameSet> scopes = [];
-
-  bool get isEmpty => scopes.isEmpty;
-
-  /// Add the given [name] to the current local scope.
-  void add(String name) {
-    scopes.last.add(name);
-  }
-
-  /// Return whether the given [name] is defined in one of the local scopes.
-  bool contains(String name) {
-    for (var i = 0; i < scopes.length; i++) {
-      if (scopes[i].contains(name)) {
-        return true;
-      }
-    }
-    return false;
-  }
-
-  /// Enter a new local scope, e.g. a block, or a type parameter scope.
-  void enter() {
-    scopes.add(_NameSet());
-  }
-
-  /// Exit the current local scope.
-  void exit() {
-    scopes.removeLast();
-  }
-}
-
-class _NameSet {
-  final List<String> names = [];
-
-  bool get isNotEmpty => names.isNotEmpty;
-
-  void add(String name) {
-    // TODO(scheglov) consider just adding, but toList() sort and unique
-    if (!contains(name)) {
-      names.add(name);
-    }
-  }
-
-  bool contains(String name) => names.contains(name);
-
-  List<String> toList() {
-    names.sort(_compareStrings);
-    return names;
-  }
-
-  static int _compareStrings(String first, String second) {
-    return first.compareTo(second);
-  }
-}
-
-class _ReferencedImportPrefixedNames {
-  final String prefix;
-  _NameSet names = _NameSet();
-
-  _ReferencedImportPrefixedNames(this.prefix);
-
-  void add(String name) {
-    names.add(name);
-  }
-
-  void clear() {
-    names = _NameSet();
-  }
-}
diff --git a/pkg/analyzer/lib/src/dart/analysis/driver.dart b/pkg/analyzer/lib/src/dart/analysis/driver.dart
index 1160d53..a376df8 100644
--- a/pkg/analyzer/lib/src/dart/analysis/driver.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/driver.dart
@@ -84,7 +84,7 @@
 /// TODO(scheglov) Clean up the list of implicitly analyzed files.
 class AnalysisDriver implements AnalysisDriverGeneric {
   /// The version of data format, should be incremented on every format change.
-  static const int DATA_VERSION = 220;
+  static const int DATA_VERSION = 221;
 
   /// The number of exception contexts allowed to write. Once this field is
   /// zero, we stop writing any new exception contexts in this process.
@@ -1045,14 +1045,7 @@
       _fileTracker.fileWasAnalyzed(path);
       try {
         final result = await _computeAnalysisResult(path, withUnit: true);
-        final SomeResolvedUnitResult unitResult;
-        if (result != null) {
-          unitResult = result.unitResult!;
-        } else {
-          unitResult = PartWithoutLibraryResultImpl(
-            path: path,
-          );
-        }
+        final unitResult = result.unitResult!;
         for (final completer in completers) {
           completer.complete(unitResult);
         }
@@ -1091,7 +1084,6 @@
       var result = await _computeErrors(
         path: path,
       );
-      result ??= PartWithoutLibraryResultImpl(path: path);
       for (var completer in completers) {
         completer.complete(result);
       }
@@ -1112,8 +1104,7 @@
     if (_unitElementRequestedFiles.isNotEmpty) {
       String path = _unitElementRequestedFiles.keys.first;
       var completers = _unitElementRequestedFiles.remove(path)!;
-      SomeUnitElementResult? result = await _computeUnitElement(path);
-      result ??= PartWithoutLibraryResultImpl(path: path);
+      final result = await _computeUnitElement(path);
       for (var completer in completers) {
         completer.complete(result);
       }
@@ -1154,18 +1145,7 @@
         if (_fileTracker.isFilePending(path)) {
           try {
             var result = await _computeAnalysisResult(path, withUnit: true);
-            if (result == null) {
-              // We report an invalid result (instead of silently ignoring
-              // this disconnected part) so that the listener of the stream
-              // knows, and for example removes all errors.
-              _resultController.add(
-                PartWithoutLibraryResultImpl(
-                  path: path,
-                ),
-              );
-            } else {
-              _resultController.add(result.unitResult!);
-            }
+            _resultController.add(result.unitResult!);
           } catch (exception, stackTrace) {
             _reportException(path, exception, stackTrace);
             _clearLibraryContextAfterException();
@@ -1183,13 +1163,7 @@
       try {
         var result = await _computeAnalysisResult(path,
             withUnit: false, skipIfSameSignature: true);
-        if (result == null) {
-          _resultController.add(
-            PartWithoutLibraryResultImpl(
-              path: path,
-            ),
-          );
-        } else if (result.isUnchangedErrors) {
+        if (result.isUnchangedErrors) {
           // We found that the set of errors is the same as we produced the
           // last time, so we don't need to produce it again now.
         } else {
@@ -1302,27 +1276,22 @@
   /// When `true`, [AnalysisResult.unitResult] will be set.
   /// Otherwise [AnalysisResult.errorsResult] will be set.
   ///
-  /// Return `null` if the file is a part of an unknown library, so cannot be
-  /// analyzed yet. But [asIsIfPartWithoutLibrary] is `true`, then the file is
-  /// analyzed anyway, even without a library.
-  ///
   /// Return [AnalysisResult._UNCHANGED] if [skipIfSameSignature] is `true` and
   /// the resolved signature of the file in its library is the same as the one
   /// that was the most recently produced to the client.
-  Future<AnalysisResult?> _computeAnalysisResult(String path,
-      {required bool withUnit,
-      bool asIsIfPartWithoutLibrary = false,
-      bool skipIfSameSignature = false}) async {
+  Future<AnalysisResult> _computeAnalysisResult(String path,
+      {required bool withUnit, bool skipIfSameSignature = false}) async {
     FileState file = _fsState.getFileForPath(path);
 
     // Prepare the library - the file itself, or the known library.
-    FileState? library = file.isPart ? file.library : file;
-    if (library == null) {
-      if (asIsIfPartWithoutLibrary) {
-        library = file;
-      } else {
-        return null;
-      }
+    final FileState library;
+    final kind = file.kind;
+    if (kind is LibraryFileStateKind) {
+      library = kind.file;
+    } else if (kind is PartFileStateKind) {
+      library = kind.library ?? kind.asLibrary.file;
+    } else {
+      throw UnimplementedError('${kind.runtimeType}');
     }
 
     // Prepare the signature and key.
@@ -1359,7 +1328,7 @@
           return _newMissingDartLibraryResult(file, 'dart:async');
         }
 
-        await libraryContext.load(library!);
+        await libraryContext.load(library);
 
         var results = LibraryAnalyzer(
           analysisOptions as AnalysisOptionsImpl,
@@ -1397,22 +1366,22 @@
         return result;
       } catch (exception, stackTrace) {
         String? contextKey =
-            _storeExceptionContext(path, library!, exception, stackTrace);
+            _storeExceptionContext(path, library, exception, stackTrace);
         throw _ExceptionState(exception, stackTrace, contextKey);
       }
     });
   }
 
-  Future<SomeErrorsResult?> _computeErrors({
+  Future<SomeErrorsResult> _computeErrors({
     required String path,
   }) async {
     var analysisResult = await _computeAnalysisResult(path, withUnit: false);
-    return analysisResult?.errorsResult;
+    return analysisResult.errorsResult!;
   }
 
-  Future<AnalysisDriverUnitIndex?> _computeIndex(String path) async {
+  Future<AnalysisDriverUnitIndex> _computeIndex(String path) async {
     var analysisResult = await _computeAnalysisResult(path, withUnit: false);
-    return analysisResult?._index;
+    return analysisResult._index!;
   }
 
   /// Return the newly computed resolution result of the library with the
@@ -1460,23 +1429,23 @@
     });
   }
 
-  Future<UnitElementResult?> _computeUnitElement(String path,
-      {bool asIsIfPartWithoutLibrary = false}) async {
+  Future<UnitElementResult?> _computeUnitElement(String path) async {
     FileState file = _fsState.getFileForPath(path);
 
     // Prepare the library - the file itself, or the known library.
-    FileState? library = file.isPart ? file.library : file;
-    if (library == null) {
-      if (asIsIfPartWithoutLibrary) {
-        library = file;
-      } else {
-        return null;
-      }
+    final FileState library;
+    final kind = file.kind;
+    if (kind is LibraryFileStateKind) {
+      library = kind.file;
+    } else if (kind is PartFileStateKind) {
+      library = kind.library ?? kind.asLibrary.file;
+    } else {
+      throw UnimplementedError('${kind.runtimeType}');
     }
 
     return _logger.runAsync('Compute unit element for $path', () async {
       _logger.writeln('Work in $name');
-      await libraryContext.load(library!);
+      await libraryContext.load(library);
       var element = libraryContext.computeUnitElement(library, file);
       return UnitElementResultImpl(
         currentSession,
diff --git a/pkg/analyzer/lib/src/dart/analysis/experiments.g.dart b/pkg/analyzer/lib/src/dart/analysis/experiments.g.dart
index 0ddc93b..de04c11 100644
--- a/pkg/analyzer/lib/src/dart/analysis/experiments.g.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/experiments.g.dart
@@ -197,7 +197,7 @@
     documentation:
         'Horizontal type inference for function expressions passed to generic invocations.',
     experimentalReleaseVersion: null,
-    releaseVersion: null,
+    releaseVersion: Version.parse('2.18.0'),
   );
 
   static final inference_update_2 = ExperimentalFeature(
@@ -350,7 +350,7 @@
   static const bool generic_metadata = true;
 
   /// Default state of the experiment "inference-update-1"
-  static const bool inference_update_1 = false;
+  static const bool inference_update_1 = true;
 
   /// Default state of the experiment "inference-update-2"
   static const bool inference_update_2 = false;
diff --git a/pkg/analyzer/lib/src/dart/analysis/file_state.dart b/pkg/analyzer/lib/src/dart/analysis/file_state.dart
index 2e35c85..a14226d 100644
--- a/pkg/analyzer/lib/src/dart/analysis/file_state.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/file_state.dart
@@ -43,6 +43,48 @@
 import 'package:path/path.dart' as package_path;
 import 'package:pub_semver/pub_semver.dart';
 
+/// The file has a `library augmentation` directive.
+abstract class AugmentationFileStateKind extends LibraryOrAugmentationFileKind {
+  final UnlinkedLibraryAugmentationDirective directive;
+
+  AugmentationFileStateKind({
+    required super.file,
+    required this.directive,
+  });
+}
+
+/// The URI of the [directive] can be resolved.
+class AugmentationKnownFileStateKind extends AugmentationFileStateKind {
+  /// The file that is referenced by the [directive].
+  final FileState uriFile;
+
+  AugmentationKnownFileStateKind({
+    required super.file,
+    required super.directive,
+    required this.uriFile,
+  });
+
+  /// If the [uriFile] has `import augment` of this file, returns [uriFile].
+  /// Otherwise, this file is not a valid augmentation, returns `null`.
+  FileState? get augmented {
+    final uriKind = uriFile.kind;
+    if (uriKind is LibraryOrAugmentationFileKind) {
+      if (uriKind.hasAugmentation(this)) {
+        return uriFile;
+      }
+    }
+    return null;
+  }
+}
+
+/// The URI of the [directive] can not be resolved.
+class AugmentationUnknownFileStateKind extends AugmentationFileStateKind {
+  AugmentationUnknownFileStateKind({
+    required super.file,
+    required super.directive,
+  });
+}
+
 /// A library from [SummaryDataStore].
 class ExternalLibrary {
   final Uri uri;
@@ -131,6 +173,7 @@
   /// Files that reference this file.
   final List<FileState> referencingFiles = [];
 
+  List<FileState?> _augmentationFiles = [];
   List<FileState?>? _importedFiles;
   List<FileState?>? _exportedFiles;
   List<FileState?> _partedFiles = [];
@@ -163,6 +206,11 @@
   /// The unlinked API signature of the file.
   Uint8List get apiSignature => _apiSignature!;
 
+  /// The list of imported augmentations.
+  List<FileState?> get augmentationFiles {
+    return _augmentationFiles;
+  }
+
   /// The content of the file.
   String get content => _content!;
 
@@ -251,7 +299,7 @@
   /// not processed a library file yet.
   FileState? get library {
     final kind = _kind;
-    if (kind is PartKnownFileStateKind) {
+    if (kind is PartFileStateKind) {
       return kind.library;
     } else {
       return null;
@@ -395,14 +443,7 @@
     //   Flush exported top-level declarations of all files.
     if (apiSignatureChanged) {
       _libraryCycle?.invalidate();
-
-      // If this is a part, invalidate the libraries.
-      final kind = _kind;
-      if (kind is PartKnownFileStateKind) {
-        for (final library in kind._libraries) {
-          library._libraryCycle?.invalidate();
-        }
-      }
+      _invalidatesLibrariesOfThisPart();
     }
 
     // It is possible that this file does not reference these files.
@@ -417,6 +458,7 @@
     // Read parts eagerly to link parts to libraries.
     _updateKind();
     _updatePartedFiles();
+    _updateAugmentationFiles();
 
     // Update mapping from subtyped names to files.
     for (var name in _driverUnlinkedUnit!.subtypedNames) {
@@ -499,6 +541,19 @@
     }
   }
 
+  /// If this is a part, invalidate the libraries that use it.
+  void _invalidatesLibrariesOfThisPart() {
+    if (_kind is PartFileStateKind) {
+      for (final library in _fsState._pathToFile.values) {
+        if (library._kind is LibraryFileStateKind) {
+          if (library.partedFiles.contains(this)) {
+            library._libraryCycle?.invalidate();
+          }
+        }
+      }
+    }
+  }
+
   CompilationUnitImpl _parse(AnalysisErrorListener errorListener) {
     CharSequenceReader reader = CharSequenceReader(content);
     Scanner scanner = Scanner(source, reader, errorListener)
@@ -555,107 +610,93 @@
       }
     }
 
-    removeForOne(_importedFiles);
+    removeForOne(_augmentationFiles);
     removeForOne(_exportedFiles);
+    removeForOne(_importedFiles);
     removeForOne(_partedFiles);
   }
 
+  void _updateAugmentationFiles() {
+    _augmentationFiles = unlinked2.augmentations.map((directive) {
+      return _fileForRelativeUri(directive.uri).map(
+        (augmentation) {
+          augmentation?.referencingFiles.add(this);
+          return augmentation;
+        },
+        (_) => null,
+      );
+    }).toList();
+  }
+
   void _updateKind() {
-    /// This file is a part (was not part, or no kind at all).
-    /// Now we might be able to update its kind to a known part.
-    void updateLibrariesWithThisPart() {
-      for (final maybeLibrary in _fsState._pathToFile.values) {
-        if (maybeLibrary.kind is LibraryFileStateKind) {
-          if (maybeLibrary.partedFiles.contains(this)) {
-            maybeLibrary._updatePartedFiles();
-            maybeLibrary._libraryCycle?.invalidate();
-          }
-        }
-      }
-    }
+    _fsState._libraryNameToFiles.remove(_kind);
 
     final libraryAugmentationDirective = unlinked2.libraryAugmentationDirective;
+    final libraryDirective = unlinked2.libraryDirective;
     final partOfNameDirective = unlinked2.partOfNameDirective;
     final partOfUriDirective = unlinked2.partOfUriDirective;
     if (libraryAugmentationDirective != null) {
-      // TODO(scheglov) This code does not have enough tests.
-      _kind = LibraryAugmentationUnknownFileStateKind(
-        file: this,
-        directive: libraryAugmentationDirective,
+      final uri = libraryAugmentationDirective.uri;
+      final uriFile = _fileForRelativeUri(uri).map(
+        (file) => file,
+        (_) => null,
       );
-      _fileForRelativeUri(libraryAugmentationDirective.uri);
-    } else if (unlinked2.libraryDirective != null) {
+      if (uriFile != null) {
+        _kind = AugmentationKnownFileStateKind(
+          file: this,
+          directive: libraryAugmentationDirective,
+          uriFile: uriFile,
+        );
+      } else {
+        _kind = AugmentationUnknownFileStateKind(
+          file: this,
+          directive: libraryAugmentationDirective,
+        );
+      }
+    } else if (libraryDirective != null) {
       _kind = LibraryFileStateKind(
         file: this,
+        name: libraryDirective.name,
       );
     } else if (partOfNameDirective != null) {
-      if (_kind is! PartKnownFileStateKind) {
-        _kind = PartUnknownNameFileStateKind(
-          file: this,
-          directive: partOfNameDirective,
-        );
-        updateLibrariesWithThisPart();
-      }
+      _kind = PartOfNameFileStateKind(
+        file: this,
+        directive: partOfNameDirective,
+      );
     } else if (partOfUriDirective != null) {
-      if (_kind is! PartKnownFileStateKind) {
-        _kind = PartUnknownUriFileStateKind(
+      final uri = partOfUriDirective.uri;
+      final uriFile = _fileForRelativeUri(uri).map(
+        (file) => file,
+        (_) => null,
+      );
+      if (uriFile != null) {
+        _kind = PartOfUriKnownFileStateKind(
+          file: this,
+          directive: partOfUriDirective,
+          uriFile: uriFile,
+        );
+      } else {
+        _kind = PartOfUriUnknownFileStateKind(
           file: this,
           directive: partOfUriDirective,
         );
-        _fileForRelativeUri(partOfUriDirective.uri);
-        updateLibrariesWithThisPart();
       }
     } else {
       _kind = LibraryFileStateKind(
         file: this,
+        name: null,
       );
     }
+
+    _fsState._libraryNameToFiles.add(_kind);
+    _invalidatesLibrariesOfThisPart();
   }
 
   void _updatePartedFiles() {
-    // Disconnect all parts of this library.
-    for (final part in _partedFiles) {
-      if (part != null) {
-        final partKind = part.kind;
-        if (partKind is PartKnownFileStateKind) {
-          partKind._libraries.remove(this);
-          // If no libraries, switch to unknown.
-          if (partKind._libraries.isEmpty) {
-            final partOfNameDirective = part.unlinked2.partOfNameDirective;
-            final partOfUriDirective = part.unlinked2.partOfUriDirective;
-            if (partOfNameDirective != null) {
-              part._kind = PartUnknownNameFileStateKind(
-                file: part,
-                directive: partOfNameDirective,
-              );
-            } else if (partOfUriDirective != null) {
-              part._kind = PartUnknownUriFileStateKind(
-                file: part,
-                directive: partOfUriDirective,
-              );
-            }
-          }
-        }
-      }
-    }
-
     _partedFiles = unlinked2.parts.map((uri) {
       return _fileForRelativeUri(uri).map(
         (part) {
-          if (part != null) {
-            part.referencingFiles.add(this);
-            // Either add this as a library, or switch from unknown.
-            final kind = part._kind;
-            if (kind is PartKnownFileStateKind) {
-              kind._libraries.add(this);
-            } else if (kind is PartUnknownNameFileStateKind ||
-                kind is PartUnknownUriFileStateKind) {
-              part._kind = PartKnownFileStateKind(
-                file: part,
-                library: this,
-              );
-            }
-          }
+          part?.referencingFiles.add(this);
           return part;
         },
         (_) => null,
@@ -673,6 +714,7 @@
     UnlinkedLibraryAugmentationDirective? libraryAugmentationDirective;
     UnlinkedPartOfNameDirective? partOfNameDirective;
     UnlinkedPartOfUriDirective? partOfUriDirective;
+    var augmentations = <UnlinkedImportAugmentationDirective>[];
     var exports = <UnlinkedNamespaceDirective>[];
     var imports = <UnlinkedNamespaceDirective>[];
     var parts = <String>[];
@@ -682,11 +724,19 @@
       if (directive is ExportDirective) {
         var builder = _serializeNamespaceDirective(directive);
         exports.add(builder);
-      } else if (directive is ImportDirective) {
-        var builder = _serializeNamespaceDirective(directive);
-        imports.add(builder);
-        if (builder.uri == 'dart:core') {
-          hasDartCoreImport = true;
+      } else if (directive is ImportDirectiveImpl) {
+        if (directive.augmentKeyword != null) {
+          augmentations.add(
+            UnlinkedImportAugmentationDirective(
+              uri: directive.uri.stringValue ?? '',
+            ),
+          );
+        } else {
+          var builder = _serializeNamespaceDirective(directive);
+          imports.add(builder);
+          if (builder.uri == 'dart:core') {
+            hasDartCoreImport = true;
+          }
         }
       } else if (directive is LibraryAugmentationDirective) {
         final uri = directive.uri;
@@ -761,6 +811,7 @@
     }
     return UnlinkedUnit(
       apiSignature: Uint8List.fromList(computeUnlinkedApiSignature(unit)),
+      augmentations: augmentations,
       exports: exports,
       imports: imports,
       informativeBytes: writeUnitInformative(unit),
@@ -875,6 +926,9 @@
   /// Mapping from a path to the corresponding [FileState].
   final Map<String, FileState> _pathToFile = {};
 
+  /// Mapping from a library name to the [LibraryFileStateKind] that have it.
+  final _LibraryNameToFiles _libraryNameToFiles = _LibraryNameToFiles();
+
   /// The map of subtyped names to files where these names are subtyped.
   final Map<String, Set<FileState>> _subtypedNameToFiles = {};
 
@@ -1070,6 +1124,7 @@
     _hasUriForPath.clear();
     _pathToFile.clear();
     _subtypedNameToFiles.clear();
+    _libraryNameToFiles.clear();
   }
 
   FileState _newFile(File resource, String path, Uri uri) {
@@ -1152,63 +1207,161 @@
   bool get isSrc => (_flags & _isSrc) != 0;
 }
 
-class LibraryAugmentationKnownFileStateKind extends FileStateKind {
-  final FileState augmented;
+class LibraryFileStateKind extends LibraryOrAugmentationFileKind {
+  /// The name of the library from the `library` directive.
+  /// Or `null` if no `library` directive.
+  final String? name;
 
-  LibraryAugmentationKnownFileStateKind({
-    required super.file,
-    required this.augmented,
-  });
-}
-
-/// A library augmentation when the augmented target is unknown, e.g.
-/// the provided URI cannot be resolved.
-class LibraryAugmentationUnknownFileStateKind extends FileStateKind {
-  final UnlinkedLibraryAugmentationDirective directive;
-
-  LibraryAugmentationUnknownFileStateKind({
-    required super.file,
-    required this.directive,
-  });
-}
-
-class LibraryFileStateKind extends FileStateKind {
   LibraryFileStateKind({
     required super.file,
+    required this.name,
   });
+
+  bool hasPart(PartFileStateKind part) {
+    return file.partedFiles.contains(part.file);
+  }
 }
 
-class PartKnownFileStateKind extends FileStateKind {
-  final List<FileState> _libraries = [];
-
-  PartKnownFileStateKind({
+abstract class LibraryOrAugmentationFileKind extends FileStateKind {
+  LibraryOrAugmentationFileKind({
     required super.file,
-    required FileState library,
-  }) {
-    _libraries.add(library);
+  });
+
+  bool hasAugmentation(AugmentationFileStateKind augmentation) {
+    return file.augmentationFiles.contains(augmentation.file);
+  }
+}
+
+/// The file has `part of` directive.
+abstract class PartFileStateKind extends FileStateKind {
+  PartFileStateKind({
+    required super.file,
+  });
+
+  /// When [library] returns `null`, this getter is used to look at this
+  /// file itself as a library.
+  LibraryFileStateKind get asLibrary {
+    return LibraryFileStateKind(
+      file: file,
+      name: null,
+    );
   }
 
-  FileState get library => _libraries.first;
+  /// Returns the library in which this part should be analyzed.
+  FileState? get library;
 }
 
-/// The file is a part, but its library is unknown.
-/// We don't know the library with this name.
-class PartUnknownNameFileStateKind extends FileStateKind {
+/// The file has `part of name` directive.
+class PartOfNameFileStateKind extends PartFileStateKind {
   final UnlinkedPartOfNameDirective directive;
 
-  PartUnknownNameFileStateKind({
+  PartOfNameFileStateKind({
+    required super.file,
+    required this.directive,
+  });
+
+  /// Libraries with the same name as in [directive].
+  List<LibraryFileStateKind> get libraries {
+    final files = file._fsState._libraryNameToFiles;
+    return files[directive.name] ?? [];
+  }
+
+  /// If there are libraries that include this file as a part, return the
+  /// first one as if sorted by path.
+  @override
+  FileState? get library {
+    LibraryFileStateKind? result;
+    for (final library in libraries) {
+      if (library.hasPart(this)) {
+        if (result == null) {
+          result = library;
+        } else if (library.file.path.compareTo(result.file.path) < 0) {
+          result = library;
+        }
+      }
+    }
+    return result?.file;
+  }
+}
+
+/// The file has `part of URI` directive.
+abstract class PartOfUriFileStateKind extends PartFileStateKind {
+  final UnlinkedPartOfUriDirective directive;
+
+  PartOfUriFileStateKind({
     required super.file,
     required this.directive,
   });
 }
 
-/// The file is a part, but its library is unknown.
-/// When we don't understand the URI.
-class PartUnknownUriFileStateKind extends FileStateKind {
-  final UnlinkedPartOfUriDirective directive;
+/// The file has `part of URI` directive, and the URI can be resolved.
+class PartOfUriKnownFileStateKind extends PartOfUriFileStateKind {
+  final FileState uriFile;
 
-  PartUnknownUriFileStateKind({
+  PartOfUriKnownFileStateKind({
     required super.file,
-    required this.directive,
+    required super.directive,
+    required this.uriFile,
   });
+
+  @override
+  FileState? get library {
+    final uriKind = uriFile.kind;
+    if (uriKind is LibraryFileStateKind) {
+      if (uriKind.hasPart(this)) {
+        return uriFile;
+      }
+    }
+    return null;
+  }
+}
+
+/// The file has `part of URI` directive, and the URI cannot be resolved.
+class PartOfUriUnknownFileStateKind extends PartOfUriFileStateKind {
+  PartOfUriUnknownFileStateKind({
+    required super.file,
+    required super.directive,
+  });
+
+  @override
+  FileState? get library => null;
+}
+
+class _LibraryNameToFiles {
+  final Map<String, List<LibraryFileStateKind>> _map = {};
+
+  List<LibraryFileStateKind>? operator [](String name) {
+    return _map[name];
+  }
+
+  /// If [kind] is a named library, register it.
+  void add(FileStateKind? kind) {
+    if (kind is LibraryFileStateKind) {
+      final name = kind.name;
+      if (name != null) {
+        final libraries = _map[name] ??= [];
+        libraries.add(kind);
+      }
+    }
+  }
+
+  void clear() {
+    _map.clear();
+  }
+
+  /// If [kind] is a named library, unregister it.
+  void remove(FileStateKind? kind) {
+    if (kind is LibraryFileStateKind) {
+      final name = kind.name;
+      if (name != null) {
+        final libraries = _map[name];
+        if (libraries != null) {
+          libraries.remove(kind);
+          if (libraries.isEmpty) {
+            _map.remove(name);
+          }
+        }
+      }
+    }
+  }
 }
diff --git a/pkg/analyzer/lib/src/dart/analysis/results.dart b/pkg/analyzer/lib/src/dart/analysis/results.dart
index 789a751..81dcce5 100644
--- a/pkg/analyzer/lib/src/dart/analysis/results.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/results.dart
@@ -137,15 +137,6 @@
   LineInfo get lineInfo => unit.lineInfo;
 }
 
-class PartWithoutLibraryResultImpl implements PartWithoutLibraryResult {
-  @override
-  final String path;
-
-  PartWithoutLibraryResultImpl({
-    required this.path,
-  });
-}
-
 class ResolvedForCompletionResultImpl {
   final AnalysisSession analysisSession;
   final String path;
diff --git a/pkg/analyzer/lib/src/dart/analysis/unlinked_api_signature.dart b/pkg/analyzer/lib/src/dart/analysis/unlinked_api_signature.dart
index e1f1f9e..20b101b 100644
--- a/pkg/analyzer/lib/src/dart/analysis/unlinked_api_signature.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/unlinked_api_signature.dart
@@ -130,6 +130,7 @@
     if (node != null) {
       signature.addBool(node.isSynchronous);
       signature.addBool(node.isGenerator);
+      signature.addBool(node is NativeFunctionBody);
     }
   }
 
diff --git a/pkg/analyzer/lib/src/dart/analysis/unlinked_data.dart b/pkg/analyzer/lib/src/dart/analysis/unlinked_data.dart
index e4b4773..605461c 100644
--- a/pkg/analyzer/lib/src/dart/analysis/unlinked_data.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/unlinked_data.dart
@@ -90,6 +90,26 @@
   }
 }
 
+class UnlinkedImportAugmentationDirective {
+  final String uri;
+
+  UnlinkedImportAugmentationDirective({
+    required this.uri,
+  });
+
+  factory UnlinkedImportAugmentationDirective.read(
+    SummaryDataReader reader,
+  ) {
+    return UnlinkedImportAugmentationDirective(
+      uri: reader.readStringUtf8(),
+    );
+  }
+
+  void write(BufferedSink sink) {
+    sink.writeStringUtf8(uri);
+  }
+}
+
 class UnlinkedLibraryAugmentationDirective {
   final String uri;
   final UnlinkedSourceRange uriRange;
@@ -285,6 +305,9 @@
   /// TODO(scheglov) Do we need it?
   final Uint8List apiSignature;
 
+  /// `import augmentation` directives.
+  final List<UnlinkedImportAugmentationDirective> augmentations;
+
   /// URIs of `export` directives.
   final List<UnlinkedNamespaceDirective> exports;
 
@@ -317,6 +340,7 @@
 
   UnlinkedUnit({
     required this.apiSignature,
+    required this.augmentations,
     required this.exports,
     required this.imports,
     required this.informativeBytes,
@@ -332,6 +356,9 @@
   factory UnlinkedUnit.read(SummaryDataReader reader) {
     return UnlinkedUnit(
       apiSignature: reader.readUint8List(),
+      augmentations: reader.readTypedList(
+        () => UnlinkedImportAugmentationDirective.read(reader),
+      ),
       exports: reader.readTypedList(
         () => UnlinkedNamespaceDirective.read(reader),
       ),
@@ -361,6 +388,9 @@
 
   void write(BufferedSink sink) {
     sink.writeUint8List(apiSignature);
+    sink.writeList<UnlinkedImportAugmentationDirective>(augmentations, (x) {
+      x.write(sink);
+    });
     sink.writeList<UnlinkedNamespaceDirective>(exports, (x) {
       x.write(sink);
     });
diff --git a/pkg/analyzer/lib/src/dart/ast/ast.dart b/pkg/analyzer/lib/src/dart/ast/ast.dart
index 00e49a0..7a61f73 100644
--- a/pkg/analyzer/lib/src/dart/ast/ast.dart
+++ b/pkg/analyzer/lib/src/dart/ast/ast.dart
@@ -3903,6 +3903,7 @@
         return parent._staticParameterElementForIndex;
       }
     } else if (parent is BinaryExpressionImpl) {
+      // TODO(scheglov) https://github.com/dart-lang/sdk/issues/49102
       if (identical(parent.rightOperand, this)) {
         var parameters = parent.staticInvokeType?.parameters;
         if (parameters != null && parameters.isNotEmpty) {
@@ -3915,8 +3916,12 @@
         return parent._staticParameterElementForRightHandSide;
       }
     } else if (parent is PrefixExpressionImpl) {
+      // TODO(scheglov) This does not look right, there is no element for
+      // the operand, for `a++` we invoke `a = a + 1`, so the parameter
+      // is for `1`, not for `a`.
       return parent._staticParameterElementForOperand;
     } else if (parent is PostfixExpressionImpl) {
+      // TODO(scheglov) The same as above.
       return parent._staticParameterElementForOperand;
     }
     return null;
@@ -6383,6 +6388,58 @@
     _prefix?.accept(visitor);
     combinators.accept(visitor);
   }
+
+  /// Return `true` if the non-URI components of the two directives are
+  /// syntactically identical. URIs are checked outside to see if they resolve
+  /// to the same absolute URI, so to the same library, regardless of the used
+  /// syntax (absolute, relative, not normalized).
+  static bool areSyntacticallyIdenticalExceptUri(
+    ImportDirective node1,
+    ImportDirective node2,
+  ) {
+    if (node1.prefix?.name != node2.prefix?.name) {
+      return false;
+    }
+
+    bool areSameNames(
+      List<SimpleIdentifier> names1,
+      List<SimpleIdentifier> names2,
+    ) {
+      if (names1.length != names2.length) {
+        return false;
+      }
+      for (var i = 0; i < names1.length; i++) {
+        if (names1[i].name != names2[i].name) {
+          return false;
+        }
+      }
+      return true;
+    }
+
+    final combinators1 = node1.combinators;
+    final combinators2 = node2.combinators;
+    if (combinators1.length != combinators2.length) {
+      return false;
+    }
+    for (var i = 0; i < combinators1.length; i++) {
+      final combinator1 = combinators1[i];
+      final combinator2 = combinators2[i];
+      if (combinator1 is HideCombinator && combinator2 is HideCombinator) {
+        if (!areSameNames(combinator1.hiddenNames, combinator2.hiddenNames)) {
+          return false;
+        }
+      } else if (combinator1 is ShowCombinator &&
+          combinator2 is ShowCombinator) {
+        if (!areSameNames(combinator1.shownNames, combinator2.shownNames)) {
+          return false;
+        }
+      } else {
+        return false;
+      }
+    }
+
+    return true;
+  }
 }
 
 /// An index expression.
diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart
index c83df2c..0f4d313 100644
--- a/pkg/analyzer/lib/src/dart/element/element.dart
+++ b/pkg/analyzer/lib/src/dart/element/element.dart
@@ -292,13 +292,13 @@
           String methodName, LibraryElement library) =>
       _first(_implementationsOfMethod(methodName).where(
           (MethodElement method) =>
-              !method.isAbstract && method.isAccessibleIn(library)));
+              !method.isAbstract && method.isAccessibleIn2(library)));
 
   @override
   PropertyAccessorElement? lookUpGetter(
           String getterName, LibraryElement library) =>
       _first(_implementationsOfGetter(getterName).where(
-          (PropertyAccessorElement getter) => getter.isAccessibleIn(library)));
+          (PropertyAccessorElement getter) => getter.isAccessibleIn2(library)));
 
   @override
   PropertyAccessorElement? lookUpInheritedConcreteGetter(
@@ -307,7 +307,7 @@
           (PropertyAccessorElement getter) =>
               !getter.isAbstract &&
               !getter.isStatic &&
-              getter.isAccessibleIn(library) &&
+              getter.isAccessibleIn2(library) &&
               getter.enclosingElement != this));
 
   ExecutableElement? lookUpInheritedConcreteMember(
@@ -327,7 +327,7 @@
           (MethodElement method) =>
               !method.isAbstract &&
               !method.isStatic &&
-              method.isAccessibleIn(library) &&
+              method.isAccessibleIn2(library) &&
               method.enclosingElement != this));
 
   @override
@@ -337,7 +337,7 @@
           (PropertyAccessorElement setter) =>
               !setter.isAbstract &&
               !setter.isStatic &&
-              setter.isAccessibleIn(library) &&
+              setter.isAccessibleIn2(library) &&
               setter.enclosingElement != this));
 
   @override
@@ -346,19 +346,19 @@
       _first(_implementationsOfMethod(methodName).where(
           (MethodElement method) =>
               !method.isStatic &&
-              method.isAccessibleIn(library) &&
+              method.isAccessibleIn2(library) &&
               method.enclosingElement != this));
 
   @override
   MethodElement? lookUpMethod(String methodName, LibraryElement library) =>
       _first(_implementationsOfMethod(methodName)
-          .where((MethodElement method) => method.isAccessibleIn(library)));
+          .where((MethodElement method) => method.isAccessibleIn2(library)));
 
   @override
   PropertyAccessorElement? lookUpSetter(
           String setterName, LibraryElement library) =>
       _first(_implementationsOfSetter(setterName).where(
-          (PropertyAccessorElement setter) => setter.isAccessibleIn(library)));
+          (PropertyAccessorElement setter) => setter.isAccessibleIn2(library)));
 
   /// Return the static getter with the [name], accessible to the [library].
   ///
@@ -368,7 +368,7 @@
   PropertyAccessorElement? lookupStaticGetter(
       String name, LibraryElement library) {
     return _first(_implementationsOfGetter(name).where((element) {
-      return element.isStatic && element.isAccessibleIn(library);
+      return element.isStatic && element.isAccessibleIn2(library);
     }));
   }
 
@@ -379,7 +379,7 @@
   /// or a superclass.
   MethodElement? lookupStaticMethod(String name, LibraryElement library) {
     return _first(_implementationsOfMethod(name).where((element) {
-      return element.isStatic && element.isAccessibleIn(library);
+      return element.isStatic && element.isAccessibleIn2(library);
     }));
   }
 
@@ -391,7 +391,7 @@
   PropertyAccessorElement? lookupStaticSetter(
       String name, LibraryElement library) {
     return _first(_implementationsOfSetter(name).where((element) {
-      return element.isStatic && element.isAccessibleIn(library);
+      return element.isStatic && element.isAccessibleIn2(library);
     }));
   }
 
@@ -883,7 +883,7 @@
     if (!superElement.isMixinApplication) {
       final library = this.library;
       constructorsToForward = superElement.constructors
-          .where((constructor) => constructor.isAccessibleIn(library))
+          .where((constructor) => constructor.isAccessibleIn2(library))
           .where((constructor) => !constructor.isFactory);
     } else {
       if (visitedClasses == null) {
@@ -2485,6 +2485,7 @@
   bool hasModifier(Modifier modifier) =>
       BooleanArray.get(_modifiers, modifier.ordinal);
 
+  @Deprecated('Use isAccessibleIn2() instead')
   @override
   bool isAccessibleIn(LibraryElement? library) {
     if (Identifier.isPrivateName(name!)) {
@@ -2493,6 +2494,14 @@
     return true;
   }
 
+  @override
+  bool isAccessibleIn2(LibraryElement library) {
+    if (Identifier.isPrivateName(name!)) {
+      return library == this.library;
+    }
+    return true;
+  }
+
   /// Use the given [visitor] to visit all of the [children] in the given array.
   void safelyVisitChildren(List<Element> children, ElementVisitor visitor) {
     for (Element child in children) {
@@ -4710,6 +4719,7 @@
     return displayName;
   }
 
+  @Deprecated('Use isAccessibleIn2() instead')
   @override
   bool isAccessibleIn(LibraryElement? library) {
     for (Element element in conflictingElements) {
@@ -4721,6 +4731,16 @@
   }
 
   @override
+  bool isAccessibleIn2(LibraryElement library) {
+    for (Element element in conflictingElements) {
+      if (element.isAccessibleIn2(library)) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  @override
   E? thisOrAncestorMatching<E extends Element>(
     bool Function(Element) predicate,
   ) {
diff --git a/pkg/analyzer/lib/src/dart/element/member.dart b/pkg/analyzer/lib/src/dart/element/member.dart
index 19aa560..679555e 100644
--- a/pkg/analyzer/lib/src/dart/element/member.dart
+++ b/pkg/analyzer/lib/src/dart/element/member.dart
@@ -612,10 +612,15 @@
   String getExtendedDisplayName(String? shortName) =>
       _declaration.getExtendedDisplayName(shortName);
 
+  @Deprecated('Use isAccessibleIn2() instead')
   @override
   bool isAccessibleIn(LibraryElement? library) =>
       _declaration.isAccessibleIn(library);
 
+  @override
+  bool isAccessibleIn2(LibraryElement library) =>
+      _declaration.isAccessibleIn2(library);
+
   /// Use the given [visitor] to visit all of the [children].
   void safelyVisitChildren(List<Element> children, ElementVisitor visitor) {
     // TODO(brianwilkerson) Make this private
diff --git a/pkg/analyzer/lib/src/dart/element/type.dart b/pkg/analyzer/lib/src/dart/element/type.dart
index bd1c52f..8070b07 100644
--- a/pkg/analyzer/lib/src/dart/element/type.dart
+++ b/pkg/analyzer/lib/src/dart/element/type.dart
@@ -707,7 +707,7 @@
     }
     // not found or not accessible
     if (constructorElement == null ||
-        !constructorElement.isAccessibleIn(library)) {
+        !constructorElement.isAccessibleIn2(library)) {
       return null;
     }
     // return member
diff --git a/pkg/analyzer/lib/src/dart/micro/library_graph.dart b/pkg/analyzer/lib/src/dart/micro/library_graph.dart
index 0f722d7..f560b03 100644
--- a/pkg/analyzer/lib/src/dart/micro/library_graph.dart
+++ b/pkg/analyzer/lib/src/dart/micro/library_graph.dart
@@ -904,6 +904,7 @@
     UnlinkedLibraryAugmentationDirective? libraryAugmentationDirective;
     UnlinkedPartOfNameDirective? partOfNameDirective;
     UnlinkedPartOfUriDirective? partOfUriDirective;
+    var augmentations = <UnlinkedImportAugmentationDirective>[];
     var exports = <UnlinkedNamespaceDirective>[];
     var imports = <UnlinkedNamespaceDirective>[];
     var parts = <String>[];
@@ -912,11 +913,19 @@
       if (directive is ExportDirective) {
         var builder = _serializeNamespaceDirective(directive);
         exports.add(builder);
-      } else if (directive is ImportDirective) {
-        var builder = _serializeNamespaceDirective(directive);
-        imports.add(builder);
-        if (builder.uri == 'dart:core') {
-          hasDartCoreImport = true;
+      } else if (directive is ImportDirectiveImpl) {
+        if (directive.augmentKeyword != null) {
+          augmentations.add(
+            UnlinkedImportAugmentationDirective(
+              uri: directive.uri.stringValue ?? '',
+            ),
+          );
+        } else {
+          var builder = _serializeNamespaceDirective(directive);
+          imports.add(builder);
+          if (builder.uri == 'dart:core') {
+            hasDartCoreImport = true;
+          }
         }
       } else if (directive is LibraryAugmentationDirective) {
         final uri = directive.uri;
@@ -995,6 +1004,7 @@
 
     var unlinkedUnit = UnlinkedUnit(
       apiSignature: computeUnlinkedApiSignature(unit),
+      augmentations: augmentations,
       exports: exports,
       imports: imports,
       informativeBytes: writeUnitInformative(unit),
diff --git a/pkg/analyzer/lib/src/dart/resolver/function_reference_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/function_reference_resolver.dart
index 0aa5a1e..508dbaa 100644
--- a/pkg/analyzer/lib/src/dart/resolver/function_reference_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/function_reference_resolver.dart
@@ -770,7 +770,7 @@
     }
     element ??= classElement.getGetter(name);
     element ??= classElement.getMethod(name);
-    if (element != null && element.isAccessibleIn(_resolver.definingLibrary)) {
+    if (element != null && element.isAccessibleIn2(_resolver.definingLibrary)) {
       return element;
     }
     return null;
diff --git a/pkg/analyzer/lib/src/dart/resolver/invocation_inference_helper.dart b/pkg/analyzer/lib/src/dart/resolver/invocation_inference_helper.dart
index ee320b5..1c1a643 100644
--- a/pkg/analyzer/lib/src/dart/resolver/invocation_inference_helper.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/invocation_inference_helper.dart
@@ -95,7 +95,8 @@
       } else {
         var name = constructorIdentifier.name;
         rawElement = typeElement.getNamedConstructor(name);
-        if (rawElement != null && !rawElement.isAccessibleIn(definingLibrary)) {
+        if (rawElement != null &&
+            !rawElement.isAccessibleIn2(definingLibrary)) {
           rawElement = null;
         }
       }
diff --git a/pkg/analyzer/lib/src/dart/resolver/method_invocation_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/method_invocation_resolver.dart
index 44f0869..c7169aa 100644
--- a/pkg/analyzer/lib/src/dart/resolver/method_invocation_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/method_invocation_resolver.dart
@@ -351,7 +351,7 @@
     }
     element ??= classElement.getGetter(name);
     element ??= classElement.getMethod(name);
-    if (element != null && element.isAccessibleIn(_definingLibrary)) {
+    if (element != null && element.isAccessibleIn2(_definingLibrary)) {
       return element;
     }
     return null;
diff --git a/pkg/analyzer/lib/src/dart/resolver/property_element_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/property_element_resolver.dart
index 47bfe31..28f5ec9 100644
--- a/pkg/analyzer/lib/src/dart/resolver/property_element_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/property_element_resolver.dart
@@ -326,7 +326,7 @@
   }
 
   bool _isAccessible(ExecutableElement element) {
-    return element.isAccessibleIn(_definingLibrary);
+    return element.isAccessibleIn2(_definingLibrary);
   }
 
   void _reportUnresolvedIndex(
diff --git a/pkg/analyzer/lib/src/error/deprecated_member_use_verifier.dart b/pkg/analyzer/lib/src/error/deprecated_member_use_verifier.dart
index ff183f5..82de45d 100644
--- a/pkg/analyzer/lib/src/error/deprecated_member_use_verifier.dart
+++ b/pkg/analyzer/lib/src/error/deprecated_member_use_verifier.dart
@@ -146,6 +146,10 @@
       return;
     }
 
+    if (element is ParameterElement && element.isRequired) {
+      return;
+    }
+
     var errorNode = node;
     var parent = node.parent;
     if (parent is AssignmentExpression && parent.leftHandSide == node) {
@@ -204,11 +208,7 @@
       _visitParametersAndArguments(
         element.parameters,
         arguments.arguments,
-        (parameter, argument) {
-          if (parameter.isOptional) {
-            _checkForDeprecated(parameter, argument);
-          }
-        },
+        _checkForDeprecated,
       );
     }
   }
diff --git a/pkg/analyzer/lib/src/error/imports_verifier.dart b/pkg/analyzer/lib/src/error/imports_verifier.dart
index 425cb32..52781b7 100644
--- a/pkg/analyzer/lib/src/error/imports_verifier.dart
+++ b/pkg/analyzer/lib/src/error/imports_verifier.dart
@@ -8,6 +8,7 @@
 import 'package:analyzer/dart/ast/visitor.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/error/listener.dart';
+import 'package:analyzer/src/dart/ast/ast.dart';
 import 'package:analyzer/src/dart/resolver/scope.dart';
 import 'package:analyzer/src/error/codes.dart';
 
@@ -254,6 +255,7 @@
       HashMap<NamespaceDirective, List<SimpleIdentifier>>();
 
   void addImports(CompilationUnit node) {
+    final importsWithLibraries = <_ImportDirective>[];
     for (Directive directive in node.directives) {
       if (directive is ImportDirective) {
         var libraryElement = directive.uriElement;
@@ -262,6 +264,12 @@
         }
         _allImports.add(directive);
         _unusedImports.add(directive);
+        importsWithLibraries.add(
+          _ImportDirective(
+            node: directive,
+            importedLibrary: libraryElement,
+          ),
+        );
         //
         // Initialize prefixElementMap
         //
@@ -286,23 +294,27 @@
         _addDuplicateShownHiddenNames(directive);
       }
     }
-    if (_unusedImports.length > 1) {
+    if (importsWithLibraries.length > 1) {
       // order the list of unusedImports to find duplicates in faster than
       // O(n^2) time
-      List<ImportDirective> importDirectiveArray =
-          List<ImportDirective>.from(_unusedImports);
-      importDirectiveArray.sort(ImportDirective.COMPARATOR);
-      ImportDirective currentDirective = importDirectiveArray[0];
-      for (int i = 1; i < importDirectiveArray.length; i++) {
-        ImportDirective nextDirective = importDirectiveArray[i];
-        if (ImportDirective.COMPARATOR(currentDirective, nextDirective) == 0) {
+      importsWithLibraries.sort((import1, import2) {
+        return import1.libraryUriStr.compareTo(import2.libraryUriStr);
+      });
+      var currentDirective = importsWithLibraries[0];
+      for (var i = 1; i < importsWithLibraries.length; i++) {
+        final nextDirective = importsWithLibraries[i];
+        if (currentDirective.libraryUriStr == nextDirective.libraryUriStr &&
+            ImportDirectiveImpl.areSyntacticallyIdenticalExceptUri(
+              currentDirective.node,
+              nextDirective.node,
+            )) {
           // Add either the currentDirective or nextDirective depending on which
           // comes second, this guarantees that the first of the duplicates
           // won't be highlighted.
-          if (currentDirective.offset < nextDirective.offset) {
-            _duplicateImports.add(nextDirective);
+          if (currentDirective.node.offset < nextDirective.node.offset) {
+            _duplicateImports.add(nextDirective.node);
           } else {
-            _duplicateImports.add(currentDirective);
+            _duplicateImports.add(currentDirective.node);
           }
         }
         currentDirective = nextDirective;
@@ -603,6 +615,20 @@
   final Set<ExtensionElement> usedExtensions = {};
 }
 
+/// [ImportDirective] with non-null imported [LibraryElement].
+class _ImportDirective {
+  final ImportDirective node;
+  final LibraryElement importedLibrary;
+
+  _ImportDirective({
+    required this.node,
+    required this.importedLibrary,
+  });
+
+  /// Returns the absolute URI of the imported library.
+  String get libraryUriStr => '${importedLibrary.source.uri}';
+}
+
 /// A class which verifies (and reports) whether any import directives are
 /// unnecessary.
 ///
diff --git a/pkg/analyzer/lib/src/generated/element_resolver.dart b/pkg/analyzer/lib/src/generated/element_resolver.dart
index 93bcdab..9ae6c75 100644
--- a/pkg/analyzer/lib/src/generated/element_resolver.dart
+++ b/pkg/analyzer/lib/src/generated/element_resolver.dart
@@ -341,7 +341,7 @@
     var superName = name?.name;
     var element = superType.lookUpConstructor(superName, _definingLibrary);
     element = _resolver.toLegacyElement(element);
-    if (element == null || !element.isAccessibleIn(_definingLibrary)) {
+    if (element == null || !element.isAccessibleIn2(_definingLibrary)) {
       if (name != null) {
         _errorReporter.reportErrorForNode(
             CompileTimeErrorCode.UNDEFINED_CONSTRUCTOR_IN_INITIALIZER,
diff --git a/pkg/analyzer/lib/src/summary2/default_value_resolver.dart b/pkg/analyzer/lib/src/summary2/default_value_resolver.dart
index 632a6c4..8170e42 100644
--- a/pkg/analyzer/lib/src/summary2/default_value_resolver.dart
+++ b/pkg/analyzer/lib/src/summary2/default_value_resolver.dart
@@ -23,6 +23,7 @@
     for (var unitElement in _libraryElement.units.impl) {
       _UnitContext(unitElement)
         ..forEach(unitElement.classes, _class)
+        ..forEach(unitElement.enums, _class)
         ..forEach(unitElement.extensions, _extension)
         ..forEach(unitElement.functions, _executable)
         ..forEach(unitElement.mixins, _class);
diff --git a/pkg/analyzer/lib/src/summary2/library_builder.dart b/pkg/analyzer/lib/src/summary2/library_builder.dart
index 7594b79..4a1838a 100644
--- a/pkg/analyzer/lib/src/summary2/library_builder.dart
+++ b/pkg/analyzer/lib/src/summary2/library_builder.dart
@@ -333,6 +333,9 @@
       unitElement: unitElement,
     ).buildDeclarationElements(unitNode);
 
+    // We move elements, so they don't have real offsets.
+    unitElement.accept(_FlushElementOffsets());
+
     units.add(
       LinkingUnit(
         isDefiningUnit: false,
diff --git a/pkg/analyzer/lib/src/summary2/top_level_inference.dart b/pkg/analyzer/lib/src/summary2/top_level_inference.dart
index 50db402..5045d1f 100644
--- a/pkg/analyzer/lib/src/summary2/top_level_inference.dart
+++ b/pkg/analyzer/lib/src/summary2/top_level_inference.dart
@@ -180,7 +180,7 @@
       if (superType != null) {
         var index = classElement.constructors.indexOf(_constructor);
         var superConstructors = superType.element.constructors
-            .where((element) => element.isAccessibleIn(classElement.library))
+            .where((element) => element.isAccessibleIn2(classElement.library))
             .toList();
         if (index < superConstructors.length) {
           _baseConstructor = _BaseConstructor(
diff --git a/pkg/analyzer/pubspec.yaml b/pkg/analyzer/pubspec.yaml
index 25c8cda..77c258e 100644
--- a/pkg/analyzer/pubspec.yaml
+++ b/pkg/analyzer/pubspec.yaml
@@ -20,13 +20,16 @@
   watcher: ^1.0.0
   yaml: ^3.0.0
 
+# We use 'any' version constraints here as we get our package versions from
+# the dart-lang/sdk repo's DEPS file. Note that this is a special case; the
+# best practice for packages is to specify their compatible version ranges.
+# See also https://dart.dev/tools/pub/dependencies.
 dev_dependencies:
-  analyzer_utilities:
-    path: ../analyzer_utilities
-  args: ^2.0.0
-  async: ^2.5.0
-  linter: ^1.12.0
-  lints: ^2.0.0
-  matcher: ^0.12.10
-  test: ^1.16.0
-  test_reflective_loader: ^0.2.0
+  analyzer_utilities: any
+  args: any
+  async: any
+  linter: any
+  lints: any
+  matcher: any
+  test: any
+  test_reflective_loader: any
diff --git a/pkg/analyzer/test/dart/sdk/build_sdk_summary_test.dart b/pkg/analyzer/test/dart/sdk/build_sdk_summary_test.dart
new file mode 100644
index 0000000..ea020f8
--- /dev/null
+++ b/pkg/analyzer/test/dart/sdk/build_sdk_summary_test.dart
@@ -0,0 +1,140 @@
+// 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/analysis/results.dart';
+import 'package:analyzer/dart/analysis/session.dart';
+import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/dart/sdk/build_sdk_summary.dart';
+import 'package:analyzer/file_system/file_system.dart';
+import 'package:analyzer/src/dart/analysis/analysis_context_collection.dart';
+import 'package:analyzer/src/test_utilities/mock_sdk.dart';
+import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
+import 'package:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(BuildSdkSummaryTest);
+  });
+}
+
+@reflectiveTest
+class BuildSdkSummaryTest with ResourceProviderMixin {
+  Folder get sdkRoot => getFolder('/sdk');
+
+  test_embedderYamlPath() async {
+    createMockSdk(
+      resourceProvider: resourceProvider,
+      root: sdkRoot,
+    );
+
+    // The idea of the embedder is probably to replace the SDK.
+    // But the current implementation only adds new libraries.
+    final skyEngineLib = getFolder('/home/sky_engine/lib');
+    newFile('${skyEngineLib.path}/core/core.dart', r'''
+class NotObject {}
+''');
+    newFile('${skyEngineLib.path}/ui/ui.dart', r'''
+class Offset {}
+''');
+    final embedderFile = newFile('${skyEngineLib.path}/_embedder.yaml', r'''
+embedded_libs:
+  "dart:core": "core/core.dart"
+  "dart:ui": "ui/ui.dart"
+''');
+
+    final sdkSummaryBytes = await buildSdkSummary2(
+      resourceProvider: resourceProvider,
+      sdkPath: sdkRoot.path,
+      embedderYamlPath: embedderFile.path,
+    );
+
+    // Delete SDK files, to prove that we don't read them later.
+    sdkRoot.delete();
+    skyEngineLib.delete();
+
+    // Write the summary bytes, will be read later.
+    final sdkSummaryFile = getFile('/home/sdk_summary.bytes');
+    sdkSummaryFile.writeAsBytesSync(sdkSummaryBytes);
+
+    // Pub workspace does not support SDK summaries.
+    // So, we use Bazel workspace.
+    const workspacePath = '/workspace';
+    newFile('$workspacePath/WORKSPACE', '');
+    final myPackageRoot = getFolder('$workspacePath/dart/my');
+
+    final collection = AnalysisContextCollectionImpl(
+      includedPaths: [myPackageRoot.path],
+      librarySummaryPaths: [],
+      resourceProvider: resourceProvider,
+      sdkSummaryPath: sdkSummaryFile.path,
+    );
+
+    final analysisContext = collection.contextFor(myPackageRoot.path);
+    final analysisSession = analysisContext.currentSession;
+
+    // We can ask for SDK libraries and classes.
+    // They should be created from the summary bytes.
+    final dartAsync = await analysisSession.getLibrary('dart:async');
+    final dartCore = await analysisSession.getLibrary('dart:core');
+    final dartMath = await analysisSession.getLibrary('dart:math');
+    final dartUi = await analysisSession.getLibrary('dart:ui');
+    expect(dartAsync.getType('Stream'), isNotNull);
+    expect(dartCore.getType('String'), isNotNull);
+    expect(dartMath.getType('Random'), isNotNull);
+    expect(dartUi.getType('Offset'), isNotNull);
+  }
+
+  test_it() async {
+    createMockSdk(
+      resourceProvider: resourceProvider,
+      root: sdkRoot,
+    );
+
+    final sdkSummaryBytes = await buildSdkSummary2(
+      resourceProvider: resourceProvider,
+      sdkPath: sdkRoot.path,
+    );
+
+    // Delete SDK files, to prove that we don't read them later.
+    sdkRoot.delete();
+
+    // Write the summary bytes, will be read later.
+    final sdkSummaryFile = getFile('/home/sdk_summary.bytes');
+    sdkSummaryFile.writeAsBytesSync(sdkSummaryBytes);
+
+    // Pub workspace does not support SDK summaries.
+    // So, we use Bazel workspace.
+    const workspacePath = '/workspace';
+    newFile('$workspacePath/WORKSPACE', '');
+    final myPackageRoot = getFolder('$workspacePath/dart/my');
+
+    final collection = AnalysisContextCollectionImpl(
+      includedPaths: [myPackageRoot.path],
+      librarySummaryPaths: [],
+      resourceProvider: resourceProvider,
+      sdkSummaryPath: sdkSummaryFile.path,
+    );
+
+    final analysisContext = collection.contextFor(myPackageRoot.path);
+    final analysisSession = analysisContext.currentSession;
+
+    // We can ask for SDK libraries and classes.
+    // They should be created from the summary bytes.
+    final dartAsync = await analysisSession.getLibrary('dart:async');
+    final dartCore = await analysisSession.getLibrary('dart:core');
+    final dartMath = await analysisSession.getLibrary('dart:math');
+    expect(dartAsync.getType('Stream'), isNotNull);
+    expect(dartCore.getType('String'), isNotNull);
+    expect(dartMath.getType('Random'), isNotNull);
+  }
+}
+
+extension on AnalysisSession {
+  Future<LibraryElement> getLibrary(String uriStr) async {
+    final libraryResult = await getLibraryByUri(uriStr);
+    libraryResult as LibraryElementResult;
+    return libraryResult.element;
+  }
+}
diff --git a/pkg/analyzer/test/dart/sdk/test_all.dart b/pkg/analyzer/test/dart/sdk/test_all.dart
new file mode 100644
index 0000000..84d512d
--- /dev/null
+++ b/pkg/analyzer/test/dart/sdk/test_all.dart
@@ -0,0 +1,13 @@
+// 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:test_reflective_loader/test_reflective_loader.dart';
+
+import 'build_sdk_summary_test.dart' as build_sdk_summary;
+
+main() {
+  defineReflectiveSuite(() {
+    build_sdk_summary.main();
+  }, name: 'sdk');
+}
diff --git a/pkg/analyzer/test/dart/test_all.dart b/pkg/analyzer/test/dart/test_all.dart
index fb48b99..12db7b3 100644
--- a/pkg/analyzer/test/dart/test_all.dart
+++ b/pkg/analyzer/test/dart/test_all.dart
@@ -7,11 +7,13 @@
 import 'analysis/test_all.dart' as analysis;
 import 'ast/test_all.dart' as ast;
 import 'element/test_all.dart' as element;
+import 'sdk/test_all.dart' as sdk;
 
 main() {
   defineReflectiveSuite(() {
     analysis.main();
     ast.main();
     element.main();
+    sdk.main();
   }, name: 'dart');
 }
diff --git a/pkg/analyzer/test/generated/strong_mode_test.dart b/pkg/analyzer/test/generated/strong_mode_test.dart
index 004ee23..4d1deaf 100644
--- a/pkg/analyzer/test/generated/strong_mode_test.dart
+++ b/pkg/analyzer/test/generated/strong_mode_test.dart
@@ -4096,6 +4096,7 @@
   operator: =
   rightHandSide: IntegerLiteral
     literal: 3
+    parameter: <null>
     staticType: int
   readElement: <null>
   readType: null
diff --git a/pkg/analyzer/test/src/dart/analysis/dependency/base.dart b/pkg/analyzer/test/src/dart/analysis/dependency/base.dart
deleted file mode 100644
index c53ca65..0000000
--- a/pkg/analyzer/test/src/dart/analysis/dependency/base.dart
+++ /dev/null
@@ -1,164 +0,0 @@
-// Copyright (c) 2018, 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/analysis/results.dart';
-import 'package:analyzer/dart/ast/ast.dart';
-import 'package:analyzer/src/dart/analysis/dependency/library_builder.dart';
-import 'package:analyzer/src/dart/analysis/dependency/node.dart';
-import 'package:test/test.dart';
-
-import '../../resolution/context_collection_resolution.dart';
-
-class BaseDependencyTest extends PubPackageResolutionTest {
-  late final String a;
-  late final String b;
-  late final String c;
-  late final Uri aUri;
-  late final Uri bUri;
-  late final Uri cUri;
-
-  bool hasDartCore = false;
-
-  void assertNodes(List<Node> actualNodes, List<ExpectedNode> expectedNodes,
-      {Node? expectedEnclosingClass}) {
-    expect(actualNodes, hasLength(expectedNodes.length));
-    for (var expectedNode in expectedNodes) {
-      var topNode = _getNode(
-        actualNodes,
-        uri: expectedNode.uri,
-        name: expectedNode.name,
-        kind: expectedNode.kind,
-      );
-      expect(topNode.enclosingClass, expectedEnclosingClass);
-
-      if (expectedNode.classMembers != null) {
-        assertNodes(topNode.classMembers!, expectedNode.classMembers!,
-            expectedEnclosingClass: topNode);
-      } else {
-        expect(topNode.classMembers, isNull);
-      }
-
-      if (expectedNode.classTypeParameters != null) {
-        assertNodes(
-          topNode.classTypeParameters!,
-          expectedNode.classTypeParameters!,
-          expectedEnclosingClass: topNode,
-        );
-      } else {
-        expect(topNode.classTypeParameters, isNull);
-      }
-    }
-  }
-
-  Future<Library> buildTestLibrary(String path, String content) async {
-//    if (!hasDartCore) {
-//      hasDartCore = true;
-//      await _addLibraryByUri('dart:core');
-//      await _addLibraryByUri('dart:async');
-//      await _addLibraryByUri('dart:math');
-//      await _addLibraryByUri('dart:_internal');
-//    }
-
-    newFile(path, content);
-
-    var analysisDriver = driverFor(path);
-    analysisDriver.changeFile(path);
-    await analysisDriver.applyPendingFileChanges();
-
-    var units = await _resolveLibrary(path);
-    var uri = units.first.declaredElement!.source.uri;
-
-    return buildLibrary(uri, units);
-
-//    tracker.addLibrary(uri, units);
-//
-//    var library = tracker.libraries[uri];
-//    expect(library, isNotNull);
-//
-//    return library;
-  }
-
-  Node getNode(Library library,
-      {required String name,
-      NodeKind? kind,
-      String? memberOf,
-      String? typeParameterOf}) {
-    var uri = library.uri;
-    var nodes = library.declaredNodes;
-    if (memberOf != null) {
-      var class_ = _getNode(nodes, uri: uri, name: memberOf);
-      expect(
-        class_.kind,
-        anyOf(NodeKind.CLASS, NodeKind.ENUM, NodeKind.MIXIN),
-      );
-      nodes = class_.classMembers!;
-    } else if (typeParameterOf != null) {
-      var class_ = _getNode(nodes, uri: uri, name: typeParameterOf);
-      expect(class_.kind, anyOf(NodeKind.CLASS, NodeKind.MIXIN));
-      nodes = class_.classTypeParameters!;
-    }
-    return _getNode(nodes, uri: uri, name: name, kind: kind);
-  }
-
-  @override
-  void setUp() {
-    super.setUp();
-//    var logger = PerformanceLog(null);
-//    tracker = DependencyTracker(logger);
-    a = convertPath('$testPackageLibPath/a.dart');
-    b = convertPath('$testPackageLibPath/b.dart');
-    c = convertPath('$testPackageLibPath/c.dart');
-    aUri = Uri.parse('package:test/a.dart');
-    bUri = Uri.parse('package:test/b.dart');
-    cUri = Uri.parse('package:test/c.dart');
-  }
-
-//  Future _addLibraryByUri(String uri) async {
-//    var path = driver.sourceFactory.forUri(uri).fullName;
-//    var unitResult = await driver.getUnitElement(path);
-//
-//    var signature = ApiSignature();
-//    signature.addString(unitResult.signature);
-//    var signatureBytes = signature.toByteList();
-//
-//    tracker.addLibraryElement(unitResult.element.library, signatureBytes);
-//  }
-
-  Node _getNode(List<Node> nodes,
-      {required Uri uri, required String name, NodeKind? kind}) {
-    var nameObj = LibraryQualifiedName(uri, name);
-    for (var node in nodes) {
-      if (node.name == nameObj) {
-        if (kind != null && node.kind != kind) {
-          fail('Expected $kind "$name", found ${node.kind}');
-        }
-        return node;
-      }
-    }
-    fail('Expected to find $uri::$name in:\n    ${nodes.join('\n    ')}');
-  }
-
-  Future<List<CompilationUnit>> _resolveLibrary(String libraryPath) async {
-    var session = contextFor(libraryPath).currentSession;
-    var resolvedLibrary = await session.getResolvedLibrary(libraryPath);
-    resolvedLibrary as ResolvedLibraryResult;
-    return resolvedLibrary.units.map((ru) => ru.unit).toList();
-  }
-}
-
-class ExpectedNode {
-  final Uri uri;
-  final String name;
-  final NodeKind kind;
-  final List<ExpectedNode>? classMembers;
-  final List<ExpectedNode>? classTypeParameters;
-
-  ExpectedNode(
-    this.uri,
-    this.name,
-    this.kind, {
-    this.classMembers,
-    this.classTypeParameters,
-  });
-}
diff --git a/pkg/analyzer/test/src/dart/analysis/dependency/declared_nodes_test.dart b/pkg/analyzer/test/src/dart/analysis/dependency/declared_nodes_test.dart
deleted file mode 100644
index c59eefd..0000000
--- a/pkg/analyzer/test/src/dart/analysis/dependency/declared_nodes_test.dart
+++ /dev/null
@@ -1,1795 +0,0 @@
-// Copyright (c) 2018, 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/dart/analysis/dependency/library_builder.dart'
-    hide buildLibrary;
-import 'package:analyzer/src/dart/analysis/dependency/node.dart';
-import 'package:test/test.dart';
-import 'package:test_reflective_loader/test_reflective_loader.dart';
-
-import 'base.dart';
-
-main() {
-  defineReflectiveSuite(() {
-    defineReflectiveTests(DeclaredNodesTest);
-  });
-}
-
-@reflectiveTest
-class DeclaredNodesTest extends BaseDependencyTest {
-  test_api_tokens_include_enclosingClass() async {
-    var library = await buildTestLibrary(a, r'''
-class A {
-  void foo() {}
-}
-
-class B {
-  void foo() {}
-}
-''');
-    _assertDifferentApiTokenSignature(
-      getNode(library, name: 'foo', memberOf: 'A'),
-      getNode(library, name: 'foo', memberOf: 'B'),
-    );
-  }
-
-  test_api_tokens_include_enclosingEnum() async {
-    var library = await buildTestLibrary(a, r'''
-enum A {
-  foo
-}
-
-enum B {
-  foo
-}
-''');
-    _assertDifferentApiTokenSignature(
-      getNode(library, name: 'foo', memberOf: 'A'),
-      getNode(library, name: 'foo', memberOf: 'B'),
-    );
-    _assertDifferentApiTokenSignature(
-      getNode(library, name: 'index', memberOf: 'A'),
-      getNode(library, name: 'index', memberOf: 'B'),
-    );
-    _assertDifferentApiTokenSignature(
-      getNode(library, name: 'values', memberOf: 'A'),
-      getNode(library, name: 'values', memberOf: 'B'),
-    );
-  }
-
-  test_api_tokens_include_enclosingLibrary_class() async {
-    var aLib = await buildTestLibrary(a, 'class C {}');
-    var bLib = await buildTestLibrary(b, 'class C {}');
-    _assertDifferentApiTokenSignature(
-      getNode(aLib, name: 'C'),
-      getNode(bLib, name: 'C'),
-    );
-  }
-
-  test_api_tokens_include_enclosingLibrary_enum() async {
-    var aLib = await buildTestLibrary(a, 'enum Foo {a, b, c}');
-    var bLib = await buildTestLibrary(b, 'enum Foo {a, b, c}');
-    _assertDifferentApiTokenSignature(
-      getNode(aLib, name: 'Foo'),
-      getNode(bLib, name: 'Foo'),
-    );
-  }
-
-  test_api_tokens_include_enclosingLibrary_function() async {
-    var aLib = await buildTestLibrary(a, 'void foo() {}');
-    var bLib = await buildTestLibrary(b, 'void foo() {}');
-    _assertDifferentApiTokenSignature(
-      getNode(aLib, name: 'foo'),
-      getNode(bLib, name: 'foo'),
-    );
-  }
-
-  test_api_tokens_include_functionOrMethod() async {
-    var library = await buildTestLibrary(a, r'''
-void foo() {}
-
-class C {
-  void foo() {}
-}
-''');
-    var fooFunction = getNode(library, name: 'foo');
-    var fooMethod = getNode(library, name: 'foo', memberOf: 'C');
-    expect(
-      fooFunction.api.tokenSignatureHex,
-      isNot(fooMethod.api.tokenSignatureHex),
-    );
-  }
-
-  test_class_constructor() async {
-    var library = await buildTestLibrary(a, r'''
-class C {
-  C();
-  C.named();
-}
-''');
-    assertNodes(library.declaredNodes, [
-      ExpectedNode(
-        aUri,
-        'C',
-        NodeKind.CLASS,
-        classMembers: [
-          ExpectedNode(aUri, '', NodeKind.CONSTRUCTOR),
-          ExpectedNode(aUri, 'named', NodeKind.CONSTRUCTOR),
-        ],
-      ),
-    ]);
-  }
-
-  test_class_constructor_api_tokens_notSame_annotation() async {
-    await _assertApiTokenSignatureNotSame(
-      'foo',
-      NodeKind.CONSTRUCTOR,
-      'class X {  X.foo();  }',
-      'class X {  @deprecated X.foo();  }',
-      memberOf: 'X',
-    );
-  }
-
-  test_class_constructor_api_tokens_notSame_parameter_add() async {
-    await _assertApiTokenSignatureNotSame(
-      'foo',
-      NodeKind.CONSTRUCTOR,
-      'class X {  X.foo();  }',
-      'class X {  X.foo(int a);  }',
-      memberOf: 'X',
-    );
-  }
-
-  test_class_constructor_api_tokens_notSame_parameter_name_edit_named() async {
-    await _assertApiTokenSignatureNotSame(
-      'foo',
-      NodeKind.CONSTRUCTOR,
-      'class X {  X.foo({int a});  }',
-      'class X {  X.foo({int b});  }',
-      memberOf: 'X',
-    );
-  }
-
-  test_class_constructor_api_tokens_notSame_parameter_type() async {
-    await _assertApiTokenSignatureNotSame(
-      'foo',
-      NodeKind.CONSTRUCTOR,
-      'class X {  X.foo(int a);  }',
-      'class X {  X.foo(double a);  }',
-      memberOf: 'X',
-    );
-  }
-
-  test_class_constructor_api_tokens_same_body() async {
-    await _assertApiTokenSignatureSame(
-      'foo',
-      NodeKind.CONSTRUCTOR,
-      'class X {  X.foo() { print(1); }  }',
-      'class X {  X.foo() { print(2); }  }',
-      memberOf: 'X',
-    );
-  }
-
-  test_class_constructor_api_tokens_same_body_add() async {
-    await _assertApiTokenSignatureSame(
-      'foo',
-      NodeKind.CONSTRUCTOR,
-      'class X {  X.foo();  }',
-      'class X {  X.foo() {}  }',
-      memberOf: 'X',
-    );
-  }
-
-  test_class_constructor_api_tokens_same_parameter_name_edit_required() async {
-    await _assertApiTokenSignatureSame(
-      'foo',
-      NodeKind.CONSTRUCTOR,
-      'class X {  X.foo(int a);  }',
-      'class X {  X.foo(int b);  }',
-      memberOf: 'X',
-    );
-  }
-
-  test_class_constructor_default() async {
-    var library = await buildTestLibrary(a, r'''
-class C {}
-''');
-    assertNodes(library.declaredNodes, [
-      ExpectedNode(
-        aUri,
-        'C',
-        NodeKind.CLASS,
-        classMembers: [
-          ExpectedNode(aUri, '', NodeKind.CONSTRUCTOR),
-        ],
-      ),
-    ]);
-  }
-
-  test_class_field() async {
-    var library = await buildTestLibrary(a, r'''
-class C {
-  int a = 1;
-  int b = 2, c = 3;
-}
-''');
-    assertNodes(library.declaredNodes, [
-      ExpectedNode(
-        aUri,
-        'C',
-        NodeKind.CLASS,
-        classMembers: [
-          ExpectedNode(aUri, '', NodeKind.CONSTRUCTOR),
-          ExpectedNode(aUri, 'a', NodeKind.GETTER),
-          ExpectedNode(aUri, 'b', NodeKind.GETTER),
-          ExpectedNode(aUri, 'c', NodeKind.GETTER),
-          ExpectedNode(aUri, 'a=', NodeKind.SETTER),
-          ExpectedNode(aUri, 'b=', NodeKind.SETTER),
-          ExpectedNode(aUri, 'c=', NodeKind.SETTER),
-        ],
-      ),
-    ]);
-  }
-
-  test_class_field_api_tokens_notSame_annotation() async {
-    await _assertApiTokenSignatureNotSame(
-      'foo',
-      NodeKind.GETTER,
-      'class X {  int foo = 0;  }',
-      'class X {  @deprecated int foo = 0;  }',
-      memberOf: 'X',
-    );
-  }
-
-  test_class_field_api_tokens_notSame_const() async {
-    await _assertApiTokenSignatureNotSame(
-      'foo',
-      NodeKind.GETTER,
-      'class X {  int foo = 0;  }',
-      'class X {  const int foo = 0;  }',
-      memberOf: 'X',
-    );
-  }
-
-  test_class_field_api_tokens_same_final() async {
-    await _assertApiTokenSignatureSame(
-      'foo',
-      NodeKind.GETTER,
-      'class X {  int foo = 0;  }',
-      'class X {  final int foo = 0;  }',
-      memberOf: 'X',
-    );
-  }
-
-  test_class_field_api_tokens_typed_notSame_type() async {
-    await _assertApiTokenSignatureNotSame(
-      'foo',
-      NodeKind.GETTER,
-      'class X {  int foo = 0;  }',
-      'class X {  num foo = 1;  }',
-      memberOf: 'X',
-    );
-  }
-
-  test_class_field_api_tokens_typed_same_initializer() async {
-    await _assertApiTokenSignatureSame(
-      'foo',
-      NodeKind.GETTER,
-      'class X {  int foo = 0;  }',
-      'class X {  int foo = 1;  }',
-      memberOf: 'X',
-    );
-  }
-
-  test_class_field_api_tokens_untyped_notSame_initializer() async {
-    await _assertApiTokenSignatureNotSame(
-      'foo',
-      NodeKind.GETTER,
-      'class X {  var foo = 0;  }',
-      'class X {  var foo = 1.0;  }',
-      memberOf: 'X',
-    );
-  }
-
-  test_class_field_const() async {
-    var library = await buildTestLibrary(a, r'''
-class X {
-  const foo = 1;
-  const bar = 2;
-}
-''');
-    assertNodes(library.declaredNodes, [
-      ExpectedNode(
-        aUri,
-        'X',
-        NodeKind.CLASS,
-        classMembers: [
-          ExpectedNode(aUri, '', NodeKind.CONSTRUCTOR),
-          ExpectedNode(aUri, 'foo', NodeKind.GETTER),
-          ExpectedNode(aUri, 'bar', NodeKind.GETTER),
-        ],
-      ),
-    ]);
-  }
-
-  test_class_field_const_api_tokens_typed_notSame_initializer() async {
-    await _assertApiTokenSignatureNotSame(
-      'foo',
-      NodeKind.GETTER,
-      'class X {  const int foo = 0;  }',
-      'class X {  const int foo = 1;  }',
-      memberOf: 'X',
-    );
-  }
-
-  test_class_field_final() async {
-    var library = await buildTestLibrary(a, r'''
-class X {
-  final foo = 1;
-  final bar = 2;
-}
-''');
-    assertNodes(library.declaredNodes, [
-      ExpectedNode(
-        aUri,
-        'X',
-        NodeKind.CLASS,
-        classMembers: [
-          ExpectedNode(aUri, '', NodeKind.CONSTRUCTOR),
-          ExpectedNode(aUri, 'foo', NodeKind.GETTER),
-          ExpectedNode(aUri, 'bar', NodeKind.GETTER),
-        ],
-      ),
-    ]);
-  }
-
-  test_class_field_final_api_tokens_typed_notSame_initializer_constClass() async {
-    await _assertApiTokenSignatureNotSame(
-      'foo',
-      NodeKind.GETTER,
-      'class X {  final int foo = 0;  const X();  }',
-      'class X {  final int foo = 1;  const X();  }',
-      memberOf: 'X',
-    );
-  }
-
-  test_class_field_final_api_tokens_typed_same_initializer() async {
-    await _assertApiTokenSignatureSame(
-      'foo',
-      NodeKind.GETTER,
-      'class X {  final int foo = 0;  }',
-      'class X {  final int foo = 1;  }',
-      memberOf: 'X',
-    );
-  }
-
-  test_class_field_final_api_tokens_untyped_notSame_initializer() async {
-    await _assertApiTokenSignatureNotSame(
-      'foo',
-      NodeKind.GETTER,
-      'class X {  final foo = 0;  }',
-      'class X {  final foo = 1.0;  }',
-      memberOf: 'X',
-    );
-  }
-
-  test_class_getter() async {
-    var library = await buildTestLibrary(a, r'''
-class C {
-  int get foo => 0;
-  int get bar => 0;
-}
-''');
-    assertNodes(library.declaredNodes, [
-      ExpectedNode(
-        aUri,
-        'C',
-        NodeKind.CLASS,
-        classMembers: [
-          ExpectedNode(aUri, '', NodeKind.CONSTRUCTOR),
-          ExpectedNode(aUri, 'foo', NodeKind.GETTER),
-          ExpectedNode(aUri, 'bar', NodeKind.GETTER),
-        ],
-      ),
-    ]);
-  }
-
-  test_class_getter_api_tokens_notSame_returnType() async {
-    await _assertApiTokenSignatureNotSame(
-      'foo',
-      NodeKind.GETTER,
-      'class X {  int get foo => null;  }',
-      'class X {  double get foo => null;  }',
-      memberOf: 'X',
-    );
-  }
-
-  test_class_method() async {
-    var library = await buildTestLibrary(a, r'''
-class C {
-  void foo() {}
-  void bar() {}
-}
-''');
-    assertNodes(library.declaredNodes, [
-      ExpectedNode(
-        aUri,
-        'C',
-        NodeKind.CLASS,
-        classMembers: [
-          ExpectedNode(aUri, '', NodeKind.CONSTRUCTOR),
-          ExpectedNode(aUri, 'foo', NodeKind.METHOD),
-          ExpectedNode(aUri, 'bar', NodeKind.METHOD),
-        ],
-      ),
-    ]);
-  }
-
-  test_class_method_api_tokens_notSame_annotation() async {
-    await _assertApiTokenSignatureNotSame(
-      'foo',
-      NodeKind.METHOD,
-      'class X {  void foo() {}  }',
-      'class X {  @deprecated void foo() {}  }',
-      memberOf: 'X',
-    );
-  }
-
-  test_class_method_api_tokens_notSame_parameter_add() async {
-    await _assertApiTokenSignatureNotSame(
-      'foo',
-      NodeKind.METHOD,
-      'class X {  void foo() {}  }',
-      'class X {  void foo(int a) {}  }',
-      memberOf: 'X',
-    );
-  }
-
-  test_class_method_api_tokens_notSame_parameter_name_edit_named() async {
-    await _assertApiTokenSignatureNotSame(
-      'foo',
-      NodeKind.METHOD,
-      'class X {  void foo({int a}) {}  }',
-      'class X {  void foo({int b}) {}  }',
-      memberOf: 'X',
-    );
-  }
-
-  test_class_method_api_tokens_notSame_parameter_type() async {
-    await _assertApiTokenSignatureNotSame(
-      'foo',
-      NodeKind.METHOD,
-      'class X {  void foo(int a) {}  }',
-      'class X {  void foo(double a) {}  }',
-      memberOf: 'X',
-    );
-  }
-
-  test_class_method_api_tokens_notSame_returnType() async {
-    await _assertApiTokenSignatureNotSame(
-      'foo',
-      NodeKind.METHOD,
-      'class X {  int foo() {}  }',
-      'class X {  double foo() {}  }',
-      memberOf: 'X',
-    );
-  }
-
-  test_class_method_api_tokens_notSame_typeParameter_add() async {
-    await _assertApiTokenSignatureNotSame(
-      'foo',
-      NodeKind.METHOD,
-      'class X {  void foo() {}  }',
-      'class X {  void foo<T>() {}  }',
-      memberOf: 'X',
-    );
-  }
-
-  test_class_method_api_tokens_notSame_typeParameter_bound_add() async {
-    await _assertApiTokenSignatureNotSame(
-      'foo',
-      NodeKind.METHOD,
-      'class X {  void foo<T>() {}  }',
-      'class X {  void foo<T extends num>() {}  }',
-      memberOf: 'X',
-    );
-  }
-
-  test_class_method_api_tokens_same_async_add() async {
-    await _assertApiTokenSignatureSame(
-      'foo',
-      NodeKind.METHOD,
-      'class X {  foo() {}  }',
-      'class X {  foo() async {}  }',
-      memberOf: 'X',
-    );
-  }
-
-  test_class_method_api_tokens_same_body() async {
-    await _assertApiTokenSignatureSame(
-      'foo',
-      NodeKind.METHOD,
-      'class X {  void foo() { print(1); }  }',
-      'class X {  void foo() { print(2); }  }',
-      memberOf: 'X',
-    );
-  }
-
-  test_class_method_api_tokens_same_parameter_name_edit_required() async {
-    await _assertApiTokenSignatureSame(
-      'foo',
-      NodeKind.METHOD,
-      'class X {  void foo(int a) {}  }',
-      'class X {  void foo(int b) {}  }',
-      memberOf: 'X',
-    );
-  }
-
-  test_class_setter() async {
-    var library = await buildTestLibrary(a, r'''
-class C {
-  set foo(_) {}
-  set bar(_) {}
-}
-''');
-    assertNodes(library.declaredNodes, [
-      ExpectedNode(
-        aUri,
-        'C',
-        NodeKind.CLASS,
-        classMembers: [
-          ExpectedNode(aUri, '', NodeKind.CONSTRUCTOR),
-          ExpectedNode(aUri, 'foo', NodeKind.SETTER),
-          ExpectedNode(aUri, 'bar', NodeKind.SETTER),
-        ],
-      ),
-    ]);
-  }
-
-  test_class_setter_api_tokens_notSame_returnType() async {
-    await _assertApiTokenSignatureNotSame(
-      'foo',
-      NodeKind.SETTER,
-      'class X {  set foo(int a) {}  }',
-      'class X {  set foo(double a) {}  }',
-      memberOf: 'X',
-    );
-  }
-
-  test_class_setter_api_tokens_same_parameter_name() async {
-    await _assertApiTokenSignatureSame(
-      'foo',
-      NodeKind.SETTER,
-      'class X {  set foo(int a) {}  }',
-      'class X {  set foo(int b) {}  }',
-      memberOf: 'X',
-    );
-  }
-
-  test_class_typeParameter() async {
-    var library = await buildTestLibrary(a, r'''
-class A<T> {}
-class B<T, U> {}
-''');
-    assertNodes(library.declaredNodes, [
-      ExpectedNode(
-        aUri,
-        'A',
-        NodeKind.CLASS,
-        classMembers: [
-          ExpectedNode(aUri, '', NodeKind.CONSTRUCTOR),
-        ],
-        classTypeParameters: [
-          ExpectedNode(aUri, 'T', NodeKind.TYPE_PARAMETER),
-        ],
-      ),
-      ExpectedNode(
-        aUri,
-        'B',
-        NodeKind.CLASS,
-        classMembers: [
-          ExpectedNode(aUri, '', NodeKind.CONSTRUCTOR),
-        ],
-        classTypeParameters: [
-          ExpectedNode(aUri, 'T', NodeKind.TYPE_PARAMETER),
-          ExpectedNode(aUri, 'U', NodeKind.TYPE_PARAMETER),
-        ],
-      ),
-    ]);
-  }
-
-  test_class_typeParameter_api_tokens_notSame_annotation() async {
-    await _assertApiTokenSignatureNotSame(
-      'T',
-      NodeKind.TYPE_PARAMETER,
-      'class X<T> {}',
-      'class X<@deprecate T> {}',
-      typeParameterOf: 'X',
-    );
-  }
-
-  test_class_typeParameter_api_tokens_notSame_bound_add() async {
-    await _assertApiTokenSignatureNotSame(
-      'T',
-      NodeKind.TYPE_PARAMETER,
-      'class X<T> {}',
-      'class X<T extends num> {}',
-      typeParameterOf: 'X',
-    );
-  }
-
-  test_class_typeParameter_api_tokens_notSame_bound_edit() async {
-    await _assertApiTokenSignatureNotSame(
-      'T',
-      NodeKind.TYPE_PARAMETER,
-      'class X<T extends num> {}',
-      'class X<T extends int> {}',
-      typeParameterOf: 'X',
-    );
-  }
-
-  test_library_export() async {
-    var library = await buildTestLibrary(a, r'''
-export 'dart:math';
-export 'package:aaa/aaa.dart';
-export 'package:bbb/bbb.dart' show b1, b2 hide b3;
-''');
-    _assertExports(library, [
-      Export(Uri.parse('dart:math'), []),
-      Export(Uri.parse('package:aaa/aaa.dart'), []),
-      Export(Uri.parse('package:bbb/bbb.dart'), [
-        Combinator(true, ['b1', 'b2']),
-        Combinator(false, ['b3']),
-      ]),
-    ]);
-  }
-
-  test_library_import() async {
-    var library = await buildTestLibrary(a, r'''
-import 'dart:math';
-import 'package:aaa/aaa.dart';
-import 'package:bbb/bbb.dart' as b;
-import 'package:ccc/ccc.dart' show c1, c2 hide c3;
-''');
-    _assertImports(library, [
-      Import(Uri.parse('dart:math'), null, []),
-      Import(Uri.parse('package:aaa/aaa.dart'), null, []),
-      Import(Uri.parse('package:bbb/bbb.dart'), 'b', []),
-      Import(Uri.parse('package:ccc/ccc.dart'), null, [
-        Combinator(true, ['c1', 'c2']),
-        Combinator(false, ['c3']),
-      ]),
-      Import(Uri.parse('dart:core'), null, []),
-    ]);
-  }
-
-  test_library_import_core_explicit() async {
-    var library = await buildTestLibrary(a, r'''
-import 'dart:core' hide List;
-''');
-    _assertImports(library, [
-      Import(Uri.parse('dart:core'), null, [
-        Combinator(false, ['List']),
-      ]),
-    ]);
-  }
-
-  test_library_import_core_implicit() async {
-    var library = await buildTestLibrary(a, '');
-    _assertImports(library, [
-      Import(Uri.parse('dart:core'), null, []),
-    ]);
-  }
-
-  test_unit_class() async {
-    var library = await buildTestLibrary(a, r'''
-class Foo {}
-class Bar {}
-''');
-    assertNodes(library.declaredNodes, [
-      ExpectedNode(aUri, 'Foo', NodeKind.CLASS, classMembers: [
-        ExpectedNode(aUri, '', NodeKind.CONSTRUCTOR),
-      ]),
-      ExpectedNode(aUri, 'Bar', NodeKind.CLASS, classMembers: [
-        ExpectedNode(aUri, '', NodeKind.CONSTRUCTOR),
-      ]),
-    ]);
-  }
-
-  test_unit_class_api_tokens_notSame_annotation() async {
-    await _assertApiTokenSignatureNotSame(
-      'X',
-      NodeKind.CLASS,
-      'class X {}',
-      '@deprecated class X {}',
-    );
-  }
-
-  test_unit_class_api_tokens_notSame_extends_add() async {
-    await _assertApiTokenSignatureNotSame(
-      'X',
-      NodeKind.CLASS,
-      'class X {}',
-      'class X extends A {}',
-    );
-  }
-
-  test_unit_class_api_tokens_notSame_extends_edit() async {
-    await _assertApiTokenSignatureNotSame(
-      'X',
-      NodeKind.CLASS,
-      'class X extends A {}',
-      'class X extends B {}',
-    );
-  }
-
-  test_unit_class_api_tokens_notSame_extends_replace() async {
-    await _assertApiTokenSignatureNotSame(
-      'X',
-      NodeKind.CLASS,
-      'class X extends A {}',
-      'class X implements A {}',
-    );
-  }
-
-  test_unit_class_api_tokens_notSame_extends_typeArgument() async {
-    await _assertApiTokenSignatureNotSame(
-      'X',
-      NodeKind.CLASS,
-      'class X extends A {}',
-      'class X extends A<int> {}',
-    );
-  }
-
-  test_unit_class_api_tokens_notSame_implements_add() async {
-    await _assertApiTokenSignatureNotSame(
-      'X',
-      NodeKind.CLASS,
-      'class X {}',
-      'class X implements A {}',
-    );
-  }
-
-  test_unit_class_api_tokens_notSame_implements_edit() async {
-    await _assertApiTokenSignatureNotSame(
-      'X',
-      NodeKind.CLASS,
-      'class X implements A {}',
-      'class X implements B {}',
-    );
-  }
-
-  test_unit_class_api_tokens_notSame_implements_remove() async {
-    await _assertApiTokenSignatureNotSame(
-      'X',
-      NodeKind.CLASS,
-      'class X implements A {}',
-      'class X {}',
-    );
-  }
-
-  test_unit_class_api_tokens_notSame_implements_remove2() async {
-    await _assertApiTokenSignatureNotSame(
-      'X',
-      NodeKind.CLASS,
-      'class X implements A, B {}',
-      'class X implements B {}',
-    );
-  }
-
-  test_unit_class_api_tokens_notSame_implements_typeArgument() async {
-    await _assertApiTokenSignatureNotSame(
-      'X',
-      NodeKind.CLASS,
-      'class X implements A {}',
-      'class X implements A<int> {}',
-    );
-  }
-
-  test_unit_class_api_tokens_notSame_typeParameter_add() async {
-    await _assertApiTokenSignatureNotSame(
-      'X',
-      NodeKind.CLASS,
-      'class X {}',
-      'class X<T> {}',
-    );
-  }
-
-  test_unit_class_api_tokens_notSame_typeParameter_add2() async {
-    await _assertApiTokenSignatureNotSame(
-      'X',
-      NodeKind.CLASS,
-      'class X<T> {}',
-      'class X<T, U> {}',
-    );
-  }
-
-  test_unit_class_api_tokens_notSame_typeParameter_bound_add() async {
-    await _assertApiTokenSignatureNotSame(
-      'X',
-      NodeKind.CLASS,
-      'class X<T> {}',
-      'class X<T extends num> {}',
-    );
-  }
-
-  test_unit_class_api_tokens_notSame_with_add() async {
-    await _assertApiTokenSignatureNotSame(
-      'X',
-      NodeKind.CLASS,
-      'class X extends A {}',
-      'class X extends A with B {}',
-    );
-  }
-
-  test_unit_class_api_tokens_notSame_with_edit() async {
-    await _assertApiTokenSignatureNotSame(
-      'X',
-      NodeKind.CLASS,
-      'class X extends A with B {}',
-      'class X extends A with C {}',
-    );
-  }
-
-  test_unit_class_api_tokens_notSame_with_typeArgument() async {
-    await _assertApiTokenSignatureNotSame(
-      'X',
-      NodeKind.CLASS,
-      'class X extends A with B {}',
-      'class X extends A with B<int> {}',
-    );
-  }
-
-  test_unit_class_api_tokens_same_body() async {
-    await _assertApiTokenSignatureSame(
-      'X',
-      NodeKind.CLASS,
-      'class X {  }',
-      'class X { void foo() {} }',
-    );
-  }
-
-  test_unit_classTypeAlias() async {
-    var library = await buildTestLibrary(a, r'''
-class X = Object with M;
-''');
-    assertNodes(library.declaredNodes, [
-      ExpectedNode(aUri, 'X', NodeKind.CLASS_TYPE_ALIAS),
-    ]);
-  }
-
-  test_unit_classTypeAlias_api_tokens_notSame_implements_add() async {
-    await _assertApiTokenSignatureNotSame(
-      'X',
-      NodeKind.CLASS_TYPE_ALIAS,
-      'class X = A with M;',
-      'class X = A with M implements I;',
-    );
-  }
-
-  test_unit_classTypeAlias_api_tokens_notSame_implements_edit() async {
-    await _assertApiTokenSignatureNotSame(
-      'X',
-      NodeKind.CLASS_TYPE_ALIAS,
-      'class X = A with M implements I;',
-      'class X = A with M implements J;',
-    );
-  }
-
-  test_unit_classTypeAlias_api_tokens_notSame_implements_remove() async {
-    await _assertApiTokenSignatureNotSame(
-      'X',
-      NodeKind.CLASS_TYPE_ALIAS,
-      'class X = A with M implements I;',
-      'class X = A with M;',
-    );
-  }
-
-  test_unit_classTypeAlias_api_tokens_notSame_implements_typeArgument() async {
-    await _assertApiTokenSignatureNotSame(
-      'X',
-      NodeKind.CLASS_TYPE_ALIAS,
-      'class X = A with M implements I;',
-      'class X = A with M implements I<int>;',
-    );
-  }
-
-  test_unit_classTypeAlias_api_tokens_notSame_super() async {
-    await _assertApiTokenSignatureNotSame(
-      'X',
-      NodeKind.CLASS_TYPE_ALIAS,
-      'class X = A with M;',
-      'class X = B with M;',
-    );
-  }
-
-  test_unit_classTypeAlias_api_tokens_notSame_super_typeArgument() async {
-    await _assertApiTokenSignatureNotSame(
-      'X',
-      NodeKind.CLASS_TYPE_ALIAS,
-      'class X = A with M;',
-      'class X = A<int> with M;',
-    );
-  }
-
-  test_unit_classTypeAlias_api_tokens_notSame_typeParameter_add() async {
-    await _assertApiTokenSignatureNotSame(
-      'X',
-      NodeKind.CLASS_TYPE_ALIAS,
-      'class X = A with M;',
-      'class X<T> = A with M;',
-    );
-  }
-
-  test_unit_classTypeAlias_api_tokens_notSame_typeParameter_add2() async {
-    await _assertApiTokenSignatureNotSame(
-      'X',
-      NodeKind.CLASS_TYPE_ALIAS,
-      'class X<T> = A with M;',
-      'class X<T, U> = A with M;',
-    );
-  }
-
-  test_unit_classTypeAlias_api_tokens_notSame_typeParameter_bound_add() async {
-    await _assertApiTokenSignatureNotSame(
-      'X',
-      NodeKind.CLASS_TYPE_ALIAS,
-      'class X<T> = A with M;',
-      'class X<T extends num> = A with M;',
-    );
-  }
-
-  test_unit_classTypeAlias_api_tokens_notSame_with_add() async {
-    await _assertApiTokenSignatureNotSame(
-      'X',
-      NodeKind.CLASS_TYPE_ALIAS,
-      'class X = A with M;',
-      'class X = A with M, N;',
-    );
-  }
-
-  test_unit_classTypeAlias_api_tokens_notSame_with_edit() async {
-    await _assertApiTokenSignatureNotSame(
-      'X',
-      NodeKind.CLASS_TYPE_ALIAS,
-      'class X = A with M;',
-      'class X = A with N;',
-    );
-  }
-
-  test_unit_classTypeAlias_api_tokens_notSame_with_typeArgument() async {
-    await _assertApiTokenSignatureNotSame(
-      'X',
-      NodeKind.CLASS_TYPE_ALIAS,
-      'class X = A with M;',
-      'class X = A with M<int>;',
-    );
-  }
-
-  test_unit_enumDeclaration() async {
-    var library = await buildTestLibrary(a, r'''
-enum Foo {a, b, c}
-enum Bar {d, e, f}
-''');
-    assertNodes(library.declaredNodes, [
-      ExpectedNode(
-        aUri,
-        'Foo',
-        NodeKind.ENUM,
-        classMembers: [
-          ExpectedNode(aUri, 'a', NodeKind.GETTER),
-          ExpectedNode(aUri, 'b', NodeKind.GETTER),
-          ExpectedNode(aUri, 'c', NodeKind.GETTER),
-          ExpectedNode(aUri, 'index', NodeKind.GETTER),
-          ExpectedNode(aUri, 'values', NodeKind.GETTER),
-        ],
-      ),
-      ExpectedNode(
-        aUri,
-        'Bar',
-        NodeKind.ENUM,
-        classMembers: [
-          ExpectedNode(aUri, 'd', NodeKind.GETTER),
-          ExpectedNode(aUri, 'e', NodeKind.GETTER),
-          ExpectedNode(aUri, 'f', NodeKind.GETTER),
-          ExpectedNode(aUri, 'index', NodeKind.GETTER),
-          ExpectedNode(aUri, 'values', NodeKind.GETTER),
-        ],
-      ),
-    ]);
-  }
-
-  test_unit_function() async {
-    var library = await buildTestLibrary(a, r'''
-void foo() {}
-void bar() {}
-''');
-    assertNodes(library.declaredNodes, [
-      ExpectedNode(aUri, 'foo', NodeKind.FUNCTION),
-      ExpectedNode(aUri, 'bar', NodeKind.FUNCTION),
-    ]);
-  }
-
-  test_unit_function_api_tokens_notSame_annotation() async {
-    await _assertApiTokenSignatureNotSame(
-      'foo',
-      NodeKind.FUNCTION,
-      'void foo() {}',
-      '@deprecated void foo() {}',
-    );
-  }
-
-  test_unit_function_api_tokens_notSame_parameter_add() async {
-    await _assertApiTokenSignatureNotSame(
-      'foo',
-      NodeKind.FUNCTION,
-      'void foo() {}',
-      'void foo(int a) {}',
-    );
-  }
-
-  test_unit_function_api_tokens_notSame_parameter_name_edit_named() async {
-    await _assertApiTokenSignatureNotSame(
-      'foo',
-      NodeKind.FUNCTION,
-      'void foo({int a}) {}',
-      'void foo({int b}) {}',
-    );
-  }
-
-  test_unit_function_api_tokens_notSame_parameter_type() async {
-    await _assertApiTokenSignatureNotSame(
-      'foo',
-      NodeKind.FUNCTION,
-      'void foo(int a) {}',
-      'void foo(double a) {}',
-    );
-  }
-
-  test_unit_function_api_tokens_notSame_returnType() async {
-    await _assertApiTokenSignatureNotSame(
-      'foo',
-      NodeKind.FUNCTION,
-      'int foo() {}',
-      'num foo() {}',
-    );
-  }
-
-  test_unit_function_api_tokens_notSame_typeParameter_add() async {
-    await _assertApiTokenSignatureNotSame(
-      'foo',
-      NodeKind.FUNCTION,
-      'void foo() {}',
-      'void foo<T>() {}',
-    );
-  }
-
-  test_unit_function_api_tokens_notSame_typeParameter_bound_add() async {
-    await _assertApiTokenSignatureNotSame(
-      'foo',
-      NodeKind.FUNCTION,
-      'void foo<T>() {}',
-      'void foo<T extends num>() {}',
-    );
-  }
-
-  test_unit_function_api_tokens_same_async_add() async {
-    await _assertApiTokenSignatureSame(
-      'foo',
-      NodeKind.FUNCTION,
-      'foo() {}',
-      'foo() async {}',
-    );
-  }
-
-  test_unit_function_api_tokens_same_body() async {
-    await _assertApiTokenSignatureSame(
-      'foo',
-      NodeKind.FUNCTION,
-      'void foo() { print(1); }',
-      'void foo() { print(2); }',
-    );
-  }
-
-  test_unit_function_api_tokens_same_parameter_name_edit_required() async {
-    await _assertApiTokenSignatureSame(
-      'foo',
-      NodeKind.FUNCTION,
-      'void foo(int a) {}',
-      'void foo(int b) {}',
-    );
-  }
-
-  test_unit_function_api_tokens_same_syncStar_add() async {
-    await _assertApiTokenSignatureSame(
-      'foo',
-      NodeKind.FUNCTION,
-      'foo() {}',
-      'foo() sync* {}',
-    );
-  }
-
-  test_unit_functionTypeAlias() async {
-    var library = await buildTestLibrary(a, r'''
-typedef void Foo();
-typedef void Bar();
-''');
-    assertNodes(library.declaredNodes, [
-      ExpectedNode(aUri, 'Foo', NodeKind.FUNCTION_TYPE_ALIAS),
-      ExpectedNode(aUri, 'Bar', NodeKind.FUNCTION_TYPE_ALIAS),
-    ]);
-  }
-
-  test_unit_functionTypeAlias_api_tokens_notSame_annotation() async {
-    await _assertApiTokenSignatureNotSame(
-      'Foo',
-      NodeKind.FUNCTION_TYPE_ALIAS,
-      'typedef void Foo();',
-      '@deprecated typedef void Foo();',
-    );
-  }
-
-  test_unit_functionTypeAlias_api_tokens_notSame_parameter_add() async {
-    await _assertApiTokenSignatureNotSame(
-      'Foo',
-      NodeKind.FUNCTION_TYPE_ALIAS,
-      'typedef void Foo();',
-      'typedef void Foo(int a);',
-    );
-  }
-
-  test_unit_functionTypeAlias_api_tokens_notSame_parameter_name_edit_named() async {
-    await _assertApiTokenSignatureNotSame(
-      'Foo',
-      NodeKind.FUNCTION_TYPE_ALIAS,
-      'typedef void Foo({int a});',
-      'typedef void Foo({int b});',
-    );
-  }
-
-  test_unit_functionTypeAlias_api_tokens_notSame_parameter_type() async {
-    await _assertApiTokenSignatureNotSame(
-      'Foo',
-      NodeKind.FUNCTION_TYPE_ALIAS,
-      'typedef void Foo(int a);',
-      'typedef void Foo(double a);',
-    );
-  }
-
-  test_unit_functionTypeAlias_api_tokens_notSame_returnType() async {
-    await _assertApiTokenSignatureNotSame(
-      'Foo',
-      NodeKind.FUNCTION_TYPE_ALIAS,
-      'typedef int Foo();',
-      'typedef num Foo();',
-    );
-  }
-
-  test_unit_functionTypeAlias_api_tokens_notSame_typeParameter_add() async {
-    await _assertApiTokenSignatureNotSame(
-      'Foo',
-      NodeKind.FUNCTION_TYPE_ALIAS,
-      'typedef void Foo();',
-      'typedef void Foo<T>();',
-    );
-  }
-
-  test_unit_functionTypeAlias_api_tokens_notSame_typeParameter_bound_add() async {
-    await _assertApiTokenSignatureNotSame(
-      'Foo',
-      NodeKind.FUNCTION_TYPE_ALIAS,
-      'typedef void Foo<T>();',
-      'typedef void Foo<T extends num>();',
-    );
-  }
-
-  test_unit_functionTypeAlias_api_tokens_same_comment() async {
-    await _assertApiTokenSignatureSame(
-      'Foo',
-      NodeKind.FUNCTION_TYPE_ALIAS,
-      'typedef int Foo();',
-      '/* text */ typedef int Foo();',
-    );
-  }
-
-  test_unit_functionTypeAlias_api_tokens_same_parameter_name_edit_required() async {
-    await _assertApiTokenSignatureSame(
-      'Foo',
-      NodeKind.FUNCTION_TYPE_ALIAS,
-      'typedef void Foo(int a);',
-      'typedef void Foo(int b);',
-    );
-  }
-
-  test_unit_genericTypeAlias() async {
-    var library = await buildTestLibrary(a, r'''
-typedef Foo = void Function();
-typedef Bar = void Function();
-''');
-    assertNodes(library.declaredNodes, [
-      ExpectedNode(aUri, 'Foo', NodeKind.GENERIC_TYPE_ALIAS),
-      ExpectedNode(aUri, 'Bar', NodeKind.GENERIC_TYPE_ALIAS),
-    ]);
-  }
-
-  test_unit_genericTypeAlias_api_tokens_notSame_annotation() async {
-    await _assertApiTokenSignatureNotSame(
-      'Foo',
-      NodeKind.GENERIC_TYPE_ALIAS,
-      'typedef Foo = void Function();',
-      '@deprecated typedef Foo = void Function();',
-    );
-  }
-
-  test_unit_genericTypeAlias_api_tokens_notSame_parameter_add() async {
-    await _assertApiTokenSignatureNotSame(
-      'Foo',
-      NodeKind.GENERIC_TYPE_ALIAS,
-      'typedef Foo = void Function();',
-      'typedef Foo = void Function(int);',
-    );
-  }
-
-  test_unit_genericTypeAlias_api_tokens_notSame_parameter_kind() async {
-    await _assertApiTokenSignatureNotSame(
-      'Foo',
-      NodeKind.GENERIC_TYPE_ALIAS,
-      'typedef Foo = void Function(int a);',
-      'typedef Foo = void Function([int a]);',
-    );
-  }
-
-  test_unit_genericTypeAlias_api_tokens_notSame_parameter_name_add_positional() async {
-    await _assertApiTokenSignatureNotSame(
-      'Foo',
-      NodeKind.GENERIC_TYPE_ALIAS,
-      'typedef Foo = void Function([int]);',
-      'typedef Foo = void Function([int a]);',
-    );
-  }
-
-  test_unit_genericTypeAlias_api_tokens_notSame_parameter_name_edit_named() async {
-    await _assertApiTokenSignatureNotSame(
-      'Foo',
-      NodeKind.GENERIC_TYPE_ALIAS,
-      'typedef Foo = void Function({int a});',
-      'typedef Foo = void Function({int b});',
-    );
-  }
-
-  test_unit_genericTypeAlias_api_tokens_notSame_parameter_name_edit_positional() async {
-    await _assertApiTokenSignatureNotSame(
-      'Foo',
-      NodeKind.GENERIC_TYPE_ALIAS,
-      'typedef Foo = void Function([int]);',
-      'typedef Foo = void Function([int a]);',
-    );
-  }
-
-  test_unit_genericTypeAlias_api_tokens_notSame_returnType() async {
-    await _assertApiTokenSignatureNotSame(
-      'Foo',
-      NodeKind.GENERIC_TYPE_ALIAS,
-      'typedef Foo = int Function();',
-      'typedef Foo = double Function();',
-    );
-  }
-
-  test_unit_genericTypeAlias_api_tokens_notSame_typeParameter2_add() async {
-    await _assertApiTokenSignatureNotSame(
-      'Foo',
-      NodeKind.GENERIC_TYPE_ALIAS,
-      'typedef Foo = void Function();',
-      'typedef Foo = void Function<T>();',
-    );
-  }
-
-  test_unit_genericTypeAlias_api_tokens_notSame_typeParameter2_bound_add() async {
-    await _assertApiTokenSignatureNotSame(
-      'Foo',
-      NodeKind.GENERIC_TYPE_ALIAS,
-      'typedef Foo = void Function<T>();',
-      'typedef Foo = void Function<T extends num>();',
-    );
-  }
-
-  test_unit_genericTypeAlias_api_tokens_notSame_typeParameter_add() async {
-    await _assertApiTokenSignatureNotSame(
-      'Foo',
-      NodeKind.GENERIC_TYPE_ALIAS,
-      'typedef Foo = void Function();',
-      'typedef Foo<T> = void Function();',
-    );
-  }
-
-  test_unit_genericTypeAlias_api_tokens_notSame_typeParameter_bound_add() async {
-    await _assertApiTokenSignatureNotSame(
-      'Foo',
-      NodeKind.GENERIC_TYPE_ALIAS,
-      'typedef Foo<T> = void Function();',
-      'typedef Foo<T extends num> = void Function();',
-    );
-  }
-
-  test_unit_genericTypeAlias_api_tokens_same_parameter_name_add_required() async {
-    await _assertApiTokenSignatureSame(
-      'Foo',
-      NodeKind.GENERIC_TYPE_ALIAS,
-      'typedef Foo = void Function(int);',
-      'typedef Foo = void Function(int a);',
-    );
-  }
-
-  test_unit_genericTypeAlias_api_tokens_same_parameter_name_edit_required() async {
-    await _assertApiTokenSignatureSame(
-      'Foo',
-      NodeKind.GENERIC_TYPE_ALIAS,
-      'typedef Foo = void Function(int a);',
-      'typedef Foo = void Function(int b);',
-    );
-  }
-
-  test_unit_getter() async {
-    var library = await buildTestLibrary(a, r'''
-int get foo => 0;
-int get bar => 0;
-''');
-    assertNodes(library.declaredNodes, [
-      ExpectedNode(aUri, 'foo', NodeKind.GETTER),
-      ExpectedNode(aUri, 'bar', NodeKind.GETTER),
-    ]);
-  }
-
-  test_unit_getter_api_tokens_notSame_annotation() async {
-    await _assertApiTokenSignatureNotSame(
-      'foo',
-      NodeKind.GETTER,
-      'int get foo => 0;',
-      '@deprecated int get foo => 0;',
-    );
-  }
-
-  test_unit_getter_api_tokens_notSame_returnType() async {
-    await _assertApiTokenSignatureNotSame(
-      'foo',
-      NodeKind.GETTER,
-      'int get foo => 0;',
-      'num get foo => 0;',
-    );
-  }
-
-  test_unit_getter_api_tokens_same_body() async {
-    await _assertApiTokenSignatureSame(
-      'foo',
-      NodeKind.GETTER,
-      'int get foo => 0;',
-      'int get foo => 1;',
-    );
-  }
-
-  test_unit_mixin() async {
-    var library = await buildTestLibrary(a, r'''
-mixin Foo {}
-mixin Bar {}
-''');
-    assertNodes(library.declaredNodes, [
-      ExpectedNode(aUri, 'Foo', NodeKind.MIXIN, classMembers: const []),
-      ExpectedNode(aUri, 'Bar', NodeKind.MIXIN, classMembers: const []),
-    ]);
-  }
-
-  test_unit_mixin_api_tokens_notSame_annotation() async {
-    await _assertApiTokenSignatureNotSame(
-      'X',
-      NodeKind.MIXIN,
-      'mixin X {}',
-      '@deprecated mixin X {}',
-    );
-  }
-
-  test_unit_mixin_api_tokens_notSame_implements_add() async {
-    await _assertApiTokenSignatureNotSame(
-      'X',
-      NodeKind.MIXIN,
-      'mixin X {}',
-      'mixin X implements A {}',
-    );
-  }
-
-  test_unit_mixin_api_tokens_notSame_implements_edit() async {
-    await _assertApiTokenSignatureNotSame(
-      'X',
-      NodeKind.MIXIN,
-      'mixin X implements A {}',
-      'mixin X implements B {}',
-    );
-  }
-
-  test_unit_mixin_api_tokens_notSame_implements_remove() async {
-    await _assertApiTokenSignatureNotSame(
-      'X',
-      NodeKind.MIXIN,
-      'mixin X implements A {}',
-      'mixin X {}',
-    );
-  }
-
-  test_unit_mixin_api_tokens_notSame_implements_remove2() async {
-    await _assertApiTokenSignatureNotSame(
-      'X',
-      NodeKind.MIXIN,
-      'mixin X implements A, B {}',
-      'mixin X implements B {}',
-    );
-  }
-
-  test_unit_mixin_api_tokens_notSame_implements_typeArgument() async {
-    await _assertApiTokenSignatureNotSame(
-      'X',
-      NodeKind.MIXIN,
-      'mixin X implements A {}',
-      'mixin X implements A<int> {}',
-    );
-  }
-
-  test_unit_mixin_api_tokens_notSame_on_add() async {
-    await _assertApiTokenSignatureNotSame(
-      'X',
-      NodeKind.MIXIN,
-      'mixin X {}',
-      'mixin X on A {}',
-    );
-  }
-
-  test_unit_mixin_api_tokens_notSame_on_add2() async {
-    await _assertApiTokenSignatureNotSame(
-      'X',
-      NodeKind.MIXIN,
-      'mixin X on A {}',
-      'mixin X on A, B {}',
-    );
-  }
-
-  test_unit_mixin_api_tokens_notSame_on_edit() async {
-    await _assertApiTokenSignatureNotSame(
-      'X',
-      NodeKind.MIXIN,
-      'mixin X on A {}',
-      'mixin X on B {}',
-    );
-  }
-
-  test_unit_mixin_api_tokens_notSame_on_replace() async {
-    await _assertApiTokenSignatureNotSame(
-      'X',
-      NodeKind.MIXIN,
-      'mixin X on A {}',
-      'mixin X implements A {}',
-    );
-  }
-
-  test_unit_mixin_api_tokens_notSame_on_typeArgument() async {
-    await _assertApiTokenSignatureNotSame(
-      'X',
-      NodeKind.MIXIN,
-      'mixin X on A {}',
-      'mixin X on A<int> {}',
-    );
-  }
-
-  test_unit_mixin_api_tokens_notSame_typeParameter_add() async {
-    await _assertApiTokenSignatureNotSame(
-      'X',
-      NodeKind.MIXIN,
-      'mixin X {}',
-      'mixin X<T> {}',
-    );
-  }
-
-  test_unit_mixin_api_tokens_notSame_typeParameter_add2() async {
-    await _assertApiTokenSignatureNotSame(
-      'X',
-      NodeKind.MIXIN,
-      'mixin X<T> {}',
-      'mixin X<T, U> {}',
-    );
-  }
-
-  test_unit_mixin_api_tokens_notSame_typeParameter_bound_add() async {
-    await _assertApiTokenSignatureNotSame(
-      'X',
-      NodeKind.MIXIN,
-      'mixin X<T> {}',
-      'mixin X<T extends num> {}',
-    );
-  }
-
-  test_unit_mixin_api_tokens_same_body() async {
-    await _assertApiTokenSignatureSame(
-      'X',
-      NodeKind.MIXIN,
-      'mixin X {  }',
-      'mixin X { void foo() {} }',
-    );
-  }
-
-  test_unit_setter() async {
-    var library = await buildTestLibrary(a, r'''
-void set foo(_) {}
-void set bar(_) {}
-''');
-    assertNodes(library.declaredNodes, [
-      ExpectedNode(aUri, 'foo=', NodeKind.SETTER),
-      ExpectedNode(aUri, 'bar=', NodeKind.SETTER),
-    ]);
-  }
-
-  test_unit_setter_api_tokens_notSame_annotation() async {
-    await _assertApiTokenSignatureNotSame(
-      'foo=',
-      NodeKind.SETTER,
-      'set foo(int a) {}',
-      '@deprecated set foo(int a) {}',
-    );
-  }
-
-  test_unit_setter_api_tokens_notSame_parameter_type() async {
-    await _assertApiTokenSignatureNotSame(
-      'foo=',
-      NodeKind.SETTER,
-      'set foo(int a) {}',
-      'set foo(num a) {}',
-    );
-  }
-
-  test_unit_setter_api_tokens_same_body() async {
-    await _assertApiTokenSignatureSame(
-      'foo=',
-      NodeKind.SETTER,
-      'set foo(int a) { print(0); }',
-      'set foo(int a) { print(1); }',
-    );
-  }
-
-  test_unit_variable() async {
-    var library = await buildTestLibrary(a, r'''
-int a = 1;
-int b = 2, c = 3;
-''');
-    assertNodes(library.declaredNodes, [
-      ExpectedNode(aUri, 'a', NodeKind.GETTER),
-      ExpectedNode(aUri, 'b', NodeKind.GETTER),
-      ExpectedNode(aUri, 'c', NodeKind.GETTER),
-      ExpectedNode(aUri, 'a=', NodeKind.SETTER),
-      ExpectedNode(aUri, 'b=', NodeKind.SETTER),
-      ExpectedNode(aUri, 'c=', NodeKind.SETTER),
-    ]);
-  }
-
-  test_unit_variable_api_tokens_notSame_annotation() async {
-    await _assertApiTokenSignatureNotSame(
-      'foo',
-      NodeKind.GETTER,
-      'int foo = 0;',
-      '@deprecated int foo = 0;',
-    );
-  }
-
-  test_unit_variable_api_tokens_notSame_const() async {
-    await _assertApiTokenSignatureNotSame(
-      'foo',
-      NodeKind.GETTER,
-      'int foo = 0;',
-      'const int foo = 0;',
-    );
-  }
-
-  test_unit_variable_api_tokens_same_final() async {
-    await _assertApiTokenSignatureSame(
-      'foo',
-      NodeKind.GETTER,
-      'int foo = 0;',
-      'final int foo = 0;',
-    );
-  }
-
-  test_unit_variable_api_tokens_typed_notSame_type() async {
-    await _assertApiTokenSignatureNotSame(
-      'foo',
-      NodeKind.GETTER,
-      'int foo = 0;',
-      'num foo = 1;',
-    );
-  }
-
-  test_unit_variable_api_tokens_typed_same_initializer() async {
-    await _assertApiTokenSignatureSame(
-      'foo',
-      NodeKind.GETTER,
-      'int foo = 0;',
-      'int foo = 1;',
-    );
-  }
-
-  test_unit_variable_api_tokens_untyped_notSame_initializer() async {
-    await _assertApiTokenSignatureNotSame(
-      'foo',
-      NodeKind.GETTER,
-      'var foo = 0;',
-      'var foo = 1.0;',
-    );
-  }
-
-  test_unit_variable_const() async {
-    var library = await buildTestLibrary(a, r'''
-const foo = 1;
-const bar = 2;
-''');
-    assertNodes(library.declaredNodes, [
-      ExpectedNode(aUri, 'foo', NodeKind.GETTER),
-      ExpectedNode(aUri, 'bar', NodeKind.GETTER),
-    ]);
-  }
-
-  test_unit_variable_const_api_tokens_typed_notSame_initializer() async {
-    await _assertApiTokenSignatureNotSame(
-      'foo',
-      NodeKind.GETTER,
-      'const int foo = 0;',
-      'const int foo = 1;',
-    );
-  }
-
-  test_unit_variable_final() async {
-    var library = await buildTestLibrary(a, r'''
-final foo = 1;
-final bar = 2;
-''');
-    assertNodes(library.declaredNodes, [
-      ExpectedNode(aUri, 'foo', NodeKind.GETTER),
-      ExpectedNode(aUri, 'bar', NodeKind.GETTER),
-    ]);
-  }
-
-  test_unit_variable_final_api_tokens_typed_same_initializer() async {
-    await _assertApiTokenSignatureSame(
-      'foo',
-      NodeKind.GETTER,
-      'final int foo = 0;',
-      'final int foo = 1;',
-    );
-  }
-
-  test_unit_variable_final_api_tokens_untyped_notSame_initializer() async {
-    await _assertApiTokenSignatureNotSame(
-      'foo',
-      NodeKind.GETTER,
-      'final foo = 0;',
-      'final foo = 1.0;',
-    );
-  }
-
-  test_unit_variable_final_withoutValue() async {
-    var library = await buildTestLibrary(a, r'''
-final foo;
-final bar;
-''');
-    assertNodes(library.declaredNodes, [
-      ExpectedNode(aUri, 'foo', NodeKind.GETTER),
-      ExpectedNode(aUri, 'bar', NodeKind.GETTER),
-    ]);
-  }
-
-  Future<void> _assertApiTokenSignatureNotSame(
-      String name, NodeKind kind, String codeBefore, String codeAfter,
-      {String? memberOf, String? typeParameterOf}) async {
-    Node getNodeLocal(Library library) {
-      return getNode(
-        library,
-        name: name,
-        kind: kind,
-        memberOf: memberOf,
-        typeParameterOf: typeParameterOf,
-      );
-    }
-
-    var libraryBefore = await buildTestLibrary(a, codeBefore);
-    var nodeBefore = getNodeLocal(libraryBefore);
-
-    var libraryAfter = await buildTestLibrary(a, codeAfter);
-    var nodeAfter = getNodeLocal(libraryAfter);
-
-    expect(
-      nodeAfter.api.tokenSignatureHex,
-      isNot(nodeBefore.api.tokenSignatureHex),
-    );
-  }
-
-  Future<void> _assertApiTokenSignatureSame(
-      String name, NodeKind kind, String codeBefore, String codeAfter,
-      {String? memberOf, String? typeParameterOf}) async {
-    Node getNodeLocal(Library library) {
-      return getNode(
-        library,
-        name: name,
-        kind: kind,
-        memberOf: memberOf,
-        typeParameterOf: typeParameterOf,
-      );
-    }
-
-    var libraryBefore = await buildTestLibrary(a, codeBefore);
-    var nodeBefore = getNodeLocal(libraryBefore);
-
-    var libraryAfter = await buildTestLibrary(a, codeAfter);
-    var nodeAfter = getNodeLocal(libraryAfter);
-
-    expect(
-      nodeAfter.api.tokenSignatureHex,
-      nodeBefore.api.tokenSignatureHex,
-    );
-  }
-
-  static _assertDifferentApiTokenSignature(Node a, Node b) {
-    expect(
-      a.api.tokenSignatureHex,
-      isNot(b.api.tokenSignatureHex),
-    );
-  }
-
-  static void _assertExports(Library library, List<Export> expectedExports) {
-    var actualExports = library.exports;
-    expect(actualExports, hasLength(expectedExports.length));
-    for (var i = 0; i < actualExports.length; ++i) {
-      var actual = actualExports[i];
-      var expected = expectedExports[i];
-      if (actual.uri != expected.uri ||
-          !_equalCombinators(actual.combinators, expected.combinators)) {
-        fail('Expected: $expected\nActual: $actual');
-      }
-    }
-  }
-
-  static void _assertImports(Library library, List<Import> expectedImports) {
-    var actualImports = library.imports;
-    expect(actualImports, hasLength(expectedImports.length));
-    for (var i = 0; i < actualImports.length; ++i) {
-      var actual = actualImports[i];
-      var expected = expectedImports[i];
-      if (actual.uri != expected.uri ||
-          actual.prefix != expected.prefix ||
-          !_equalCombinators(actual.combinators, expected.combinators)) {
-        fail('Expected: $expected\nActual: $actual');
-      }
-    }
-  }
-
-  static bool _equalCombinators(List<Combinator> actualCombinators,
-      List<Combinator> expectedCombinators) {
-    if (actualCombinators.length != expectedCombinators.length) {
-      return false;
-    }
-
-    for (var i = 0; i < actualCombinators.length; i++) {
-      var actualCombinator = actualCombinators[i];
-      var expectedCombinator = expectedCombinators[i];
-      if (actualCombinator.isShow != expectedCombinator.isShow) {
-        return false;
-      }
-
-      var actualNames = actualCombinator.names;
-      var expectedNames = expectedCombinator.names;
-      if (actualNames.length != expectedNames.length) {
-        return false;
-      }
-      for (var j = 0; j < actualNames.length; j++) {
-        if (actualNames[j] != expectedNames[j]) {
-          return false;
-        }
-      }
-    }
-
-    return true;
-  }
-}
diff --git a/pkg/analyzer/test/src/dart/analysis/dependency/reference_collector_test.dart b/pkg/analyzer/test/src/dart/analysis/dependency/reference_collector_test.dart
deleted file mode 100644
index a705db6..0000000
--- a/pkg/analyzer/test/src/dart/analysis/dependency/reference_collector_test.dart
+++ /dev/null
@@ -1,2336 +0,0 @@
-// Copyright (c) 2018, 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/dart/analysis/dependency/library_builder.dart'
-    hide buildLibrary;
-import 'package:analyzer/src/dart/analysis/dependency/node.dart';
-import 'package:test/test.dart';
-import 'package:test_reflective_loader/test_reflective_loader.dart';
-
-import 'base.dart';
-
-main() {
-  defineReflectiveSuite(() {
-    defineReflectiveTests(ApiReferenceCollectorTest);
-    defineReflectiveTests(ExpressionReferenceCollectorTest);
-    defineReflectiveTests(ImplReferenceCollectorTest);
-    defineReflectiveTests(ShadowReferenceCollectorTest);
-    defineReflectiveTests(StatementReferenceCollectorTest);
-    defineReflectiveTests(TypeReferenceCollectorTest);
-  });
-}
-
-final dartCoreUri = Uri.parse('dart:core');
-
-@reflectiveTest
-class ApiReferenceCollectorTest extends _Base {
-  test_class_constructor_named_body() async {
-    var library = await buildTestLibrary(a, r'''
-class C {
-  C.test() {
-    x;
-  }
-}
-''');
-    _assertApi(library, 'test', NodeKind.CONSTRUCTOR, memberOf: 'C');
-  }
-
-  test_class_constructor_named_parameter_defaultValue_named() async {
-    var library = await buildTestLibrary(a, r'''
-class C {
-  C.test({A a = x}) {}
-}
-''');
-    _assertApi(library, 'test', NodeKind.CONSTRUCTOR,
-        memberOf: 'C', unprefixed: ['A']);
-  }
-
-  test_class_constructor_named_parameter_defaultValue_positional() async {
-    var library = await buildTestLibrary(a, r'''
-class C {
-  C.test([A a = x]) {}
-}
-''');
-    _assertApi(library, 'test', NodeKind.CONSTRUCTOR,
-        memberOf: 'C', unprefixed: ['A']);
-  }
-
-  test_class_constructor_named_parameter_field_named() async {
-    var library = await buildTestLibrary(a, r'''
-class C {
-  A f1;
-  B f2;
-  C.test({A this.f1: x, this.f2: y});
-}
-''');
-    _assertApi(library, 'test', NodeKind.CONSTRUCTOR,
-        memberOf: 'C', unprefixed: ['A']);
-  }
-
-  test_class_constructor_named_parameter_field_required() async {
-    var library = await buildTestLibrary(a, r'''
-class C {
-  A f1;
-  B f2;
-  C.test(A this.f1, this.f2);
-}
-''');
-    _assertApi(library, 'test', NodeKind.CONSTRUCTOR,
-        memberOf: 'C', unprefixed: ['A']);
-  }
-
-  test_class_constructor_named_parameter_required() async {
-    var library = await buildTestLibrary(a, r'''
-class C {
-  C.test(A a, B b) {}
-}
-''');
-    _assertApi(library, 'test', NodeKind.CONSTRUCTOR,
-        memberOf: 'C', unprefixed: ['A', 'B']);
-  }
-
-  test_class_constructor_unnamed_body() async {
-    var library = await buildTestLibrary(a, r'''
-class C {
-  C() {
-    x;
-  }
-}
-''');
-    _assertApi(library, '', NodeKind.CONSTRUCTOR, memberOf: 'C');
-  }
-
-  test_class_constructor_unnamed_parameter_required() async {
-    var library = await buildTestLibrary(a, r'''
-class C {
-  C(A a, B b) {}
-}
-''');
-    _assertApi(library, '', NodeKind.CONSTRUCTOR,
-        memberOf: 'C', unprefixed: ['A', 'B']);
-  }
-
-  test_class_field_hasType() async {
-    var library = await buildTestLibrary(a, r'''
-class C {
-  int test = x;
-}
-''');
-    _assertApi(library, 'test', NodeKind.GETTER,
-        memberOf: 'C', unprefixed: ['int']);
-    _assertApi(library, 'test=', NodeKind.SETTER,
-        memberOf: 'C', unprefixed: ['int']);
-  }
-
-  test_class_field_hasType_const() async {
-    var library = await buildTestLibrary(a, r'''
-class C {
-  static const int test = x;
-}
-''');
-    _assertApi(library, 'test', NodeKind.GETTER,
-        memberOf: 'C', unprefixed: ['int', 'x']);
-  }
-
-  test_class_field_hasType_final() async {
-    var library = await buildTestLibrary(a, r'''
-class C {
-  final int test = x;
-}
-''');
-    _assertApi(library, 'test', NodeKind.GETTER,
-        memberOf: 'C', unprefixed: ['int']);
-  }
-
-  test_class_field_hasType_noInitializer() async {
-    var library = await buildTestLibrary(a, r'''
-class C {
-  int test;
-}
-''');
-    _assertApi(library, 'test', NodeKind.GETTER,
-        memberOf: 'C', unprefixed: ['int']);
-    _assertApi(library, 'test=', NodeKind.SETTER,
-        memberOf: 'C', unprefixed: ['int']);
-  }
-
-  test_class_field_noType() async {
-    var library = await buildTestLibrary(a, r'''
-class C {
-  var test = x;
-}
-''');
-    _assertApi(library, 'test', NodeKind.GETTER,
-        memberOf: 'C', unprefixed: ['x']);
-    _assertApi(library, 'test=', NodeKind.SETTER,
-        memberOf: 'C', unprefixed: ['x']);
-  }
-
-  test_class_field_noType_const() async {
-    var library = await buildTestLibrary(a, r'''
-class C {
-  static const test = x;
-}
-''');
-    _assertApi(library, 'test', NodeKind.GETTER,
-        memberOf: 'C', unprefixed: ['x']);
-  }
-
-  test_class_field_noType_final() async {
-    var library = await buildTestLibrary(a, r'''
-class C {
-  final test = x;
-}
-''');
-    _assertApi(library, 'test', NodeKind.GETTER,
-        memberOf: 'C', unprefixed: ['x']);
-  }
-
-  test_class_field_noType_noInitializer() async {
-    var library = await buildTestLibrary(a, r'''
-class C {
-  var test;
-}
-''');
-    _assertApi(library, 'test', NodeKind.GETTER, memberOf: 'C');
-    _assertApi(library, 'test=', NodeKind.SETTER, memberOf: 'C');
-  }
-
-  test_class_method_body() async {
-    var library = await buildTestLibrary(a, r'''
-class C {
-  void test() {
-    x;
-  }
-}
-''');
-    _assertApi(library, 'test', NodeKind.METHOD, memberOf: 'C');
-  }
-
-  test_class_method_parameter_defaultValue_named() async {
-    var library = await buildTestLibrary(a, r'''
-class C {
-  void test({A a = x}) {}
-}
-''');
-    _assertApi(library, 'test', NodeKind.METHOD,
-        memberOf: 'C', unprefixed: ['A']);
-  }
-
-  test_class_method_parameter_defaultValue_positional() async {
-    var library = await buildTestLibrary(a, r'''
-class C {
-  void test([A a = x]) {}
-}
-''');
-    _assertApi(library, 'test', NodeKind.METHOD,
-        memberOf: 'C', unprefixed: ['A']);
-  }
-
-  test_class_method_parameter_required() async {
-    var library = await buildTestLibrary(a, r'''
-class C {
-  void test(A a, B b) {}
-}
-''');
-    _assertApi(library, 'test', NodeKind.METHOD,
-        memberOf: 'C', unprefixed: ['A', 'B']);
-  }
-
-  test_class_method_returnType() async {
-    var library = await buildTestLibrary(a, r'''
-class C {
-  A test() {}
-}
-''');
-    _assertApi(library, 'test', NodeKind.METHOD,
-        memberOf: 'C', unprefixed: ['A']);
-  }
-
-  test_class_method_typeParameter() async {
-    var library = await buildTestLibrary(a, r'''
-class C {
-  void test<T, U extends A, V extends U>(T t, U u, V v) {}
-}
-''');
-    _assertApi(library, 'test', NodeKind.METHOD,
-        memberOf: 'C', unprefixed: ['A']);
-  }
-
-  test_class_typeParameter() async {
-    var library = await buildTestLibrary(a, r'''
-class X<T extends A<B, C>> {}
-''');
-    _assertApi(library, 'T', NodeKind.TYPE_PARAMETER,
-        typeParameterOf: 'X', unprefixed: ['A', 'B', 'C']);
-  }
-
-  test_unit_class() async {
-    var library = await buildTestLibrary(a, r'''
-class Test<T extends A, U extends T>
-  extends B<T> with C, D<E, U>
-  implements F<T>, G {
-  void test() {
-    x
-  }
-}
-''');
-    _assertApi(library, 'Test', NodeKind.CLASS,
-        unprefixed: ['A', 'B', 'C', 'D', 'E', 'F', 'G']);
-  }
-
-  test_unit_classTypeAlias() async {
-    var library = await buildTestLibrary(a, r'''
-class Test = A with M1, M2 implements I1, I2;
-''');
-    _assertApi(library, 'Test', NodeKind.CLASS_TYPE_ALIAS,
-        unprefixed: ['A', 'I1', 'I2', 'M1', 'M2']);
-  }
-
-  test_unit_classTypeAlias_generic() async {
-    var library = await buildTestLibrary(a, r'''
-class Test<T extends A, U extends T> = B<T> with C<U, D> implements E<T, F>;
-''');
-    _assertApi(library, 'Test', NodeKind.CLASS_TYPE_ALIAS,
-        unprefixed: ['A', 'B', 'C', 'D', 'E', 'F']);
-  }
-
-  test_unit_function_body() async {
-    var library = await buildTestLibrary(a, r'''
-void test() {
-  x;
-}
-''');
-    _assertApi(library, 'test', NodeKind.FUNCTION);
-  }
-
-  test_unit_function_parameter_defaultValue_named() async {
-    var library = await buildTestLibrary(a, r'''
-void test({a = x}) {}
-''');
-    _assertApi(library, 'test', NodeKind.FUNCTION);
-  }
-
-  test_unit_function_parameter_defaultValue_positional() async {
-    var library = await buildTestLibrary(a, r'''
-void test([a = x]) {}
-''');
-    _assertApi(library, 'test', NodeKind.FUNCTION);
-  }
-
-  test_unit_function_parameter_named() async {
-    var library = await buildTestLibrary(a, r'''
-void test({A a, B b}) {}
-''');
-    _assertApi(library, 'test', NodeKind.FUNCTION, unprefixed: ['A', 'B']);
-  }
-
-  test_unit_function_parameter_positional() async {
-    var library = await buildTestLibrary(a, r'''
-void test([A a, B b]) {}
-''');
-    _assertApi(library, 'test', NodeKind.FUNCTION, unprefixed: ['A', 'B']);
-  }
-
-  test_unit_function_parameter_required() async {
-    var library = await buildTestLibrary(a, r'''
-void test(A a, B b) {}
-''');
-    _assertApi(library, 'test', NodeKind.FUNCTION, unprefixed: ['A', 'B']);
-  }
-
-  test_unit_function_parameter_required_function() async {
-    var library = await buildTestLibrary(a, r'''
-void test(A Function(B) a) {}
-''');
-    _assertApi(library, 'test', NodeKind.FUNCTION, unprefixed: ['A', 'B']);
-  }
-
-  test_unit_function_parameter_required_functionTyped() async {
-    var library = await buildTestLibrary(a, r'''
-void test(A a(B b, C c)) {}
-''');
-    _assertApi(library, 'test', NodeKind.FUNCTION, unprefixed: ['A', 'B', 'C']);
-  }
-
-  test_unit_function_returnType_absent() async {
-    var library = await buildTestLibrary(a, r'''
-test() {}
-''');
-    _assertApi(library, 'test', NodeKind.FUNCTION);
-  }
-
-  test_unit_function_returnType_interface() async {
-    var library = await buildTestLibrary(a, r'''
-A test() {}
-''');
-    _assertApi(library, 'test', NodeKind.FUNCTION, unprefixed: ['A']);
-  }
-
-  test_unit_function_typeParameter() async {
-    var library = await buildTestLibrary(a, r'''
-void test<T, U extends A, V extends U>(T t, U u, V v) {}
-''');
-    _assertApi(library, 'test', NodeKind.FUNCTION, unprefixed: ['A']);
-  }
-
-  test_unit_functionTypeAlias() async {
-    var library = await buildTestLibrary(a, r'''
-typedef A<B, U> Test<T extends C, U extends T>(D d, T t, U u);
-''');
-    _assertApi(library, 'Test', NodeKind.FUNCTION_TYPE_ALIAS,
-        unprefixed: ['A', 'B', 'C', 'D']);
-  }
-
-  test_unit_functionTypeAlias_reverseOrderTypeParameters() async {
-    var library = await buildTestLibrary(a, r'''
-typedef void Test<U extends T, T extends A>();
-''');
-    _assertApi(library, 'Test', NodeKind.FUNCTION_TYPE_ALIAS,
-        unprefixed: ['A']);
-  }
-
-  test_unit_genericTypeAlias_function() async {
-    var library = await buildTestLibrary(a, r'''
-typedef Test<T extends A, U extends T> =
-  B<T, C, V> Function<V extends D, W extends E<F, T, V>>(E, T, U, V, V, W);
-''');
-    _assertApi(library, 'Test', NodeKind.GENERIC_TYPE_ALIAS,
-        unprefixed: ['A', 'B', 'C', 'D', 'E', 'F']);
-  }
-
-  test_unit_genericTypeAlias_function_reverseOrderTypeParameters() async {
-    var library = await buildTestLibrary(a, r'''
-typedef Test<U extends T, T extends A> = Function<W extends V, V extends B>();
-''');
-    _assertApi(library, 'Test', NodeKind.GENERIC_TYPE_ALIAS,
-        unprefixed: ['A', 'B']);
-  }
-
-  test_unit_mixin() async {
-    var library = await buildTestLibrary(a, r'''
-mixin Test<T extends A, U extends T>
-  on B<T>, C, D<E, U>
-  implements F<T>, G {
-  void test() {
-    x
-  }
-}
-''');
-    _assertApi(library, 'Test', NodeKind.MIXIN,
-        unprefixed: ['A', 'B', 'C', 'D', 'E', 'F', 'G']);
-  }
-
-  test_unit_variable_hasType() async {
-    var library = await buildTestLibrary(a, r'''
-int test = x;
-''');
-    _assertApi(library, 'test', NodeKind.GETTER, unprefixed: ['int']);
-    _assertApi(library, 'test=', NodeKind.SETTER, unprefixed: ['int']);
-  }
-
-  test_unit_variable_hasType_const() async {
-    var library = await buildTestLibrary(a, r'''
-const int test = x;
-''');
-    _assertApi(library, 'test', NodeKind.GETTER, unprefixed: ['int', 'x']);
-  }
-
-  test_unit_variable_hasType_final() async {
-    var library = await buildTestLibrary(a, r'''
-final int test = x;
-''');
-    _assertApi(library, 'test', NodeKind.GETTER, unprefixed: ['int']);
-  }
-
-  test_unit_variable_hasType_noInitializer() async {
-    var library = await buildTestLibrary(a, r'''
-int test;
-''');
-    _assertApi(library, 'test', NodeKind.GETTER, unprefixed: ['int']);
-    _assertApi(library, 'test=', NodeKind.SETTER, unprefixed: ['int']);
-  }
-
-  test_unit_variable_noType() async {
-    var library = await buildTestLibrary(a, r'''
-var test = x;
-''');
-    _assertApi(library, 'test', NodeKind.GETTER, unprefixed: ['x']);
-    _assertApi(library, 'test=', NodeKind.SETTER, unprefixed: ['x']);
-  }
-
-  test_unit_variable_noType_const() async {
-    var library = await buildTestLibrary(a, r'''
-const test = x;
-''');
-    _assertApi(library, 'test', NodeKind.GETTER, unprefixed: ['x']);
-  }
-
-  test_unit_variable_noType_final() async {
-    var library = await buildTestLibrary(a, r'''
-final test = x;
-''');
-    _assertApi(library, 'test', NodeKind.GETTER, unprefixed: ['x']);
-  }
-
-  test_unit_variable_noType_noInitializer() async {
-    var library = await buildTestLibrary(a, r'''
-var test;
-''');
-    _assertApi(library, 'test', NodeKind.GETTER);
-    _assertApi(library, 'test=', NodeKind.SETTER);
-  }
-}
-
-@reflectiveTest
-class ExpressionReferenceCollectorTest extends _Base {
-  test_adjacentStrings() async {
-    var library = await buildTestLibrary(a, r'''
-test() {
-  'foo' '$x' 'bar';
-}
-''');
-    _assertImpl(library, 'test', NodeKind.FUNCTION, unprefixed: ['x']);
-  }
-
-  test_asExpression() async {
-    var library = await buildTestLibrary(a, r'''
-test() {
-  x as Y;
-}
-''');
-    _assertImpl(library, 'test', NodeKind.FUNCTION, unprefixed: ['Y', 'x']);
-  }
-
-  test_assignmentExpression() async {
-    var library = await buildTestLibrary(a, r'''
-test() {
-  x = y;
-}
-''');
-    _assertImpl(library, 'test', NodeKind.FUNCTION, unprefixed: ['x=', 'y']);
-  }
-
-  test_assignmentExpression_compound() async {
-    var library = await buildTestLibrary(a, r'''
-class A {
-  operator+(_) {}
-}
-
-class B extends A {}
-
-B x, y;
-
-test() {
-  x += y;
-}
-''');
-    _assertImpl(library, 'test', NodeKind.FUNCTION,
-        unprefixed: ['x', 'x=', 'y'],
-        expectedMembers: [_ExpectedClassMember(aUri, 'B', '+')]);
-  }
-
-  test_assignmentExpression_nullAware() async {
-    var library = await buildTestLibrary(a, r'''
-test() {
-  x ??= y;
-}
-''');
-    _assertImpl(library, 'test', NodeKind.FUNCTION,
-        unprefixed: ['x', 'x=', 'y']);
-  }
-
-  test_awaitExpression() async {
-    var library = await buildTestLibrary(a, r'''
-test() async {
-  await x;
-}
-''');
-    _assertImpl(library, 'test', NodeKind.FUNCTION, unprefixed: ['x']);
-  }
-
-  test_binaryExpression() async {
-    var library = await buildTestLibrary(a, r'''
-class A {
-  operator+(_) {}
-}
-
-class B extends A {}
-
-B x, y;
-
-test() {
-  x + y;
-}
-''');
-    _assertImpl(library, 'test', NodeKind.FUNCTION,
-        unprefixed: ['x', 'y'],
-        expectedMembers: [_ExpectedClassMember(aUri, 'B', '+')]);
-  }
-
-  test_binaryExpression_int() async {
-    var library = await buildTestLibrary(a, r'''
-class A {
-  int operator+(_) {}
-}
-
-A x;
-
-test() {
-  x + 1 + 2;
-}
-''');
-    _assertImpl(library, 'test', NodeKind.FUNCTION, unprefixed: [
-      'x'
-    ], expectedMembers: [
-      _ExpectedClassMember(aUri, 'A', '+'),
-      _ExpectedClassMember(dartCoreUri, 'int', '+'),
-    ]);
-  }
-
-  test_binaryExpression_sort() async {
-    var library = await buildTestLibrary(a, r'''
-class A {
-  operator*(_) {}
-}
-
-class B {
-  operator+(_) {}
-}
-
-A a;
-B b;
-
-test() {
-  (b + 1) + a * 2;
-}
-''');
-    _assertImpl(
-      library,
-      'test',
-      NodeKind.FUNCTION,
-      unprefixed: ['a', 'b'],
-      expectedMembers: [
-        _ExpectedClassMember(aUri, 'A', '*'),
-        _ExpectedClassMember(aUri, 'B', '+'),
-      ],
-    );
-  }
-
-  test_binaryExpression_super() async {
-    var library = await buildTestLibrary(a, r'''
-class A {}
-
-class B extends A {
-  test() {
-    super + x;
-  }
-}
-''');
-    _assertImpl(library, 'test', NodeKind.METHOD,
-        memberOf: 'B', unprefixed: ['x'], superPrefixed: ['+']);
-  }
-
-  test_binaryExpression_super2() async {
-    var library = await buildTestLibrary(a, r'''
-class A {}
-
-class B extends A {
-  test() {
-    super == x;
-  }
-}
-''');
-    _assertImpl(library, 'test', NodeKind.METHOD,
-        memberOf: 'B', unprefixed: ['x'], superPrefixed: ['==']);
-  }
-
-  test_binaryExpression_unique() async {
-    var library = await buildTestLibrary(a, r'''
-class A {
-  A operator+(_) => null;
-}
-
-A x;
-
-test() {
-  x + 1 + 2 + 3;
-}
-''');
-    _assertImpl(library, 'test', NodeKind.FUNCTION,
-        unprefixed: ['x'],
-        expectedMembers: [_ExpectedClassMember(aUri, 'A', '+')]);
-  }
-
-  test_binaryExpression_unresolvedOperator() async {
-    var library = await buildTestLibrary(a, r'''
-class A {}
-
-A x, y;
-
-test() {
-  x + y;
-}
-''');
-    _assertImpl(library, 'test', NodeKind.FUNCTION,
-        unprefixed: ['x', 'y'],
-        expectedMembers: [_ExpectedClassMember(aUri, 'A', '+')]);
-  }
-
-  test_binaryExpression_unresolvedTarget() async {
-    var library = await buildTestLibrary(a, r'''
-test() {
-  x + y;
-}
-''');
-    _assertImpl(library, 'test', NodeKind.FUNCTION, unprefixed: ['x', 'y']);
-  }
-
-  test_booleanLiteral() async {
-    var library = await buildTestLibrary(a, r'''
-test() {
-  true;
-}
-''');
-    _assertImpl(library, 'test', NodeKind.FUNCTION);
-  }
-
-  test_cascadeExpression() async {
-    var library = await buildTestLibrary(a, r'''
-class A {}
-
-A x;
-
-test() {
-  x
-    ..foo(y)
-    ..bar = z;
-}
-''');
-    _assertImpl(library, 'test', NodeKind.FUNCTION, unprefixed: [
-      'x',
-      'y',
-      'z'
-    ], expectedMembers: [
-      _ExpectedClassMember(aUri, 'A', 'bar='),
-      _ExpectedClassMember(aUri, 'A', 'foo'),
-    ]);
-  }
-
-  test_conditionalExpression() async {
-    var library = await buildTestLibrary(a, r'''
-test() {
-  x ? y : z;
-}
-''');
-    _assertImpl(library, 'test', NodeKind.FUNCTION,
-        unprefixed: ['x', 'y', 'z']);
-  }
-
-  test_doubleLiteral() async {
-    var library = await buildTestLibrary(a, r'''
-test() {
-  1.2;
-}
-''');
-    _assertImpl(library, 'test', NodeKind.FUNCTION);
-  }
-
-  test_functionExpression() async {
-    var library = await buildTestLibrary(a, r'''
-test() {
-  <T extends A, U extends T>(B b, C c, T t, U u) {
-    T;
-    U;
-    x;
-  }
-}
-''');
-    _assertImpl(library, 'test', NodeKind.FUNCTION,
-        unprefixed: ['A', 'B', 'C', 'x']);
-  }
-
-  test_functionExpressionInvocation() async {
-    var library = await buildTestLibrary(a, r'''
-test() {
-  (x)<T>(y, z);
-}
-''');
-    _assertImpl(library, 'test', NodeKind.FUNCTION,
-        unprefixed: ['T', 'x', 'y', 'z']);
-  }
-
-  test_indexExpression_get() async {
-    var library = await buildTestLibrary(a, r'''
-class A {}
-
-A x;
-
-test() {
-  x[y];
-}
-''');
-    _assertImpl(library, 'test', NodeKind.FUNCTION,
-        unprefixed: ['x', 'y'],
-        expectedMembers: [_ExpectedClassMember(aUri, 'A', '[]')]);
-  }
-
-  test_indexExpression_getSet() async {
-    var library = await buildTestLibrary(a, r'''
-class A {}
-
-A x;
-
-test() {
-  x[y] += x;
-}
-''');
-    _assertImpl(library, 'test', NodeKind.FUNCTION, unprefixed: [
-      'x',
-      'y'
-    ], expectedMembers: [
-      _ExpectedClassMember(aUri, 'A', '[]'),
-      _ExpectedClassMember(aUri, 'A', '[]=')
-    ]);
-  }
-
-  test_indexExpression_set() async {
-    var library = await buildTestLibrary(a, r'''
-class A {}
-
-A x;
-
-test() {
-  x[y] = x;
-}
-''');
-    _assertImpl(library, 'test', NodeKind.FUNCTION,
-        unprefixed: ['x', 'y'],
-        expectedMembers: [_ExpectedClassMember(aUri, 'A', '[]=')]);
-  }
-
-  test_indexExpression_super_get() async {
-    var library = await buildTestLibrary(a, r'''
-class C {
-  test() {
-    super[x];
-  }
-}
-''');
-    _assertImpl(library, 'test', NodeKind.METHOD,
-        memberOf: 'C', unprefixed: ['x'], superPrefixed: ['[]']);
-  }
-
-  test_indexExpression_super_getSet() async {
-    var library = await buildTestLibrary(a, r'''
-class C {
-  test() {
-    super[x] += y;
-  }
-}
-''');
-    _assertImpl(library, 'test', NodeKind.METHOD,
-        memberOf: 'C', unprefixed: ['x', 'y'], superPrefixed: ['[]', '[]=']);
-  }
-
-  test_indexExpression_super_set() async {
-    var library = await buildTestLibrary(a, r'''
-class C {
-  test() {
-    super[x] = y;
-  }
-}
-''');
-    _assertImpl(library, 'test', NodeKind.METHOD,
-        memberOf: 'C', unprefixed: ['x', 'y'], superPrefixed: ['[]=']);
-  }
-
-  test_indexExpression_unresolvedTarget() async {
-    var library = await buildTestLibrary(a, r'''
-test() {
-  x[y];
-}
-''');
-    _assertImpl(library, 'test', NodeKind.FUNCTION, unprefixed: ['x', 'y']);
-  }
-
-  test_instanceCreationExpression_explicitNew_named() async {
-    var library = await buildTestLibrary(a, r'''
-class A {}
-
-test() {
-  new A<T>.named(x, b: y);
-}
-''');
-    _assertImpl(library, 'test', NodeKind.FUNCTION,
-        unprefixed: ['A', 'T', 'x', 'y'],
-        expectedMembers: [_ExpectedClassMember(aUri, 'A', 'named')]);
-  }
-
-  test_instanceCreationExpression_explicitNew_unnamed() async {
-    var library = await buildTestLibrary(a, r'''
-class A {}
-
-test() {
-  new A<T>(x, b: y);
-}
-''');
-    _assertImpl(library, 'test', NodeKind.FUNCTION,
-        unprefixed: ['A', 'T', 'x', 'y'],
-        expectedMembers: [_ExpectedClassMember(aUri, 'A', '')]);
-  }
-
-  test_instanceCreationExpression_explicitNew_unresolvedClass() async {
-    var library = await buildTestLibrary(a, r'''
-test() {
-  new A<T>.named(x);
-}
-''');
-    _assertImpl(library, 'test', NodeKind.FUNCTION,
-        unprefixed: ['A', 'T', 'x']);
-  }
-
-  test_instanceCreationExpression_implicitNew_named() async {
-    var library = await buildTestLibrary(a, r'''
-class A {}
-
-test() {
-  A<T>.named(x, b: y);
-}
-''');
-    _assertImpl(library, 'test', NodeKind.FUNCTION,
-        unprefixed: ['A', 'T', 'x', 'y'],
-        expectedMembers: [_ExpectedClassMember(aUri, 'A', 'named')]);
-  }
-
-  test_instanceCreationExpression_implicitNew_unnamed() async {
-    var library = await buildTestLibrary(a, r'''
-class A {}
-
-test() {
-  A<T>(x, b: y);
-}
-''');
-    _assertImpl(library, 'test', NodeKind.FUNCTION,
-        unprefixed: ['A', 'T', 'x', 'y'],
-        expectedMembers: [_ExpectedClassMember(aUri, 'A', '')]);
-  }
-
-  test_instanceCreationExpression_implicitNew_unresolvedClass_named() async {
-    var library = await buildTestLibrary(a, r'''
-test() {
-  A<T>.named(x, b: y);
-}
-''');
-    _assertImpl(library, 'test', NodeKind.FUNCTION,
-        unprefixed: ['A', 'T', 'x', 'y']);
-  }
-
-  test_integerLiteral() async {
-    var library = await buildTestLibrary(a, r'''
-test() {
-  0;
-}
-''');
-    _assertImpl(library, 'test', NodeKind.FUNCTION);
-  }
-
-  test_isExpression() async {
-    var library = await buildTestLibrary(a, r'''
-test() {
-  x is Y;
-}
-''');
-    _assertImpl(library, 'test', NodeKind.FUNCTION, unprefixed: ['Y', 'x']);
-  }
-
-  test_listLiteral() async {
-    var library = await buildTestLibrary(a, r'''
-test() {
-  <A>[x, y];
-}
-''');
-    _assertImpl(library, 'test', NodeKind.FUNCTION,
-        unprefixed: ['A', 'x', 'y']);
-  }
-
-  test_mapLiteral() async {
-    var library = await buildTestLibrary(a, r'''
-test() {
-  <A, B>{x: y, v: w};
-}
-''');
-    _assertImpl(library, 'test', NodeKind.FUNCTION,
-        unprefixed: ['A', 'B', 'v', 'w', 'x', 'y']);
-  }
-
-  test_methodInvocation_instance_withoutTarget_function() async {
-    var library = await buildTestLibrary(a, r'''
-void foo(a, {b}) {}
-
-test() {
-  foo(x, b: y);
-}
-''');
-    _assertImpl(library, 'test', NodeKind.FUNCTION,
-        unprefixed: ['foo', 'x', 'y']);
-  }
-
-  test_methodInvocation_instance_withoutTarget_method() async {
-    var library = await buildTestLibrary(a, r'''
-class C {
-  void foo(a, {b}) {}
-
-  test() {
-    foo(x, b: y);
-  }
-}
-''');
-    _assertImpl(library, 'test', NodeKind.METHOD,
-        memberOf: 'C', unprefixed: ['foo', 'x', 'y']);
-  }
-
-  test_methodInvocation_instance_withTarget() async {
-    var library = await buildTestLibrary(a, r'''
-class A {}
-
-A x;
-
-test() {
-  x.foo<T>(y, b: z);
-}
-''');
-    _assertImpl(library, 'test', NodeKind.FUNCTION,
-        unprefixed: ['T', 'x', 'y', 'z'],
-        expectedMembers: [_ExpectedClassMember(aUri, 'A', 'foo')]);
-  }
-
-  test_methodInvocation_instance_withTarget_super() async {
-    var library = await buildTestLibrary(a, r'''
-class A {
-  void foo(a, b) {}
-}
-
-class B extends A {
-  test() {
-    super.foo(x, y);
-  }
-}
-''');
-    _assertImpl(library, 'test', NodeKind.METHOD,
-        memberOf: 'B', unprefixed: ['x', 'y'], superPrefixed: ['foo']);
-  }
-
-  test_methodInvocation_static_withTarget() async {
-    var library = await buildTestLibrary(a, r'''
-class A {}
-
-test() {
-  A.foo<T>(x);
-}
-''');
-    _assertImpl(library, 'test', NodeKind.FUNCTION,
-        unprefixed: ['A', 'T', 'x'],
-        expectedMembers: [_ExpectedClassMember(aUri, 'A', 'foo')]);
-  }
-
-  test_nullLiteral() async {
-    var library = await buildTestLibrary(a, r'''
-test() {
-  null;
-}
-''');
-    _assertImpl(library, 'test', NodeKind.FUNCTION);
-  }
-
-  test_parenthesizedExpression() async {
-    var library = await buildTestLibrary(a, r'''
-test() {
-  ((x));
-}
-''');
-    _assertImpl(library, 'test', NodeKind.FUNCTION, unprefixed: ['x']);
-  }
-
-  test_postfixExpression() async {
-    var library = await buildTestLibrary(a, r'''
-class A {}
-class B extend A {}
-
-B x, y;
-
-test() {
-  x++;
-  y--;
-}
-''');
-    _assertImpl(library, 'test', NodeKind.FUNCTION, unprefixed: [
-      'x',
-      'y'
-    ], expectedMembers: [
-      _ExpectedClassMember(aUri, 'B', '+'),
-      _ExpectedClassMember(aUri, 'B', '-')
-    ]);
-  }
-
-  test_postfixExpression_unresolvedTarget() async {
-    var library = await buildTestLibrary(a, r'''
-test() {
-  x++;
-  y--;
-}
-''');
-    _assertImpl(library, 'test', NodeKind.FUNCTION, unprefixed: ['x', 'y']);
-  }
-
-  test_prefixedIdentifier_importPrefix() async {
-    newFile(b, 'var b = 0;');
-    var library = await buildTestLibrary(a, r'''
-import 'b.dart' as pb;
-
-test() {
-  pb.b;
-}
-''');
-    _assertImpl(library, 'test', NodeKind.FUNCTION, prefixed: {
-      'pb': ['b']
-    });
-  }
-
-  test_prefixedIdentifier_importPrefix_unresolvedIdentifier() async {
-    newFile(b, '');
-    var library = await buildTestLibrary(a, r'''
-import 'b.dart' as pb;
-
-test() {
-  pb.b;
-}
-''');
-    _assertImpl(library, 'test', NodeKind.FUNCTION, prefixed: {
-      'pb': ['b']
-    });
-  }
-
-  test_prefixedIdentifier_interfaceProperty() async {
-    var library = await buildTestLibrary(a, r'''
-class A {
-  int get y => 0;
-}
-
-class B extends A {}
-
-B x;
-test() {
-  x.y;
-}
-''');
-    _assertImpl(library, 'test', NodeKind.FUNCTION,
-        unprefixed: ['x'],
-        expectedMembers: [_ExpectedClassMember(aUri, 'B', 'y')]);
-  }
-
-  test_prefixedIdentifier_static() async {
-    var library = await buildTestLibrary(a, r'''
-class A {}
-
-class B extends A {}
-
-test() {
-  B.x;
-}
-''');
-    _assertImpl(library, 'test', NodeKind.FUNCTION,
-        unprefixed: ['B'],
-        expectedMembers: [_ExpectedClassMember(aUri, 'B', 'x')]);
-  }
-
-  test_prefixedIdentifier_unresolvedPrefix() async {
-    var library = await buildTestLibrary(a, r'''
-test() {
-  x.y;
-}
-''');
-    _assertImpl(library, 'test', NodeKind.FUNCTION, unprefixed: ['x']);
-  }
-
-  test_prefixExpression() async {
-    var library = await buildTestLibrary(a, r'''
-class A {
-  operator-() {}
-}
-
-class B extend A {}
-
-B x;
-
-test() {
-  -x;
-}
-''');
-    _assertImpl(library, 'test', NodeKind.FUNCTION,
-        unprefixed: ['x'],
-        expectedMembers: [_ExpectedClassMember(aUri, 'B', 'unary-')]);
-  }
-
-  test_prefixExpression_unresolvedOperator() async {
-    var library = await buildTestLibrary(a, r'''
-class A {}
-
-A x;
-
-test() {
-  -x;
-}
-''');
-    _assertImpl(library, 'test', NodeKind.FUNCTION,
-        unprefixed: ['x'],
-        expectedMembers: [_ExpectedClassMember(aUri, 'A', 'unary-')]);
-  }
-
-  test_prefixExpression_unresolvedTarget() async {
-    var library = await buildTestLibrary(a, r'''
-test() {
-  -x;
-}
-''');
-    _assertImpl(library, 'test', NodeKind.FUNCTION, unprefixed: ['x']);
-  }
-
-  test_propertyAccess_get() async {
-    var library = await buildTestLibrary(a, r'''
-class A {}
-
-A x;
-
-test() {
-  (x).foo;
-}
-''');
-    _assertImpl(library, 'test', NodeKind.FUNCTION,
-        unprefixed: ['x'],
-        expectedMembers: [_ExpectedClassMember(aUri, 'A', 'foo')]);
-  }
-
-  test_propertyAccess_getSet() async {
-    var library = await buildTestLibrary(a, r'''
-class A {}
-
-A x;
-
-test() {
-  (x).foo += 1;
-}
-''');
-    _assertImpl(library, 'test', NodeKind.FUNCTION, unprefixed: [
-      'x'
-    ], expectedMembers: [
-      _ExpectedClassMember(aUri, 'A', 'foo'),
-      _ExpectedClassMember(aUri, 'A', 'foo='),
-    ]);
-  }
-
-  test_propertyAccess_set() async {
-    var library = await buildTestLibrary(a, r'''
-class A {}
-
-A x;
-
-test() {
-  (x).foo = 1;
-}
-''');
-    _assertImpl(library, 'test', NodeKind.FUNCTION,
-        unprefixed: ['x'],
-        expectedMembers: [_ExpectedClassMember(aUri, 'A', 'foo=')]);
-  }
-
-  test_propertyAccess_super_get() async {
-    var library = await buildTestLibrary(a, r'''
-class C {
-  test() {
-    super.foo;
-  }
-}
-''');
-    _assertImpl(library, 'test', NodeKind.METHOD,
-        memberOf: 'C', superPrefixed: ['foo']);
-  }
-
-  test_propertyAccess_super_getSet() async {
-    var library = await buildTestLibrary(a, r'''
-class C {
-  test() {
-    super.foo += 1;
-  }
-}
-''');
-    _assertImpl(library, 'test', NodeKind.METHOD,
-        memberOf: 'C', superPrefixed: ['foo', 'foo=']);
-  }
-
-  test_propertyAccess_super_set() async {
-    var library = await buildTestLibrary(a, r'''
-class C {
-  test() {
-    super.foo = 1;
-  }
-}
-''');
-    _assertImpl(library, 'test', NodeKind.METHOD,
-        memberOf: 'C', superPrefixed: ['foo=']);
-  }
-
-  test_rethrowExpression() async {
-    var library = await buildTestLibrary(a, r'''
-test() {
-  try {
-  } on A {
-    rethrow;
-  }
-}
-''');
-    _assertImpl(library, 'test', NodeKind.FUNCTION, unprefixed: ['A']);
-  }
-
-  test_setLiteral() async {
-    var library = await buildTestLibrary(a, r'''
-test() {
-  <A>{x, y, z};
-}
-''');
-    _assertImpl(library, 'test', NodeKind.FUNCTION,
-        unprefixed: ['A', 'x', 'y', 'z']);
-  }
-
-  test_simpleIdentifier() async {
-    var library = await buildTestLibrary(a, r'''
-test() {
-  x;
-}
-''');
-    _assertImpl(library, 'test', NodeKind.FUNCTION, unprefixed: ['x']);
-  }
-
-  test_simpleIdentifier_sort() async {
-    var library = await buildTestLibrary(a, r'''
-test() {
-  d; c; a; b; e;
-}
-''');
-    _assertImpl(library, 'test', NodeKind.FUNCTION,
-        unprefixed: ['a', 'b', 'c', 'd', 'e']);
-  }
-
-  test_simpleIdentifier_synthetic() async {
-    var library = await buildTestLibrary(a, r'''
-test() {
-  x +;
-}
-''');
-    _assertImpl(library, 'test', NodeKind.FUNCTION, unprefixed: ['x']);
-  }
-
-  test_simpleIdentifier_unique() async {
-    var library = await buildTestLibrary(a, r'''
-test() {
-  x; x; y; x; y;
-}
-''');
-    _assertImpl(library, 'test', NodeKind.FUNCTION, unprefixed: ['x', 'y']);
-  }
-
-  test_simpleStringLiteral() async {
-    var library = await buildTestLibrary(a, r'''
-test() {
-  '';
-  """""";
-  r"""""";
-}
-''');
-    _assertImpl(library, 'test', NodeKind.FUNCTION);
-  }
-
-  test_stringInterpolation() async {
-    var library = await buildTestLibrary(a, r'''
-test() {
-  '$x ${y}';
-}
-''');
-    _assertImpl(library, 'test', NodeKind.FUNCTION, unprefixed: ['x', 'y']);
-  }
-
-  test_symbolLiteral() async {
-    var library = await buildTestLibrary(a, r'''
-test() {
-  #foo.bar;
-}
-''');
-    _assertImpl(library, 'test', NodeKind.FUNCTION);
-  }
-
-  test_thisExpression() async {
-    var library = await buildTestLibrary(a, r'''
-class C {
-  test() {
-    this;
-  }
-}
-''');
-    _assertImpl(library, 'test', NodeKind.METHOD, memberOf: 'C');
-  }
-
-  test_throwExpression() async {
-    var library = await buildTestLibrary(a, r'''
-test() {
-  throw x;
-}
-''');
-    _assertImpl(library, 'test', NodeKind.FUNCTION, unprefixed: ['x']);
-  }
-}
-
-@reflectiveTest
-class ImplReferenceCollectorTest extends _Base {
-  test_class_constructor() async {
-    var library = await buildTestLibrary(a, r'''
-class C {
-  var f;
-  C.test(A a, {b: x, this.f: y}) {
-    z;
-  }
-}
-''');
-    _assertImpl(library, 'test', NodeKind.CONSTRUCTOR,
-        memberOf: 'C', unprefixed: ['x', 'y', 'z']);
-  }
-
-  test_class_constructor_factoryRedirect_named() async {
-    var library = await buildTestLibrary(a, r'''
-class A {}
-
-class X {
-  factory X.test() = A.named;
-}
-''');
-    _assertImpl(library, 'test', NodeKind.CONSTRUCTOR,
-        memberOf: 'X',
-        unprefixed: ['A'],
-        expectedMembers: [_ExpectedClassMember(aUri, 'A', 'named')]);
-  }
-
-  test_class_constructor_factoryRedirect_named_prefixed() async {
-    newFile(b, 'class A {}');
-
-    var library = await buildTestLibrary(a, r'''
-import 'b.dart' as p;
-
-class X {
-  factory X.test() = p.A.named;
-}
-''');
-    _assertImpl(library, 'test', NodeKind.CONSTRUCTOR,
-        memberOf: 'X',
-        prefixed: {
-          'p': ['A']
-        },
-        expectedMembers: [
-          _ExpectedClassMember(bUri, 'A', 'named')
-        ]);
-  }
-
-  test_class_constructor_factoryRedirect_named_unresolvedTarget() async {
-    var library = await buildTestLibrary(a, r'''
-class X {
-  factory X.test() = A.named;
-}
-''');
-    _assertImpl(library, 'test', NodeKind.CONSTRUCTOR,
-        memberOf: 'X', unprefixed: ['A']);
-  }
-
-  test_class_constructor_factoryRedirect_unnamed() async {
-    var library = await buildTestLibrary(a, r'''
-class A {}
-
-class X {
-  factory X.test() = A;
-}
-''');
-    _assertImpl(library, 'test', NodeKind.CONSTRUCTOR,
-        memberOf: 'X',
-        unprefixed: ['A'],
-        expectedMembers: [_ExpectedClassMember(aUri, 'A', '')]);
-  }
-
-  test_class_constructor_factoryRedirect_unnamed_prefixed() async {
-    newFile(b, 'class A {}');
-
-    var library = await buildTestLibrary(a, r'''
-import 'b.dart' as p;
-
-class X {
-  factory X.test() = p.A;
-}
-''');
-    _assertImpl(library, 'test', NodeKind.CONSTRUCTOR,
-        memberOf: 'X',
-        prefixed: {
-          'p': ['A']
-        },
-        expectedMembers: [
-          _ExpectedClassMember(bUri, 'A', '')
-        ]);
-  }
-
-  test_class_constructor_factoryRedirect_unnamed_unresolvedTarget() async {
-    var library = await buildTestLibrary(a, r'''
-class X {
-  factory X.test() = A;
-}
-''');
-    _assertImpl(library, 'test', NodeKind.CONSTRUCTOR,
-        memberOf: 'X', unprefixed: ['A']);
-  }
-
-  test_class_constructor_initializer_assert() async {
-    var library = await buildTestLibrary(a, r'''
-class C {
-  C.test(a) : assert(a > x, y);
-}
-''');
-    _assertImpl(library, 'test', NodeKind.CONSTRUCTOR,
-        memberOf: 'C', unprefixed: ['x', 'y']);
-  }
-
-  test_class_constructor_initializer_field() async {
-    var library = await buildTestLibrary(a, r'''
-class C {
-  var f;
-
-  C.test() : f = x;
-}
-''');
-    _assertImpl(library, 'test', NodeKind.CONSTRUCTOR,
-        memberOf: 'C', unprefixed: ['x']);
-  }
-
-  test_class_constructor_initializer_super_named() async {
-    var library = await buildTestLibrary(a, r'''
-class A {}
-
-class C extends A {
-  C.test() : super.named(x);
-}
-''');
-    _assertImpl(library, 'test', NodeKind.CONSTRUCTOR,
-        memberOf: 'C',
-        unprefixed: ['A', 'x'],
-        expectedMembers: [_ExpectedClassMember(aUri, 'A', 'named')]);
-  }
-
-  test_class_constructor_initializer_super_named_unresolvedSuper() async {
-    var library = await buildTestLibrary(a, r'''
-class C extends A {
-  C.test() : super.named(x);
-}
-''');
-    _assertImpl(library, 'test', NodeKind.CONSTRUCTOR,
-        memberOf: 'C', unprefixed: ['A', 'x']);
-  }
-
-  test_class_constructor_initializer_super_unnamed() async {
-    var library = await buildTestLibrary(a, r'''
-class A {}
-
-class C extends A {
-  C.test() : super(x);
-}
-''');
-    _assertImpl(library, 'test', NodeKind.CONSTRUCTOR,
-        memberOf: 'C',
-        unprefixed: ['A', 'x'],
-        expectedMembers: [_ExpectedClassMember(aUri, 'A', '')]);
-  }
-
-  test_class_constructor_initializer_super_unnamed_unresolvedSuper() async {
-    var library = await buildTestLibrary(a, r'''
-class C extends A {
-  C.test() : super(x);
-}
-''');
-    _assertImpl(library, 'test', NodeKind.CONSTRUCTOR,
-        memberOf: 'C', unprefixed: ['A', 'x']);
-  }
-
-  test_class_constructor_initializer_this_named() async {
-    var library = await buildTestLibrary(a, r'''
-class C extends A {
-  C.test() : this.named(x);
-
-  C.named(a);
-}
-''');
-    _assertImpl(library, 'test', NodeKind.CONSTRUCTOR,
-        memberOf: 'C', unprefixed: ['x']);
-  }
-
-  test_class_constructor_initializer_this_unnamed() async {
-    var library = await buildTestLibrary(a, r'''
-class C extends A {
-  C.test() : this(x);
-
-  C(a);
-}
-''');
-    _assertImpl(library, 'test', NodeKind.CONSTRUCTOR,
-        memberOf: 'C', unprefixed: ['x']);
-  }
-
-  test_class_method() async {
-    var library = await buildTestLibrary(a, r'''
-class C {
-  void test(A a, {b: x}) {
-    y;
-  }
-}
-''');
-    _assertImpl(library, 'test', NodeKind.METHOD,
-        memberOf: 'C', unprefixed: ['x', 'y']);
-  }
-
-  test_class_typeParameter() async {
-    var library = await buildTestLibrary(a, r'''
-class C<T extends A> {}
-''');
-    _assertImpl(library, 'T', NodeKind.TYPE_PARAMETER, typeParameterOf: 'C');
-  }
-
-  test_classTypeAlias() async {
-    var library = await buildTestLibrary(a, r'''
-class Test = A with B implements C;
-''');
-    _assertImpl(library, 'Test', NodeKind.CLASS_TYPE_ALIAS);
-  }
-
-  test_functionTypeAlias() async {
-    var library = await buildTestLibrary(a, r'''
-typedef A Test<T extends B>(C c, T t);
-''');
-    _assertImpl(library, 'Test', NodeKind.FUNCTION_TYPE_ALIAS);
-  }
-
-  test_unit_class() async {
-    var library = await buildTestLibrary(a, r'''
-class Test<T extends A, U extends T> extends B with C, implements D {
-  void test() {
-    x;
-  }
-}
-''');
-    _assertImpl(library, 'Test', NodeKind.CLASS);
-  }
-
-  test_unit_classTypeAlias() async {
-    var library = await buildTestLibrary(a, r'''
-class Test<T extends V, U extends T> = A<T> with B<U, W>;
-''');
-    _assertImpl(library, 'Test', NodeKind.CLASS_TYPE_ALIAS);
-  }
-
-  test_unit_function() async {
-    var library = await buildTestLibrary(a, r'''
-void test(A a, {b: x}) {
-  y;
-}
-''');
-    _assertImpl(library, 'test', NodeKind.FUNCTION, unprefixed: ['x', 'y']);
-  }
-
-  test_unit_mixin() async {
-    var library = await buildTestLibrary(a, r'''
-mixin Test<T extends A, U extends T> on B<T>, C<D, U> {
-  void test() {
-    x;
-  }
-}
-''');
-    _assertImpl(library, 'Test', NodeKind.MIXIN);
-  }
-
-  test_unit_variable() async {
-    var library = await buildTestLibrary(a, r'''
-int test = x;
-''');
-    _assertImpl(library, 'test', NodeKind.GETTER, unprefixed: ['x']);
-    _assertImpl(library, 'test=', NodeKind.SETTER); // empty
-  }
-
-  test_unit_variable_noInitializer() async {
-    var library = await buildTestLibrary(a, r'''
-int test;
-''');
-    _assertImpl(library, 'test', NodeKind.GETTER);
-    _assertImpl(library, 'test=', NodeKind.SETTER); // empty
-  }
-}
-
-@reflectiveTest
-class ShadowReferenceCollectorTest extends _Base {
-  test_importPrefix_with_classMember_getter_field() async {
-    var library = await buildTestLibrary(a, r'''
-import 'b.dart' as p;
-
-class X {
-  p.A<B> test() {}
-
-  int p;
-}
-''');
-    _assertApi(library, 'test', NodeKind.METHOD,
-        memberOf: 'X', unprefixed: ['B', 'p']);
-  }
-
-  test_importPrefix_with_classMember_method() async {
-    var library = await buildTestLibrary(a, r'''
-import 'b.dart' as p;
-
-class X {
-  p.A<B> test() {}
-
-  p() {}
-}
-''');
-    _assertApi(library, 'test', NodeKind.METHOD,
-        memberOf: 'X', unprefixed: ['B', 'p']);
-  }
-
-  test_importPrefix_with_function() async {
-    var library = await buildTestLibrary(a, r'''
-import 'b.dart' as p;
-
-p() {} // this is a compilation error
-
-class X extends p.A<B> {}
-''');
-    _assertApi(library, 'X', NodeKind.CLASS, unprefixed: [
-      'B'
-    ], prefixed: {
-      'p': ['A']
-    });
-  }
-
-  test_syntacticScope_class_constructor() async {
-    var library = await buildTestLibrary(a, r'''
-class X {
-  X.test(A a, X b) {
-    X;
-  }
-}
-''');
-    _assertApi(library, 'test', NodeKind.CONSTRUCTOR,
-        memberOf: 'X', unprefixed: ['A']);
-    _assertImpl(library, 'test', NodeKind.CONSTRUCTOR, memberOf: 'X');
-  }
-
-  test_syntacticScope_class_constructor_parameters() async {
-    var library = await buildTestLibrary(a, r'''
-class X {
-  X.test(a, b, c) {
-    a; b; c;
-    d;
-  }
-}
-''');
-    _assertApi(library, 'test', NodeKind.CONSTRUCTOR, memberOf: 'X');
-    _assertImpl(library, 'test', NodeKind.CONSTRUCTOR,
-        memberOf: 'X', unprefixed: ['d']);
-  }
-
-  test_syntacticScope_class_field() async {
-    var library = await buildTestLibrary(a, r'''
-class X {
-  var test = x + X + test;
-}
-''');
-    _assertApi(library, 'test', NodeKind.GETTER,
-        memberOf: 'X', unprefixed: ['x']);
-    _assertImpl(library, 'test', NodeKind.GETTER,
-        memberOf: 'X', unprefixed: ['x']);
-  }
-
-  test_syntacticScope_class_method() async {
-    var library = await buildTestLibrary(a, r'''
-class X {
-  test(A a, X b, test c) {
-    X;
-    test;
-    B;
-  }
-}
-''');
-    _assertApi(library, 'test', NodeKind.METHOD,
-        memberOf: 'X', unprefixed: ['A']);
-    _assertImpl(library, 'test', NodeKind.METHOD,
-        memberOf: 'X', unprefixed: ['B']);
-  }
-
-  test_syntacticScope_class_method_parameters() async {
-    var library = await buildTestLibrary(a, r'''
-class X {
-  test(a, b, c) {
-    a; b; c;
-    d;
-  }
-}
-''');
-    _assertApi(library, 'test', NodeKind.METHOD, memberOf: 'X');
-    _assertImpl(library, 'test', NodeKind.METHOD,
-        memberOf: 'X', unprefixed: ['d']);
-  }
-
-  test_syntacticScope_class_typeParameter_ofClass() async {
-    var library = await buildTestLibrary(a, r'''
-class X<T extends A<B, X, T>> {}
-''');
-    _assertApi(library, 'T', NodeKind.TYPE_PARAMETER,
-        typeParameterOf: 'X', unprefixed: ['A', 'B']);
-  }
-
-  test_syntacticScope_unit_class() async {
-    var library = await buildTestLibrary(a, r'''
-class X extends A<B, X> {}
-''');
-    _assertApi(library, 'X', NodeKind.CLASS, unprefixed: ['A', 'B']);
-  }
-
-  test_syntacticScope_unit_function() async {
-    var library = await buildTestLibrary(a, r'''
-test(A a, test b) {
-  test;
-  B;
-}
-''');
-    _assertApi(library, 'test', NodeKind.FUNCTION, unprefixed: ['A']);
-    _assertImpl(library, 'test', NodeKind.FUNCTION, unprefixed: ['B']);
-  }
-
-  test_syntacticScope_unit_function_parameters() async {
-    var library = await buildTestLibrary(a, r'''
-test(a, b, {c}) {
-  a; b; c;
-  d;
-}
-''');
-    _assertApi(library, 'test', NodeKind.FUNCTION);
-    _assertImpl(library, 'test', NodeKind.FUNCTION, unprefixed: ['d']);
-  }
-
-  test_syntacticScope_unit_functionTypeAlias() async {
-    var library = await buildTestLibrary(a, r'''
-typedef X(A a, X b);
-''');
-    _assertApi(library, 'X', NodeKind.FUNCTION_TYPE_ALIAS, unprefixed: ['A']);
-  }
-
-  test_syntacticScope_unit_mixin() async {
-    var library = await buildTestLibrary(a, r'''
-mixin X on A<B, X> {}
-''');
-    _assertApi(library, 'X', NodeKind.MIXIN, unprefixed: ['A', 'B']);
-  }
-}
-
-@reflectiveTest
-class StatementReferenceCollectorTest extends _Base {
-  test_assertStatement() async {
-    var library = await buildTestLibrary(a, r'''
-test() {
-  assert(x, y);
-}
-''');
-    _assertImpl(library, 'test', NodeKind.FUNCTION, unprefixed: ['x', 'y']);
-  }
-
-  test_block_localScope() async {
-    var library = await buildTestLibrary(a, r'''
-test() {
-  var x = 0;
-  {
-    var y = 0;
-    {
-      x;
-      y;
-    }
-    x;
-  }
-}
-''');
-    _assertImpl(library, 'test', NodeKind.FUNCTION);
-  }
-
-  test_breakStatement() async {
-    var library = await buildTestLibrary(a, r'''
-test() {
-  while (true) {
-    break;
-  }
-}
-''');
-    _assertImpl(library, 'test', NodeKind.FUNCTION);
-  }
-
-  test_continueStatement() async {
-    var library = await buildTestLibrary(a, r'''
-test() {
-  while (true) {
-    continue;
-  }
-}
-''');
-    _assertImpl(library, 'test', NodeKind.FUNCTION);
-  }
-
-  test_doStatement() async {
-    var library = await buildTestLibrary(a, r'''
-test() {
-  do {
-    x;
-  } while (y);
-}
-''');
-    _assertImpl(library, 'test', NodeKind.FUNCTION, unprefixed: ['x', 'y']);
-  }
-
-  test_emptyStatement() async {
-    var library = await buildTestLibrary(a, r'''
-test() {
-  while (true);
-}
-''');
-    _assertImpl(library, 'test', NodeKind.FUNCTION);
-  }
-
-  test_forEachStatement() async {
-    var library = await buildTestLibrary(a, r'''
-test() {
-  for (A a in x) {
-    a;
-    y;
-  }
-}
-''');
-    _assertImpl(library, 'test', NodeKind.FUNCTION,
-        unprefixed: ['A', 'x', 'y']);
-  }
-
-  test_forEachStatement_body_singleStatement() async {
-    var library = await buildTestLibrary(a, r'''
-test() {
-  for (var a in x) a;
-}
-''');
-    _assertImpl(library, 'test', NodeKind.FUNCTION, unprefixed: ['x']);
-  }
-
-  test_forEachStatement_iterableAsLoopVariable() async {
-    var library = await buildTestLibrary(a, r'''
-test() {
-  for (A x in x) {
-    y;
-  }
-}
-''');
-    _assertImpl(library, 'test', NodeKind.FUNCTION,
-        unprefixed: ['A', 'x', 'y']);
-  }
-
-  test_forEachStatement_loopIdentifier() async {
-    var library = await buildTestLibrary(a, r'''
-test() {
-  for (x in y) {
-    z;
-  }
-}
-''');
-    _assertImpl(library, 'test', NodeKind.FUNCTION,
-        unprefixed: ['x', 'y', 'z']);
-  }
-
-  test_forStatement_initialization() async {
-    var library = await buildTestLibrary(a, r'''
-test() {
-  for (x; y; z) {
-    z2;
-  }
-}
-''');
-    _assertImpl(library, 'test', NodeKind.FUNCTION,
-        unprefixed: ['x', 'y', 'z', 'z2']);
-  }
-
-  test_forStatement_variables() async {
-    var library = await buildTestLibrary(a, r'''
-test() {
-  for (A a = x, b = y, c = a; z; a, b, z2) {
-    z3;
-  }
-}
-''');
-    _assertImpl(library, 'test', NodeKind.FUNCTION,
-        unprefixed: ['A', 'x', 'y', 'z', 'z2', 'z3']);
-  }
-
-  test_functionDeclarationStatement() async {
-    var library = await buildTestLibrary(a, r'''
-test() {
-  A foo(B b) {
-    x;
-    C;
-    b;
-    foo();
-  }
-  foo();
-}
-''');
-    _assertImpl(library, 'test', NodeKind.FUNCTION,
-        unprefixed: ['A', 'B', 'C', 'x']);
-  }
-
-  test_ifStatement() async {
-    var library = await buildTestLibrary(a, r'''
-test() {
-  if (x) {
-    y;
-  }
-}
-''');
-    _assertImpl(library, 'test', NodeKind.FUNCTION, unprefixed: ['x', 'y']);
-  }
-
-  test_ifStatement_else() async {
-    var library = await buildTestLibrary(a, r'''
-test() {
-  if (x) {
-    y;
-  } else {
-    z;
-  }
-}
-''');
-    _assertImpl(library, 'test', NodeKind.FUNCTION,
-        unprefixed: ['x', 'y', 'z']);
-  }
-
-  test_labeledStatement() async {
-    var library = await buildTestLibrary(a, r'''
-test() {
-  label: x;
-}
-''');
-    _assertImpl(library, 'test', NodeKind.FUNCTION, unprefixed: ['x']);
-  }
-
-  test_returnStatement() async {
-    var library = await buildTestLibrary(a, r'''
-test() {
-  return x;
-}
-''');
-    _assertImpl(library, 'test', NodeKind.FUNCTION, unprefixed: ['x']);
-  }
-
-  test_switchStatement() async {
-    var library = await buildTestLibrary(a, r'''
-test() {
-  switch (x) {
-    case y:
-      var local1 = 1;
-      z;
-      local1;
-      break;
-    default:
-      var local2 = 2;
-      z2;
-      local2;
-  }
-}
-''');
-    _assertImpl(library, 'test', NodeKind.FUNCTION,
-        unprefixed: ['x', 'y', 'z', 'z2']);
-  }
-
-  test_switchStatement_localScopePerCase() async {
-    var library = await buildTestLibrary(a, r'''
-test() {
-  switch (0) {
-    case 0:
-      var v1 = 1;
-      var v2 = 2;
-      v1;
-      v2;
-    default:
-      v1;
-  }
-}
-''');
-    _assertImpl(library, 'test', NodeKind.FUNCTION, unprefixed: ['v1']);
-  }
-
-  test_tryStatement() async {
-    var library = await buildTestLibrary(a, r'''
-test() {
-  try {
-    var local1 = 1;
-    x;
-    local1;
-  } finally {
-    var local2 = 2;
-    y;
-    local2;
-  }
-}
-''');
-    _assertImpl(library, 'test', NodeKind.FUNCTION, unprefixed: ['x', 'y']);
-  }
-
-  test_tryStatement_catch() async {
-    var library = await buildTestLibrary(a, r'''
-test() {
-  try {
-    var local1 = 1;
-    x;
-    local1;
-  } on A {
-    var local2 = 2;
-    y;
-    local2;
-  } on B catch (ex1) {
-    var local3 = 3;
-    z;
-    ex1;
-    local3;
-  } catch (ex2, st2) {
-    ex2;
-    st2;
-  }
-}
-''');
-    _assertImpl(library, 'test', NodeKind.FUNCTION,
-        unprefixed: ['A', 'B', 'x', 'y', 'z']);
-  }
-
-  test_variableDeclarationStatement() async {
-    var library = await buildTestLibrary(a, r'''
-test() {
-  var a = x, b = y;
-}
-''');
-    _assertImpl(library, 'test', NodeKind.FUNCTION, unprefixed: ['x', 'y']);
-  }
-
-  test_whileStatement() async {
-    var library = await buildTestLibrary(a, r'''
-test() {
-  while (x) {
-    y;
-  }
-}
-''');
-    _assertImpl(library, 'test', NodeKind.FUNCTION, unprefixed: ['x', 'y']);
-  }
-
-  test_yieldStatement() async {
-    var library = await buildTestLibrary(a, r'''
-test() sync* {
-  yield x;
-}
-''');
-    _assertImpl(library, 'test', NodeKind.FUNCTION, unprefixed: ['x']);
-  }
-}
-
-@reflectiveTest
-class TypeReferenceCollectorTest extends _Base {
-  test_dynamic() async {
-    var library = await buildTestLibrary(a, r'''
-dynamic test() {}
-''');
-    _assertApi(library, 'test', NodeKind.FUNCTION);
-  }
-
-  test_function() async {
-    var library = await buildTestLibrary(a, r'''
-A Function(B) test() {}
-''');
-    _assertApi(library, 'test', NodeKind.FUNCTION, unprefixed: ['A', 'B']);
-  }
-
-  test_function_generic() async {
-    var library = await buildTestLibrary(a, r'''
-A Function<T, U extends B>(T t, C c, D<T> d, E e) test() {}
-''');
-    _assertApi(library, 'test', NodeKind.FUNCTION,
-        unprefixed: ['A', 'B', 'C', 'D', 'E']);
-  }
-
-  test_function_nested_generic() async {
-    var library = await buildTestLibrary(a, r'''
-A Function<T>(B Function<U>(U, C, T) f, D) test() {}
-''');
-    _assertApi(library, 'test', NodeKind.FUNCTION,
-        unprefixed: ['A', 'B', 'C', 'D']);
-  }
-
-  test_function_parameter_named() async {
-    var library = await buildTestLibrary(a, r'''
-A Function({B, C}) test() {}
-''');
-    _assertApi(library, 'test', NodeKind.FUNCTION, unprefixed: ['A', 'B', 'C']);
-  }
-
-  test_function_parameter_positional() async {
-    var library = await buildTestLibrary(a, r'''
-A Function([B, C]) test() {}
-''');
-    _assertApi(library, 'test', NodeKind.FUNCTION, unprefixed: ['A', 'B', 'C']);
-  }
-
-  test_function_shadow_typeParameters() async {
-    var library = await buildTestLibrary(a, r'''
-A Function<T2 extends U2, U2>(B) test() {}
-''');
-    _assertApi(library, 'test', NodeKind.FUNCTION, unprefixed: ['A', 'B']);
-  }
-
-  test_interface_generic() async {
-    var library = await buildTestLibrary(a, r'''
-A<B, C<D>> test() {}
-''');
-    _assertApi(library, 'test', NodeKind.FUNCTION,
-        unprefixed: ['A', 'B', 'C', 'D']);
-  }
-
-  test_interface_prefixed() async {
-    var library = await buildTestLibrary(a, r'''
-import 'b.dart' as pb;
-import 'c.dart' as pc;
-A<pb.B2, pc.C2, pb.B1, pc.C1, pc.C3> test() {}
-''');
-    _assertApi(
-      library,
-      'test',
-      NodeKind.FUNCTION,
-      unprefixed: ['A'],
-      prefixed: {
-        'pb': ['B1', 'B2'],
-        'pc': ['C1', 'C2', 'C3']
-      },
-    );
-  }
-
-  test_interface_simple() async {
-    var library = await buildTestLibrary(a, r'''
-A test() {}
-''');
-    _assertApi(library, 'test', NodeKind.FUNCTION, unprefixed: ['A']);
-  }
-
-  test_void() async {
-    var library = await buildTestLibrary(a, r'''
-void test() {}
-''');
-    _assertApi(library, 'test', NodeKind.FUNCTION);
-  }
-}
-
-class _Base extends BaseDependencyTest {
-  void _assertApi(Library library, String name, NodeKind kind,
-      {String? memberOf,
-      String? typeParameterOf,
-      List<String> unprefixed = const [],
-      Map<String, List<String>> prefixed = const {},
-      List<String> superPrefixed = const [],
-      List<_ExpectedClassMember> expectedMembers = const []}) {
-    var node = getNode(
-      library,
-      name: name,
-      kind: kind,
-      memberOf: memberOf,
-      typeParameterOf: typeParameterOf,
-    );
-    _assertDependencies(
-      node.api,
-      unprefixed: unprefixed,
-      prefixed: prefixed,
-      superPrefixed: superPrefixed,
-      expectedMembers: expectedMembers,
-    );
-  }
-
-  void _assertDependencies(Dependencies dependencies,
-      {List<String> unprefixed = const [],
-      Map<String, List<String>> prefixed = const {},
-      List<String> superPrefixed = const [],
-      List<_ExpectedClassMember> expectedMembers = const []}) {
-    expect(dependencies.unprefixedReferencedNames, unprefixed);
-    expect(dependencies.importPrefixes, prefixed.keys);
-    expect(dependencies.importPrefixedReferencedNames, prefixed.values);
-    expect(dependencies.superReferencedNames, superPrefixed);
-
-    var actualMembers = dependencies.classMemberReferences;
-    if (actualMembers.length != expectedMembers.length) {
-      fail('Expected: $expectedMembers\nActual: $actualMembers');
-    }
-    expect(actualMembers, hasLength(expectedMembers.length));
-    for (var i = 0; i < actualMembers.length; i++) {
-      var actualMember = actualMembers[i];
-      var expectedMember = expectedMembers[i];
-      if (actualMember.target.libraryUri != expectedMember.targetUri ||
-          actualMember.target.name != expectedMember.targetName ||
-          actualMember.name != expectedMember.name) {
-        fail('Expected: $expectedMember\nActual: $actualMember');
-      }
-    }
-  }
-
-  void _assertImpl(Library library, String name, NodeKind kind,
-      {String? memberOf,
-      String? typeParameterOf,
-      List<String> unprefixed = const [],
-      Map<String, List<String>> prefixed = const {},
-      List<String> superPrefixed = const [],
-      List<_ExpectedClassMember> expectedMembers = const []}) {
-    var node = getNode(
-      library,
-      name: name,
-      kind: kind,
-      memberOf: memberOf,
-      typeParameterOf: typeParameterOf,
-    );
-    _assertDependencies(
-      node.impl,
-      unprefixed: unprefixed,
-      prefixed: prefixed,
-      superPrefixed: superPrefixed,
-      expectedMembers: expectedMembers,
-    );
-  }
-}
-
-class _ExpectedClassMember {
-  final Uri targetUri;
-  final String targetName;
-  final String name;
-
-  _ExpectedClassMember(
-    this.targetUri,
-    this.targetName,
-    this.name,
-  );
-
-  @override
-  String toString() {
-    return '($targetUri, $targetName, $name)';
-  }
-}
diff --git a/pkg/analyzer/test/src/dart/analysis/dependency/test_all.dart b/pkg/analyzer/test/src/dart/analysis/dependency/test_all.dart
deleted file mode 100644
index 9ddb5bd..0000000
--- a/pkg/analyzer/test/src/dart/analysis/dependency/test_all.dart
+++ /dev/null
@@ -1,15 +0,0 @@
-// Copyright (c) 2018, 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:test_reflective_loader/test_reflective_loader.dart';
-
-import 'declared_nodes_test.dart' as declared_nodes_test;
-import 'reference_collector_test.dart' as reference_collector_test;
-
-main() {
-  defineReflectiveSuite(() {
-    declared_nodes_test.main();
-    reference_collector_test.main();
-  }, name: 'dependency');
-}
diff --git a/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart b/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart
index 82158be..1901bb3 100644
--- a/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart
@@ -810,6 +810,7 @@
   operator: >>>
   rightOperand: IntegerLiteral
     literal: 3
+    parameter: self::@class::A::@method::>>>::@parameter::amount
     staticType: int
   staticElement: self::@class::A::@method::>>>
   staticInvokeType: A Function(int)
diff --git a/pkg/analyzer/test/src/dart/analysis/driver_test.dart b/pkg/analyzer/test/src/dart/analysis/driver_test.dart
index 5ceb724..7cc3008 100644
--- a/pkg/analyzer/test/src/dart/analysis/driver_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/driver_test.dart
@@ -2548,7 +2548,7 @@
     expect(driver.knownFiles, contains(p));
   }
 
-  test_part_getErrors_afterLibrary() async {
+  test_partOfName_getErrors_afterLibrary() async {
     var a = convertPath('/test/lib/a.dart');
     var b = convertPath('/test/lib/b.dart');
     var c = convertPath('/test/lib/c.dart');
@@ -2584,7 +2584,7 @@
     }
   }
 
-  test_part_getErrors_beforeLibrary() async {
+  test_partOfName_getErrors_beforeLibrary() async {
     var a = convertPath('/test/lib/a.dart');
     var b = convertPath('/test/lib/b.dart');
     var c = convertPath('/test/lib/c.dart');
@@ -2614,7 +2614,7 @@
     }
   }
 
-  test_part_getResult_afterLibrary() async {
+  test_partOfName_getResult_afterLibrary() async {
     var a = convertPath('/test/lib/a.dart');
     var b = convertPath('/test/lib/b.dart');
     var c = convertPath('/test/lib/c.dart');
@@ -2653,7 +2653,7 @@
     }
   }
 
-  test_part_getResult_beforeLibrary() async {
+  test_partOfName_getResult_beforeLibrary() async {
     var a = convertPath('/test/lib/a.dart');
     var b = convertPath('/test/lib/b.dart');
     var c = convertPath('/test/lib/c.dart');
@@ -2684,7 +2684,7 @@
     _assertTopLevelVarType(result.unit, 'b', 'B');
   }
 
-  test_part_getResult_changePart_invalidatesLibraryCycle() async {
+  test_partOfName_getResult_changePart_invalidatesLibraryCycle() async {
     var a = convertPath('/test/lib/a.dart');
     var b = convertPath('/test/lib/b.dart');
     newFile(a, r'''
@@ -2710,19 +2710,44 @@
     expect(result.errors, isEmpty);
   }
 
-  test_part_getResult_noLibrary() async {
-    final c = newFile('/test/lib/c.dart', r'''
-part of a;
-class C {}
+  test_partOfName_getResult_hasLibrary_noPart() async {
+    final a = newFile('/test/lib/a.dart', r'''
+library my.lib;
 ''');
 
-    // There is no library which c.dart is a part of, so invalid result.
-    final result = await driver.getResult(c.path);
-    result as PartWithoutLibraryResult;
-    expect(result.path, c.path);
+    final c = newFile('/test/lib/c.dart', r'''
+part of my.lib;
+final a = A();
+''');
+
+    // Discover the library.
+    driver.getFileSync(a.path);
+
+    // There is no library which c.dart is a part of, so `A` is unresolved.
+    ResolvedUnitResult result = await driver.getResultValid(c.path);
+    expect(result.errors, isNotEmpty);
+    expect(result.unit, isNotNull);
   }
 
-  test_part_getUnitElement_afterLibrary() async {
+  test_partOfName_getResult_noLibrary() async {
+    var c = convertPath('/test/lib/c.dart');
+    newFile(c, r'''
+part of a;
+class C {}
+var a = new A();
+var b = new B();
+''');
+
+    driver.addFile(c);
+
+    // There is no library which c.dart is a part of, so it has unresolved
+    // A and B references.
+    ResolvedUnitResult result = await driver.getResultValid(c);
+    expect(result.errors, isNotEmpty);
+    expect(result.unit, isNotNull);
+  }
+
+  test_partOfName_getUnitElement_afterLibrary() async {
     var a = convertPath('/test/lib/a.dart');
     var b = convertPath('/test/lib/b.dart');
     var c = convertPath('/test/lib/c.dart');
@@ -2762,7 +2787,7 @@
     }
   }
 
-  test_part_getUnitElement_beforeLibrary() async {
+  test_partOfName_getUnitElement_beforeLibrary() async {
     var a = convertPath('/test/lib/a.dart');
     var b = convertPath('/test/lib/b.dart');
     var c = convertPath('/test/lib/c.dart');
@@ -2799,18 +2824,32 @@
     }
   }
 
-  test_part_getUnitElement_noLibrary() async {
-    final c = newFile('/test/lib/c.dart', r'''
+  test_partOfName_getUnitElement_noLibrary() async {
+    var c = convertPath('/test/lib/c.dart');
+    newFile(c, r'''
 part of a;
+var a = new A();
+var b = new B();
 ''');
 
-    // We don't know the library of c.dart, so invalid result.
-    var result = await driver.getUnitElement(c.path);
-    result as PartWithoutLibraryResult;
-    expect(result.path, c.path);
+    driver.addFile(c);
+
+    // We don't know the library of c.dart, but we should get a result.
+    // The types "A" and "B" are unresolved.
+    {
+      var result = await driver.getUnitElement(c);
+      result as UnitElementResult;
+      var partUnit = result.element;
+
+      expect(partUnit.topLevelVariables[0].name, 'a');
+      assertType(partUnit.topLevelVariables[0].type, 'dynamic');
+
+      expect(partUnit.topLevelVariables[1].name, 'b');
+      assertType(partUnit.topLevelVariables[1].type, 'dynamic');
+    }
   }
 
-  test_part_results_afterLibrary() async {
+  test_partOfName_results_afterLibrary() async {
     var a = convertPath('/test/lib/a.dart');
     var b = convertPath('/test/lib/b.dart');
     var c = convertPath('/test/lib/c.dart');
@@ -2846,20 +2885,19 @@
 
     // Update a.dart so that c.dart is not a part.
     {
-      allResults.clear();
-
       modifyFile(a, '// does not use c.dart anymore');
       driver.changeFile(a);
       await waitForIdleWithoutExceptions();
 
-      // Now c.dart does not know the library, so invalid result.
-      allResults
-          .whereType<PartWithoutLibraryResult>()
-          .lastWhere((r) => r.path == c);
+      // Now c.dart does not have a library context, so A and B cannot be
+      // resolved, so there are errors.
+      var result =
+          allResults.whereType<ErrorsResult>().lastWhere((r) => r.path == c);
+      expect(result.errors, isNotEmpty);
     }
   }
 
-  test_part_results_beforeLibrary() async {
+  test_partOfName_results_beforeLibrary() async {
     var a = convertPath('/test/lib/a.dart');
     var b = convertPath('/test/lib/b.dart');
     var c = convertPath('/test/lib/c.dart');
@@ -2894,7 +2932,7 @@
     expect(result.errors, isEmpty);
   }
 
-  test_part_results_noLibrary() async {
+  test_partOfName_results_noLibrary() async {
     var c = convertPath('/test/lib/c.dart');
     newFile(c, r'''
 part of a;
@@ -2907,13 +2945,14 @@
 
     await waitForIdleWithoutExceptions();
 
-    // We don't know the library for `c.dart`, so report an invalid result.
-    allResults
-        .whereType<PartWithoutLibraryResult>()
-        .lastWhere((result) => result.path == c);
+    // There is no library which c.dart is a part of, so it has unresolved
+    // A and B references.
+    var result =
+        allResults.whereType<ErrorsResult>().lastWhere((r) => r.path == c);
+    expect(result.errors, isNotEmpty);
   }
 
-  test_part_results_noLibrary_priority() async {
+  test_partOfName_results_noLibrary_priority() async {
     var c = newFile('/test/lib/c.dart', r'''
 part of a;
 class C {}
@@ -2926,13 +2965,15 @@
 
     await waitForIdleWithoutExceptions();
 
-    // We don't know the library for `c.dart`, so report an invalid result.
-    allResults
-        .whereType<PartWithoutLibraryResult>()
+    // There is no library which c.dart is a part of, so it has unresolved
+    // A and B references.
+    final result = allResults
+        .whereType<ResolvedUnitResult>()
         .lastWhere((result) => result.path == c.path);
+    expect(result.errors, isNotEmpty);
   }
 
-  test_part_results_priority_beforeLibrary() async {
+  test_partOfName_results_priority_beforeLibrary() async {
     var a = convertPath('/test/lib/a.dart');
     var b = convertPath('/test/lib/b.dart');
     var c = convertPath('/test/lib/c.dart');
diff --git a/pkg/analyzer/test/src/dart/analysis/file_state_test.dart b/pkg/analyzer/test/src/dart/analysis/file_state_test.dart
index 0070cbe..c0b0ac1 100644
--- a/pkg/analyzer/test/src/dart/analysis/file_state_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/file_state_test.dart
@@ -129,6 +129,416 @@
     return driverFor(file.path).fsState;
   }
 
+  test_newFile_augmentation_augmentationExists_hasImport() async {
+    final a = newFile('$testPackageLibPath/a.dart', r'''
+import augment 'b.dart';
+''');
+
+    final b = newFile('$testPackageLibPath/b.dart', r'''
+library augment 'a.dart';
+import augment 'c.dart';
+''');
+
+    final c = newFile('$testPackageLibPath/c.dart', r'''
+library augment 'b.dart';
+''');
+
+    final cState = fileStateFor(c);
+    // We have not asked for `b.dart` yet, but it was found using URI.
+    cState.assertKind((kind) {
+      kind as AugmentationKnownFileStateKind;
+      expect(kind.uriFile.path, b.path);
+      expect(kind.augmented?.path, b.path);
+    });
+
+    final bState = fileStateFor(b);
+    _assertAugmentationFiles(bState, [c]);
+    // We have not asked for `a.dart` yet, but it was found using URI.
+    bState.assertKind((kind) {
+      kind as AugmentationKnownFileStateKind;
+      expect(kind.uriFile.path, a.path);
+      expect(kind.augmented?.path, a.path);
+    });
+    // Check `c.dart` again, now using the `b.dart` state.
+    cState.assertKind((kind) {
+      kind as AugmentationKnownFileStateKind;
+      expect(kind.uriFile, same(bState));
+      expect(kind.augmented, same(bState));
+    });
+
+    final aState = fileStateFor(a);
+    _assertAugmentationFiles(aState, [b]);
+    // Check `b.dart` again, now using the `a.dart` state.
+    bState.assertKind((kind) {
+      kind as AugmentationKnownFileStateKind;
+      expect(kind.uriFile, same(aState));
+      expect(kind.augmented, same(aState));
+    });
+  }
+
+  test_newFile_augmentation_augmentationExists_hasImport_disconnected() async {
+    final a = getFile('$testPackageLibPath/a.dart');
+
+    final b = newFile('$testPackageLibPath/b.dart', r'''
+library augment 'a.dart';
+import augment 'c.dart';
+''');
+
+    final c = newFile('$testPackageLibPath/c.dart', r'''
+library augment 'b.dart';
+''');
+
+    final cState = fileStateFor(c);
+    // We have not asked for `b.dart` yet, but it was found using URI.
+    cState.assertKind((kind) {
+      kind as AugmentationKnownFileStateKind;
+      expect(kind.uriFile.path, b.path);
+      expect(kind.augmented?.path, b.path);
+    });
+
+    final bState = fileStateFor(b);
+    _assertAugmentationFiles(bState, [c]);
+    // We have not asked for `a.dart` yet, but it was found using URI.
+    bState.assertKind((kind) {
+      kind as AugmentationKnownFileStateKind;
+      expect(kind.uriFile.path, a.path);
+      // The file `a.dart` does not exist, so no import, so `null`.
+      expect(kind.augmented, isNull);
+    });
+    // Check `c.dart` again, now using the `b.dart` state.
+    cState.assertKind((kind) {
+      kind as AugmentationKnownFileStateKind;
+      expect(kind.uriFile, same(bState));
+      expect(kind.augmented, same(bState));
+    });
+
+    // The file `a.dart` does not exist.
+    final aState = fileStateFor(a);
+    expect(aState.exists, isFalse);
+    _assertAugmentationFiles(aState, []);
+    // Check `b.dart` again, now using the `a.dart` state.
+    bState.assertKind((kind) {
+      kind as AugmentationKnownFileStateKind;
+      // The URI can be resolved, it points at `a.dart` file.
+      expect(kind.uriFile, same(aState));
+      // The file `a.dart` does not exist, so no import, so `null`.
+      expect(kind.augmented, isNull);
+    });
+  }
+
+  test_newFile_augmentation_augmentationExists_noImport() async {
+    final a = newFile('$testPackageLibPath/a.dart', r'''
+import augment 'b.dart';
+''');
+
+    final b = newFile('$testPackageLibPath/b.dart', r'''
+library augment 'a.dart';
+''');
+
+    final c = newFile('$testPackageLibPath/c.dart', r'''
+library augment 'b.dart';
+''');
+
+    // We found `b.dart` from the augmentation file `c.dart`.
+    final cState = fileStateFor(c);
+    cState.assertKind((kind) {
+      kind as AugmentationKnownFileStateKind;
+      expect(kind.uriFile.path, b.path);
+      // `b.dart` does not import `c.dart` as an augmentation.
+      expect(kind.augmented, isNull);
+    });
+
+    // Reading `a.dart` does not change anything.
+    final aState = fileStateFor(a);
+    _assertAugmentationFiles(aState, [b]);
+    aState.assertKind((kind) {
+      kind as LibraryFileStateKind;
+      expect(kind.name, isNull);
+    });
+
+    // `b.dart` does not import `c.dart` as an augmentation.
+    final bState = fileStateFor(b);
+    _assertAugmentationFiles(bState, []);
+    bState.assertKind((kind) {
+      kind as AugmentationKnownFileStateKind;
+      expect(kind.uriFile, same(aState));
+      expect(kind.augmented, same(aState));
+    });
+
+    // Check `c.dart` again, now using the `b.dart` state.
+    cState.assertKind((kind) {
+      kind as AugmentationKnownFileStateKind;
+      expect(kind.uriFile, same(bState));
+      expect(kind.augmented, isNull);
+    });
+  }
+
+  test_newFile_augmentation_cycle1_augmentSelf() async {
+    final a = newFile('$testPackageLibPath/a.dart', r'''
+import augment 'b.dart';
+''');
+
+    final b = newFile('$testPackageLibPath/b.dart', r'''
+library augment 'b.dart';
+import augment 'b.dart';
+''');
+
+    final aState = fileStateFor(a);
+    _assertAugmentationFiles(aState, [b]);
+
+    // We can construct a cycle using augmentations.
+    final bState = fileStateFor(b);
+    _assertAugmentationFiles(bState, [b]);
+    bState.assertKind((bKind) {
+      bKind as AugmentationKnownFileStateKind;
+      expect(bKind.uriFile, same(bState));
+      expect(bKind.augmented, same(bState));
+    });
+
+    // The cycle does not prevent building of the library cycle.
+    aState.assertKind((kind) {
+      kind as LibraryFileStateKind;
+      expect(kind.name, isNull);
+      // TODO(scheglov) ask for the cycle signature
+    });
+  }
+
+  test_newFile_augmentation_cycle2() async {
+    final a = newFile('$testPackageLibPath/a.dart', r'''
+import augment 'b.dart';
+''');
+
+    final b = newFile('$testPackageLibPath/b.dart', r'''
+library augment 'a.dart';
+import augment 'c.dart';
+''');
+
+    final c = newFile('$testPackageLibPath/c.dart', r'''
+library augment 'b.dart';
+import augment 'b.dart';
+''');
+
+    final aState = fileStateFor(a);
+    _assertAugmentationFiles(aState, [b]);
+
+    final bState = fileStateFor(b);
+    _assertAugmentationFiles(bState, [c]);
+
+    final cState = fileStateFor(c);
+    _assertAugmentationFiles(cState, [b]);
+
+    // We can construct a cycle using augmentations.
+    bState.assertKind((kind) {
+      kind as AugmentationKnownFileStateKind;
+      expect(kind.uriFile, same(aState));
+      expect(kind.augmented, same(aState));
+    });
+    cState.assertKind((kind) {
+      kind as AugmentationKnownFileStateKind;
+      expect(kind.uriFile, same(bState));
+      expect(kind.augmented, same(bState));
+    });
+
+    // The cycle does not prevent building of the library cycle.
+    aState.assertKind((kind) {
+      kind as LibraryFileStateKind;
+      expect(kind.name, isNull);
+      // TODO(scheglov) ask for the cycle signature
+    });
+  }
+
+  test_newFile_augmentation_invalid() async {
+    final a = newFile('$testPackageLibPath/a.dart', r'''
+library augment 'da:';
+''');
+
+    // The URI is invalid, so there is no way to discover the target.
+    final aState = fileStateFor(a);
+    aState.assertKind((kind) {
+      kind as AugmentationUnknownFileStateKind;
+      expect(kind.directive.uri, 'da:');
+    });
+  }
+
+  test_newFile_augmentation_libraryExists_hasImport() async {
+    final a = newFile('$testPackageLibPath/a.dart', r'''
+import augment 'b.dart';
+''');
+
+    final b = newFile('$testPackageLibPath/b.dart', r'''
+library augment 'a.dart';
+''');
+
+    final bState = fileStateFor(b);
+    // We have not asked for `a.dart` yet, but it was found using URI.
+    bState.assertKind((kind) {
+      kind as AugmentationKnownFileStateKind;
+      expect(kind.uriFile.path, a.path);
+      expect(kind.augmented?.path, a.path);
+    });
+
+    final aState = fileStateFor(a);
+    _assertAugmentationFiles(aState, [b]);
+    // Check `b.dart` again, now using the `a.dart` state.
+    bState.assertKind((kind) {
+      kind as AugmentationKnownFileStateKind;
+      expect(kind.uriFile, same(aState));
+      expect(kind.augmented, same(aState));
+    });
+  }
+
+  test_newFile_augmentation_libraryExists_noImport() async {
+    final a = newFile('$testPackageLibPath/a.dart', '');
+
+    final b = newFile('$testPackageLibPath/b.dart', r'''
+library augment 'a.dart';
+''');
+
+    final aState = fileStateFor(a);
+    _assertAugmentationFiles(aState, []);
+
+    final bState = fileStateFor(b);
+    // We can find `a.dart` using the URI.
+    bState.assertKind((kind) {
+      kind as AugmentationKnownFileStateKind;
+      expect(kind.uriFile, same(aState));
+      // But `a.dart` does not import `b.dart`.
+      expect(kind.augmented, isNull);
+    });
+
+    // Refreshing `a.dart` does not change anything.
+    aState.refresh();
+    _assertAugmentationFiles(aState, []);
+    bState.assertKind((kind) {
+      kind as AugmentationKnownFileStateKind;
+      expect(kind.uriFile, same(aState));
+      expect(kind.augmented, isNull);
+    });
+  }
+
+  test_newFile_augmentation_targetNotExists() async {
+    final a = getFile('$testPackageLibPath/a.dart');
+
+    final b = newFile('$testPackageLibPath/b.dart', r'''
+library augment 'a.dart';
+''');
+
+    final bState = fileStateFor(b);
+    // We can find `a.dart` from `b.dart` using the URI.
+    bState.assertKind((kind) {
+      kind as AugmentationKnownFileStateKind;
+      expect(kind.uriFile.path, a.path);
+      // The file `a.dart` does not exist, so no import.
+      expect(kind.augmented, isNull);
+    });
+
+    // We can get `a.dart`, but it does not exist.
+    final aState = fileStateFor(a);
+    expect(aState.exists, isFalse);
+    _assertAugmentationFiles(aState, []);
+    bState.assertKind((kind) {
+      kind as AugmentationKnownFileStateKind;
+      expect(kind.uriFile, same(aState));
+      // The file `a.dart` does not exist, so no import.
+      expect(kind.augmented, isNull);
+    });
+  }
+
+  test_newFile_augmentation_twoLibraries() async {
+    final a = newFile('$testPackageLibPath/a.dart', r'''
+import augment 'c.dart';
+''');
+
+    final b = newFile('$testPackageLibPath/b.dart', r'''
+import augment 'c.dart';
+''');
+
+    final c = newFile('$testPackageLibPath/c.dart', r'''
+library augment 'a.dart';
+''');
+
+    final aState = fileStateFor(a);
+    _assertAugmentationFiles(aState, [c]);
+
+    // We use the URI from `library augment` to find the augmentation target.
+    final cState = fileStateFor(c);
+    cState.assertKind((kind) {
+      kind as AugmentationKnownFileStateKind;
+      expect(kind.uriFile, same(aState));
+      expect(kind.augmented, same(aState));
+    });
+
+    // Reading `b.dart` does not update the augmentation.
+    final bState = fileStateFor(b);
+    _assertAugmentationFiles(bState, [c]);
+    cState.assertKind((kind) {
+      kind as AugmentationKnownFileStateKind;
+      expect(kind.uriFile, same(aState));
+      expect(kind.augmented, same(aState));
+    });
+
+    // Refreshing `a.dart` does not update the augmentation.
+    aState.refresh();
+    cState.assertKind((kind) {
+      kind as AugmentationKnownFileStateKind;
+      expect(kind.uriFile, same(aState));
+      expect(kind.augmented, same(aState));
+    });
+
+    // Refreshing `b.dart` does not update the augmentation.
+    bState.refresh();
+    cState.assertKind((kind) {
+      kind as AugmentationKnownFileStateKind;
+      expect(kind.uriFile, same(aState));
+      expect(kind.augmented, same(aState));
+    });
+
+    // Exclude from `a.dart`, the URI still points at `a.dart`.
+    // But `c.dart` is not a valid augmentation anymore.
+    newFile(a.path, '');
+    aState.refresh();
+    _assertAugmentationFiles(aState, []);
+    cState.assertKind((kind) {
+      kind as AugmentationKnownFileStateKind;
+      expect(kind.uriFile, same(aState));
+      expect(kind.augmented, isNull);
+    });
+
+    // Exclude from `b.dart`, still point at `a.dart`, still not valid.
+    newFile(b.path, '');
+    bState.refresh();
+    _assertAugmentationFiles(bState, []);
+    cState.assertKind((kind) {
+      kind as AugmentationKnownFileStateKind;
+      expect(kind.uriFile, same(aState));
+      expect(kind.augmented, isNull);
+    });
+
+    // Include into `b.dart`, still point at `a.dart`, still not valid.
+    newFile(b.path, r'''
+import augment 'c.dart';
+''');
+    bState.refresh();
+    _assertAugmentationFiles(bState, [c]);
+    cState.assertKind((kind) {
+      kind as AugmentationKnownFileStateKind;
+      expect(kind.uriFile, same(aState));
+      expect(kind.augmented, isNull);
+    });
+
+    // Include into `a.dart`, restore to `a.dart` as the target.
+    newFile(a.path, r'''
+import augment 'c.dart';
+''');
+    aState.refresh();
+    _assertAugmentationFiles(aState, [c]);
+    cState.assertKind((kind) {
+      kind as AugmentationKnownFileStateKind;
+      expect(kind.uriFile, same(aState));
+      expect(kind.augmented, same(aState));
+    });
+  }
+
   test_newFile_library_includePart_withoutPartOf() async {
     final a = newFile('$testPackageLibPath/a.dart', r'''
 part 'b.dart';
@@ -141,6 +551,7 @@
     final aState = fileStateFor(a);
     aState.assertKind((kind) {
       kind as LibraryFileStateKind;
+      expect(kind.name, isNull);
     });
 
     // Library `a.dart` includes `b.dart` as a part.
@@ -150,6 +561,7 @@
     final bState = fileStateFor(b);
     bState.assertKind((kind) {
       kind as LibraryFileStateKind;
+      expect(kind.name, isNull);
     });
 
     // Refreshing the library does not change this.
@@ -157,36 +569,7 @@
     _assertPartedFiles(aState, [b]);
     bState.assertKind((kind) {
       kind as LibraryFileStateKind;
-    });
-  }
-
-  test_newFile_libraryAugmentation_invalid() async {
-    final a = newFile('$testPackageLibPath/a.dart', r'''
-library augment 'da:';
-''');
-
-    final aState = fileStateFor(a);
-    aState.assertKind((kind) {
-      kind as LibraryAugmentationUnknownFileStateKind;
-    });
-  }
-
-  /// TODO(scheglov) implement
-  @FailingTest(reason: 'No import augment directive')
-  test_newFile_libraryAugmentation_valid() async {
-    final a = newFile('$testPackageLibPath/a.dart', r'''
-import augment 'b.dart';
-''');
-
-    final b = newFile('$testPackageLibPath/a.dart', r'''
-library augment 'a.dart';
-''');
-
-    final bState = fileStateFor(b);
-    bState.assertKind((kind) {
-      kind as LibraryAugmentationKnownFileStateKind;
-      final aState = fileStateFor(a);
-      expect(kind.augmented, same(aState));
+      expect(kind.name, isNull);
     });
   }
 
@@ -198,6 +581,7 @@
     final aState = fileStateFor(a);
     aState.assertKind((kind) {
       kind as LibraryFileStateKind;
+      expect(kind.name, 'my');
     });
   }
 
@@ -207,6 +591,7 @@
     final aState = fileStateFor(a);
     aState.assertKind((kind) {
       kind as LibraryFileStateKind;
+      expect(kind.name, isNull);
     });
   }
 
@@ -225,20 +610,24 @@
     // We don't know the library initially.
     // Even though the library file exists, we have not seen it yet.
     bState.assertKind((kind) {
-      kind as PartUnknownNameFileStateKind;
+      kind as PartOfNameFileStateKind;
       expect(kind.directive.name, 'my.lib');
+      expect(kind.libraries, isEmpty);
+      expect(kind.library, isNull);
     });
 
     // Read the library file.
     final aState = fileStateFor(a);
     aState.assertKind((kind) {
       kind as LibraryFileStateKind;
+      expect(kind.name, 'my.lib');
     });
     _assertPartedFiles(aState, [b]);
 
     // Now the part knows its library.
     bState.assertKind((kind) {
-      kind as PartKnownFileStateKind;
+      kind as PartOfNameFileStateKind;
+      kind.assertLibraries([aState]);
       expect(kind.library, same(aState));
     });
   }
@@ -256,117 +645,184 @@
     final bState = fileStateFor(b);
 
     // We don't know the library initially.
-    // Even though the library file exists, we have not seen it yet.
     bState.assertKind((kind) {
-      kind as PartUnknownNameFileStateKind;
+      kind as PartOfNameFileStateKind;
       expect(kind.directive.name, 'other.lib');
+      kind.assertLibraries([]);
+      expect(kind.library, isNull);
     });
 
     // Read the library file.
     final aState = fileStateFor(a);
     aState.assertKind((kind) {
       kind as LibraryFileStateKind;
+      expect(kind.name, 'my.lib');
     });
     _assertPartedFiles(aState, [b]);
 
-    // Now the part knows its library.
-    // The name of the library in the part file does not matter.
-    // What counts is that the library includes it.
+    // We still don't know the library, because the part wants `other.lib`,
+    // but `a.dart` that includes `b.dart` has the name `my.lib`.
     bState.assertKind((kind) {
-      kind as PartKnownFileStateKind;
-      expect(kind.library, same(aState));
+      kind as PartOfNameFileStateKind;
+      kind.assertLibraries([]);
+      expect(kind.library, isNull);
     });
   }
 
   test_newFile_partOfName_twoLibraries() async {
     final a = newFile('$testPackageLibPath/a.dart', r'''
+library my.lib;
 part 'c.dart';
 ''');
 
     final b = newFile('$testPackageLibPath/b.dart', r'''
+library my.lib;
 part 'c.dart';
 ''');
 
     final c = newFile('$testPackageLibPath/c.dart', r'''
-part of 'doesNotMatter.dart';
+part of my.lib;
 ''');
 
     final aState = fileStateFor(a);
+    aState.assertKind((kind) {
+      kind as LibraryFileStateKind;
+      expect(kind.name, 'my.lib');
+    });
     _assertPartedFiles(aState, [c]);
 
     // We set the library while reading `a.dart` file.
     final cState = fileStateFor(c);
     cState.assertKind((kind) {
-      kind as PartKnownFileStateKind;
+      kind as PartOfNameFileStateKind;
+      kind.assertLibraries([aState]);
       expect(kind.library, aState);
     });
 
     // Reading `b.dart` does not update the part.
     final bState = fileStateFor(b);
+    bState.assertKind((kind) {
+      kind as LibraryFileStateKind;
+      expect(kind.name, 'my.lib');
+    });
     _assertPartedFiles(bState, [c]);
     cState.assertKind((kind) {
-      kind as PartKnownFileStateKind;
+      kind as PartOfNameFileStateKind;
+      kind.assertLibraries([aState, bState]);
       expect(kind.library, aState);
     });
 
     // Refreshing `b.dart` does not update the part.
     bState.refresh();
     cState.assertKind((kind) {
-      kind as PartKnownFileStateKind;
+      kind as PartOfNameFileStateKind;
+      kind.assertLibraries([aState, bState]);
       expect(kind.library, aState);
     });
 
-    // Exclude the part from `a.dart` - switches to `b.dart` as its library.
+    // Refreshing `a.dart` does not update the part.
+    aState.refresh();
+    cState.assertKind((kind) {
+      kind as PartOfNameFileStateKind;
+      kind.assertLibraries([aState, bState]);
+      expect(kind.library, aState);
+    });
+
+    // Exclude the part from `a.dart`, switch to `b.dart` instead.
     newFile(a.path, '');
     aState.refresh();
     cState.assertKind((kind) {
-      kind as PartKnownFileStateKind;
+      kind as PartOfNameFileStateKind;
+      kind.assertLibraries([bState]);
       expect(kind.library, bState);
     });
 
-    // Exclude the part from `b.dart` as well - switches to unknown.
+    // Exclude the part from `b.dart`, no library.
     newFile(b.path, '');
     bState.refresh();
     cState.assertKind((kind) {
-      kind as PartUnknownUriFileStateKind;
+      kind as PartOfNameFileStateKind;
+      kind.assertLibraries([]);
+      expect(kind.library, isNull);
+    });
+
+    // Include into `b.dart`, use it as the library.
+    newFile(b.path, r'''
+library my.lib;
+part 'c.dart';
+''');
+    bState.refresh();
+    cState.assertKind((kind) {
+      kind as PartOfNameFileStateKind;
+      kind.assertLibraries([bState]);
+      expect(kind.library, bState);
+    });
+
+    // Include into `a.dart`, switch to `a.dart`.
+    newFile(a.path, r'''
+library my.lib;
+part 'c.dart';
+''');
+    aState.refresh();
+    cState.assertKind((kind) {
+      kind as PartOfNameFileStateKind;
+      kind.assertLibraries([aState, bState]);
+      expect(kind.library, aState);
     });
   }
 
   test_newFile_partOfUri_doesNotExist() async {
+    final a = getFile('$testPackageLibPath/a.dart');
+
     final b = newFile('$testPackageLibPath/b.dart', r'''
 part of 'a.dart';
 ''');
 
     final bState = fileStateFor(b);
 
-    // If the library does not part the file, it does not matter what the
-    // part file says - the part file will not be analyzed during the library
-    // analysis.
+    // The URI in `part of URI` tells us which library to use.
+    // However it does not exist, so it does not include the file, so the
+    // part file will not be analyzed during the library analysis.
     bState.assertKind((kind) {
-      kind as PartUnknownUriFileStateKind;
+      kind as PartOfUriKnownFileStateKind;
+      expect(kind.uriFile.path, a.path);
+      expect(kind.library, isNull);
     });
 
-    // Create the library that includes the part file.
-    final a = newFile('$testPackageLibPath/a.dart', r'''
+    final aState = fileStateFor(a);
+    expect(aState.exists, isFalse);
+    _assertPartedFiles(aState, []);
+    aState.assertKind((kind) {
+      kind as LibraryFileStateKind;
+    });
+    bState.assertKind((kind) {
+      kind as PartOfUriKnownFileStateKind;
+      expect(kind.uriFile, same(aState));
+      expect(kind.library, isNull);
+    });
+
+    // Create `a.dart` that includes the part file.
+    newFile(a.path, r'''
 part 'b.dart';
 ''');
 
     // The library file has already been read because of `part of uri`.
     // So, we explicitly refresh it.
-    final aState = fileStateFor(a);
     aState.refresh();
     _assertPartedFiles(aState, [b]);
 
     // Now the part file knows its library.
     bState.assertKind((kind) {
-      kind as PartKnownFileStateKind;
+      kind as PartOfUriKnownFileStateKind;
+      expect(kind.uriFile, same(aState));
       expect(kind.library, same(aState));
     });
 
     // Refreshing the part file does not break the kind.
     bState.refresh();
     bState.assertKind((kind) {
-      kind as PartKnownFileStateKind;
+      kind as PartOfUriKnownFileStateKind;
+      expect(kind.uriFile, same(aState));
       expect(kind.library, same(aState));
     });
   }
@@ -381,38 +837,51 @@
 ''');
 
     final bState = fileStateFor(b);
+    // We have not read the library file explicitly yet.
+    // But it was read because of the `part of` directive.
     bState.assertKind((kind) {
-      kind as PartKnownFileStateKind;
-      // We have not read the library file explicitly yet.
-      // But it was read because of the `part of` directive.
-      final aState = fileStateFor(a);
-      _assertPartedFiles(aState, [b]);
+      kind as PartOfUriKnownFileStateKind;
+      expect(kind.uriFile.path, a.path);
+      expect(kind.library?.path, a.path);
+    });
+
+    final aState = fileStateFor(a);
+    aState.assertKind((kind) {
+      kind as LibraryFileStateKind;
+    });
+    _assertPartedFiles(aState, [b]);
+    bState.assertKind((kind) {
+      kind as PartOfUriKnownFileStateKind;
+      expect(kind.uriFile, same(aState));
       expect(kind.library, same(aState));
     });
 
     // Refreshing the part file does not break the kind.
     bState.refresh();
     bState.assertKind((kind) {
-      kind as PartKnownFileStateKind;
-      final aState = fileStateFor(a);
+      kind as PartOfUriKnownFileStateKind;
+      expect(kind.uriFile, same(aState));
       expect(kind.library, same(aState));
     });
   }
 
   test_newFile_partOfUri_exists_noPart() async {
-    newFile('$testPackageLibPath/a.dart', '');
+    final a = newFile('$testPackageLibPath/a.dart', '');
 
     final b = newFile('$testPackageLibPath/b.dart', r'''
 part of 'a.dart';
 ''');
 
+    final aState = fileStateFor(a);
     final bState = fileStateFor(b);
 
-    // If the library does not part the file, it does not matter what the
-    // part file says - the part file will not be analyzed during the library
-    // analysis.
+    // The URI in `part of URI` tells us which library to use.
+    // However `a.dart` does not include `b.dart` as a part, so `b.dart` will
+    // not be analyzed during the library analysis.
     bState.assertKind((kind) {
-      kind as PartUnknownUriFileStateKind;
+      kind as PartOfUriKnownFileStateKind;
+      expect(kind.uriFile, same(aState));
+      expect(kind.library, isNull);
     });
   }
 
@@ -425,19 +894,265 @@
 
     // The URI is invalid, so there is no way to discover the library.
     bState.assertKind((kind) {
-      kind as PartUnknownUriFileStateKind;
+      kind as PartOfUriUnknownFileStateKind;
       expect(kind.directive.uri, 'da:');
     });
 
-    // But reading a library that includes this part will update it.
+    // Reading a library that includes this part does not change the fact
+    // that the URI in the `part of URI` in `b.dart` cannot be resolved.
     final a = newFile('$testPackageLibPath/a.dart', r'''
 part 'b.dart';
 ''');
     final aState = fileStateFor(a);
+    aState.assertKind((kind) {
+      kind as LibraryFileStateKind;
+    });
     _assertPartedFiles(aState, [b]);
 
     bState.assertKind((kind) {
-      kind as PartKnownFileStateKind;
+      kind as PartOfUriUnknownFileStateKind;
+      expect(kind.directive.uri, 'da:');
+    });
+  }
+
+  test_newFile_partOfUri_twoLibraries() async {
+    final a = newFile('$testPackageLibPath/a.dart', r'''
+part 'c.dart';
+''');
+
+    final b = newFile('$testPackageLibPath/b.dart', r'''
+part 'c.dart';
+''');
+
+    final c = newFile('$testPackageLibPath/c.dart', r'''
+part of 'a.dart';
+''');
+
+    final aState = fileStateFor(a);
+    _assertPartedFiles(aState, [c]);
+
+    // We set the library while reading `a.dart` file.
+    final cState = fileStateFor(c);
+    cState.assertKind((kind) {
+      kind as PartOfUriKnownFileStateKind;
+      expect(kind.library, aState);
+    });
+
+    // Reading `b.dart` does not update the part.
+    final bState = fileStateFor(b);
+    _assertPartedFiles(bState, [c]);
+    cState.assertKind((kind) {
+      kind as PartOfUriKnownFileStateKind;
+      expect(kind.library, aState);
+    });
+
+    // Refreshing `b.dart` does not update the part.
+    bState.refresh();
+    cState.assertKind((kind) {
+      kind as PartOfUriKnownFileStateKind;
+      expect(kind.library, aState);
+    });
+
+    // Refreshing `a.dart` does not update the part.
+    aState.refresh();
+    cState.assertKind((kind) {
+      kind as PartOfUriKnownFileStateKind;
+      expect(kind.library, aState);
+    });
+
+    // Exclude the part from `a.dart`, but the URI in `part of` still resolves
+    // to `a.dart`, so no changes.
+    newFile(a.path, '');
+    aState.refresh();
+    cState.assertKind((kind) {
+      kind as PartOfUriKnownFileStateKind;
+      expect(kind.uriFile, same(aState));
+      expect(kind.library, isNull);
+    });
+
+    // Exclude the part from `b.dart`, no changes.
+    newFile(b.path, '');
+    bState.refresh();
+    cState.assertKind((kind) {
+      kind as PartOfUriKnownFileStateKind;
+      expect(kind.uriFile, same(aState));
+      expect(kind.library, isNull);
+    });
+
+    // Include into `b.dart`, no changes.
+    newFile(b.path, r'''
+part 'c.dart';
+''');
+    bState.refresh();
+    cState.assertKind((kind) {
+      kind as PartOfUriKnownFileStateKind;
+      expect(kind.uriFile, same(aState));
+      expect(kind.library, isNull);
+    });
+
+    // Include into `a.dart`, no changes.
+    newFile(a.path, r'''
+part 'c.dart';
+''');
+    aState.refresh();
+    cState.assertKind((kind) {
+      kind as PartOfUriKnownFileStateKind;
+      expect(kind.uriFile, same(aState));
+      expect(kind.library, aState);
+    });
+  }
+
+  test_refresh_augmentation_to_library() async {
+    final a = newFile('$testPackageLibPath/a.dart', r'''
+import augment 'b.dart';
+''');
+
+    final b = newFile('$testPackageLibPath/b.dart', r'''
+library augment 'a.dart';
+''');
+
+    final aState = fileStateFor(a);
+    _assertAugmentationFiles(aState, [b]);
+
+    final bState = fileStateFor(b);
+    bState.assertKind((kind) {
+      kind as AugmentationKnownFileStateKind;
+      expect(kind.uriFile, same(aState));
+      expect(kind.augmented, same(aState));
+    });
+
+    // Make it a library.
+    newFile(b.path, '');
+
+    // Not an augmentation anymore, but a library.
+    bState.refresh();
+    bState.assertKind((kind) {
+      kind as LibraryFileStateKind;
+      expect(kind.name, isNull);
+    });
+
+    // But `a.dart` still uses `b.dart` as an augmentation.
+    _assertAugmentationFiles(aState, [b]);
+
+    // ...even if we attempt to refresh.
+    aState.refresh();
+    _assertAugmentationFiles(aState, [b]);
+  }
+
+  test_refresh_augmentation_to_partOfName() async {
+    final a = newFile('$testPackageLibPath/a.dart', r'''
+library my.lib;
+import augment 'b.dart';
+''');
+
+    final b = newFile('$testPackageLibPath/b.dart', r'''
+library augment 'a.dart';
+''');
+
+    final aState = fileStateFor(a);
+    _assertAugmentationFiles(aState, [b]);
+
+    final bState = fileStateFor(b);
+    bState.assertKind((kind) {
+      kind as AugmentationKnownFileStateKind;
+      expect(kind.uriFile, same(aState));
+      expect(kind.augmented, same(aState));
+    });
+
+    // Make it a part.
+    newFile(b.path, r'''
+part of my.lib;
+''');
+
+    // Not an augmentation anymore, but a part.
+    // This part can find the referenced library by name `my.lib`.
+    // But the library does not include this part, so no library.
+    bState.refresh();
+    bState.assertKind((kind) {
+      kind as PartOfNameFileStateKind;
+      kind.assertLibraries([aState]);
+      expect(kind.library, isNull);
+    });
+
+    // But `a.dart` still uses `b.dart` as an augmentation.
+    _assertAugmentationFiles(aState, [b]);
+    _assertPartedFiles(aState, []);
+
+    // ...even if we attempt to refresh.
+    aState.refresh();
+    _assertAugmentationFiles(aState, [b]);
+    _assertPartedFiles(aState, []);
+
+    // Now include `b.dart` into `a.dart` as a part.
+    newFile(a.path, r'''
+library my.lib;
+part 'b.dart';
+''');
+    aState.refresh();
+
+    // ...not an augmentation, but a known part.
+    _assertAugmentationFiles(aState, []);
+    _assertPartedFiles(aState, [b]);
+    bState.assertKind((kind) {
+      kind as PartOfNameFileStateKind;
+      kind.assertLibraries([aState]);
+      expect(kind.library, same(aState));
+    });
+  }
+
+  test_refresh_augmentation_to_partOfUri() async {
+    final a = newFile('$testPackageLibPath/a.dart', r'''
+import augment 'b.dart';
+''');
+
+    final b = newFile('$testPackageLibPath/b.dart', r'''
+library augment 'a.dart';
+''');
+
+    final aState = fileStateFor(a);
+    _assertAugmentationFiles(aState, [b]);
+
+    final bState = fileStateFor(b);
+    bState.assertKind((kind) {
+      kind as AugmentationKnownFileStateKind;
+      expect(kind.uriFile, same(aState));
+      expect(kind.augmented, same(aState));
+    });
+
+    // Make it a part.
+    newFile(b.path, r'''
+part of 'a.dart';
+''');
+
+    // Not an augmentation anymore, but a part.
+    bState.refresh();
+    bState.assertKind((kind) {
+      kind as PartOfUriKnownFileStateKind;
+      expect(kind.uriFile, same(aState));
+      expect(kind.library, isNull);
+    });
+
+    // But `a.dart` still uses `b.dart` as an augmentation.
+    _assertAugmentationFiles(aState, [b]);
+    _assertPartedFiles(aState, []);
+
+    // ...even if we attempt to refresh.
+    aState.refresh();
+    _assertAugmentationFiles(aState, [b]);
+    _assertPartedFiles(aState, []);
+
+    // Now include `b.dart` into `a.dart` as a part.
+    newFile(a.path, r'''
+part 'b.dart';
+''');
+    aState.refresh();
+
+    // ...not an augmentation, but a known part.
+    _assertAugmentationFiles(aState, []);
+    _assertPartedFiles(aState, [b]);
+    bState.assertKind((kind) {
+      kind as PartOfUriKnownFileStateKind;
+      expect(kind.uriFile, same(aState));
       expect(kind.library, same(aState));
     });
   }
@@ -460,6 +1175,7 @@
     final cState = fileStateFor(c);
     cState.assertKind((kind) {
       kind as LibraryFileStateKind;
+      expect(kind.name, 'my');
     });
     _assertPartedFiles(cState, [a, b]);
 
@@ -468,12 +1184,14 @@
 
     // Both part files know the library.
     aState.assertKind((kind) {
-      kind as PartKnownFileStateKind;
-      expect(kind.library, cState);
+      kind as PartOfNameFileStateKind;
+      kind.assertLibraries([cState]);
+      expect(kind.library, same(cState));
     });
     bState.assertKind((kind) {
-      kind as PartKnownFileStateKind;
-      expect(kind.library, cState);
+      kind as PartOfNameFileStateKind;
+      kind.assertLibraries([cState]);
+      expect(kind.library, same(cState));
     });
 
     newFile(c.path, r'''
@@ -485,24 +1203,27 @@
     cState.refresh();
     _assertPartedFiles(cState, [b]);
 
-    // So, the `a.dart` does not know its library anymore.
-    // But `b.dart` still knows it.
+    // The library does not include `a.dart` as a part anymore.
+    // The part `b.dart` is still connected.
     aState.assertKind((kind) {
-      kind as PartUnknownNameFileStateKind;
+      kind as PartOfNameFileStateKind;
+      kind.assertLibraries([cState]);
+      expect(kind.library, isNull);
     });
     bState.assertKind((kind) {
-      kind as PartKnownFileStateKind;
-      expect(kind.library, cState);
+      kind as PartOfNameFileStateKind;
+      kind.assertLibraries([cState]);
+      expect(kind.library, same(cState));
     });
   }
 
   test_refresh_library_removePart_partOfUri() async {
     final a = newFile('$testPackageLibPath/a.dart', r'''
-part of 'test.dart';
+part of 'c.dart';
 ''');
 
     final b = newFile('$testPackageLibPath/b.dart', r'''
-part of 'test.dart';
+part of 'c.dart';
 ''');
 
     final c = newFile('$testPackageLibPath/c.dart', r'''
@@ -514,6 +1235,7 @@
     final cState = fileStateFor(c);
     cState.assertKind((kind) {
       kind as LibraryFileStateKind;
+      expect(kind.name, 'my');
     });
     _assertPartedFiles(cState, [a, b]);
 
@@ -522,11 +1244,13 @@
 
     // Both part files know the library.
     aState.assertKind((kind) {
-      kind as PartKnownFileStateKind;
+      kind as PartOfUriKnownFileStateKind;
+      expect(kind.uriFile, cState);
       expect(kind.library, cState);
     });
     bState.assertKind((kind) {
-      kind as PartKnownFileStateKind;
+      kind as PartOfUriKnownFileStateKind;
+      expect(kind.uriFile, cState);
       expect(kind.library, cState);
     });
 
@@ -539,19 +1263,63 @@
     cState.refresh();
     _assertPartedFiles(cState, [b]);
 
-    // So, the `a.dart` does not know its library anymore.
-    // But `b.dart` still knows it.
+    // But the URIs in the `part of URI` are still the same.
+    // So, both parts are still linked to the library.
     aState.assertKind((kind) {
-      kind as PartUnknownUriFileStateKind;
+      kind as PartOfUriKnownFileStateKind;
+      expect(kind.uriFile, same(cState));
+      expect(kind.library, isNull);
     });
     bState.assertKind((kind) {
-      kind as PartKnownFileStateKind;
-      expect(kind.library, cState);
+      kind as PartOfUriKnownFileStateKind;
+      expect(kind.uriFile, cState);
+      expect(kind.library, same(cState));
     });
   }
 
+  test_refresh_library_to_augmentation() async {
+    final a = newFile('$testPackageLibPath/a.dart', r'''
+import augment 'b.dart';
+''');
+
+    final b = newFile('$testPackageLibPath/b.dart', r'''
+library b;
+''');
+
+    final aState = fileStateFor(a);
+    _assertAugmentationFiles(aState, [b]);
+
+    // TODO(scheglov) Restore.
+    // final aCycle_1 = aState.libraryCycle;
+
+    final bState = fileStateFor(b);
+    bState.assertKind((kind) {
+      kind as LibraryFileStateKind;
+      expect(kind.name, 'b');
+    });
+
+    newFile(b.path, r'''
+library augment 'a.dart';
+''');
+
+    // We will discover the target by URI.
+    bState.refresh();
+    bState.assertKind((kind) {
+      kind as AugmentationKnownFileStateKind;
+      expect(kind.uriFile, aState);
+      expect(kind.augmented, same(aState));
+    });
+
+    // The file `b.dart` was something else, but now it is a known augmentation.
+    // This affects libraries that include it.
+    // TODO(scheglov) Restore.
+    // final aCycle_2 = aState.libraryCycle;
+    // expect(aCycle_2.apiSignature, isNot(aCycle_1.apiSignature));
+  }
+
   test_refresh_library_to_partOfName() async {
     final a = newFile('$testPackageLibPath/a.dart', r'''
+library my.lib;
 part 'b.dart';
 ''');
 
@@ -568,6 +1336,7 @@
     final bState = fileStateFor(b);
     bState.assertKind((kind) {
       kind as LibraryFileStateKind;
+      expect(kind.name, isNull);
     });
 
     // Make it a part.
@@ -575,11 +1344,12 @@
 part of my.lib;
 ''');
 
-    // We will discover the library, by asking each of them.
+    // We will discover the library by name.
     bState.refresh();
     bState.assertKind((kind) {
-      kind as PartKnownFileStateKind;
-      expect(kind.library, same(aState));
+      kind as PartOfNameFileStateKind;
+      kind.assertLibraries([aState]);
+      expect(kind.library, aState);
     });
 
     // The file `b.dart` was something else, but now it is a known part.
@@ -596,6 +1366,7 @@
     final aState = fileStateFor(a);
     aState.assertKind((kind) {
       kind as LibraryFileStateKind;
+      expect(kind.name, 'my');
     });
 
     newFile(a.path, r'''
@@ -606,8 +1377,10 @@
 
     // No library that includes it, so it stays unknown.
     aState.assertKind((kind) {
-      kind as PartUnknownNameFileStateKind;
+      kind as PartOfNameFileStateKind;
       expect(kind.directive.name, 'my');
+      kind.assertLibraries([]);
+      expect(kind.library, isNull);
     });
   }
 
@@ -628,16 +1401,18 @@
     final bState = fileStateFor(b);
     bState.assertKind((kind) {
       kind as LibraryFileStateKind;
+      expect(kind.name, 'b');
     });
 
     newFile(b.path, r'''
 part of 'a.dart';
 ''');
 
-    // We will discover the library, by asking each of them.
+    // We will discover the library using the URI.
     bState.refresh();
     bState.assertKind((kind) {
-      kind as PartKnownFileStateKind;
+      kind as PartOfUriKnownFileStateKind;
+      expect(kind.uriFile, same(aState));
       expect(kind.library, same(aState));
     });
 
@@ -647,6 +1422,71 @@
     expect(aCycle_2.apiSignature, isNot(aCycle_1.apiSignature));
   }
 
+  test_refresh_partOfName_twoLibraries() async {
+    final a = newFile('$testPackageLibPath/a.dart', r'''
+part of my.lib;
+class A1 {}
+''');
+
+    final b = newFile('$testPackageLibPath/b.dart', r'''
+library my.lib;
+part 'a.dart';
+''');
+
+    final c = newFile('$testPackageLibPath/c.dart', r'''
+library my.lib;
+part 'a.dart';
+''');
+
+    final bState = fileStateFor(b);
+    bState.assertKind((kind) {
+      kind as LibraryFileStateKind;
+      expect(kind.name, 'my.lib');
+    });
+    _assertPartedFiles(bState, [a]);
+
+    final cState = fileStateFor(c);
+    cState.assertKind((kind) {
+      kind as LibraryFileStateKind;
+      expect(kind.name, 'my.lib');
+    });
+    _assertPartedFiles(cState, [a]);
+
+    final aState = fileStateFor(a);
+    aState.assertKind((kind) {
+      kind as PartOfNameFileStateKind;
+      expect(kind.directive.name, 'my.lib');
+      kind.assertLibraries([bState, cState]);
+      expect(kind.library, same(bState));
+    });
+
+    final bCycle_1 = bState.libraryCycle;
+    final cCycle_1 = cState.libraryCycle;
+
+    // Update `a.dart` part.
+    newFile(a.path, r'''
+part of my.lib;
+class A2 {}
+''');
+    aState.refresh();
+    // `a.dart` is still a part.
+    aState.assertKind((kind) {
+      kind as PartOfNameFileStateKind;
+      expect(kind.directive.name, 'my.lib');
+      kind.assertLibraries([bState, cState]);
+      expect(kind.library, same(bState));
+    });
+
+    // ...but the unlinked signature of `a.dart` is different.
+    // We invalidate `b.dart` it references `a.dart`.
+    // We invalidate `c.dart` it references `a.dart`.
+    // Even though `a.dart` is not a valid part of `c.dart`.
+    final bCycle_2 = bState.libraryCycle;
+    final cCycle_2 = cState.libraryCycle;
+    expect(bCycle_2.apiSignature, isNot(bCycle_1.apiSignature));
+    expect(cCycle_2.apiSignature, isNot(cCycle_1.apiSignature));
+  }
+
   test_refresh_partOfUri_to_library() async {
     final a = newFile('$testPackageLibPath/a.dart', r'''
 part 'b.dart';
@@ -659,6 +1499,7 @@
     final aState = fileStateFor(a);
     aState.assertKind((kind) {
       kind as LibraryFileStateKind;
+      expect(kind.name, isNull);
     });
     _assertPartedFiles(aState, [b]);
 
@@ -667,8 +1508,9 @@
     // There is `part of` in `b.dart`, so it is a part.
     final bState = fileStateFor(b);
     bState.assertKind((kind) {
-      kind as PartKnownFileStateKind;
-      expect(kind.library, aState);
+      kind as PartOfUriKnownFileStateKind;
+      expect(kind.uriFile, same(aState));
+      expect(kind.library, same(aState));
     });
 
     // There are no directives in `b.dart`, so it is a library.
@@ -678,6 +1520,7 @@
     bState.refresh();
     bState.assertKind((kind) {
       kind as LibraryFileStateKind;
+      expect(kind.name, isNull);
     });
 
     // Library `a.dart` still considers `b.dart` its part.
@@ -688,6 +1531,76 @@
     expect(aCycle_2.apiSignature, isNot(aCycle_1.apiSignature));
   }
 
+  test_refresh_partOfUri_twoLibraries() async {
+    final a = newFile('$testPackageLibPath/a.dart', r'''
+part of 'b.dart';
+class A1 {}
+''');
+
+    final b = newFile('$testPackageLibPath/b.dart', r'''
+part 'a.dart';
+''');
+
+    final c = newFile('$testPackageLibPath/c.dart', r'''
+part 'a.dart';
+''');
+
+    final bState = fileStateFor(b);
+    bState.assertKind((kind) {
+      kind as LibraryFileStateKind;
+      expect(kind.name, isNull);
+    });
+    _assertPartedFiles(bState, [a]);
+
+    final cState = fileStateFor(c);
+    cState.assertKind((kind) {
+      kind as LibraryFileStateKind;
+      expect(kind.name, isNull);
+    });
+    _assertPartedFiles(cState, [a]);
+
+    final aState = fileStateFor(a);
+    aState.assertKind((kind) {
+      kind as PartOfUriKnownFileStateKind;
+      expect(kind.uriFile, same(bState));
+      expect(kind.library, same(bState));
+    });
+
+    final bCycle_1 = bState.libraryCycle;
+    final cCycle_1 = cState.libraryCycle;
+
+    // Update `a.dart` part.
+    newFile(a.path, r'''
+part of 'b.dart';
+class A2 {}
+''');
+    aState.refresh();
+    // `a.dart` is still a part.
+    aState.assertKind((kind) {
+      kind as PartOfUriKnownFileStateKind;
+      expect(kind.uriFile, same(bState));
+      expect(kind.library, same(bState));
+    });
+
+    // ...but the unlinked signature of `a.dart` is different.
+    // We invalidate `b.dart` it references `a.dart`.
+    // We invalidate `c.dart` it references `a.dart`.
+    // Even though `a.dart` is not a valid part of `c.dart`.
+    final bCycle_2 = bState.libraryCycle;
+    final cCycle_2 = cState.libraryCycle;
+    expect(bCycle_2.apiSignature, isNot(bCycle_1.apiSignature));
+    expect(cCycle_2.apiSignature, isNot(cCycle_1.apiSignature));
+  }
+
+  void _assertAugmentationFiles(FileState fileState, List<File> expected) {
+    final actualFiles = fileState.augmentationFiles.map((part) {
+      if (part != null) {
+        return getFile(part.path);
+      }
+    }).toList();
+    expect(actualFiles, expected);
+  }
+
   void _assertPartedFiles(FileState fileState, List<File> expected) {
     final actualFiles = fileState.partedFiles.map((part) {
       if (part != null) {
@@ -1043,8 +1956,7 @@
     expect(file_a2.library, same(file_a1));
 
     // Now update the library, and refresh its file.
-    // The 'a2.dart' is not referenced anymore.
-    // So the part file does not have the library anymore.
+    // The library does not include this part, so no library.
     newFile(a1, r'''
 library a1;
 part 'not-a2.dart';
@@ -1545,6 +2457,15 @@
   }
 }
 
+extension on PartOfNameFileStateKind {
+  void assertLibraries(Iterable<FileState> expectedFiles) {
+    final expectedKinds = expectedFiles.map((e) {
+      return e.kind as LibraryFileStateKind;
+    }).toList();
+    expect(libraries, unorderedEquals(expectedKinds));
+  }
+}
+
 extension _Either2Extension<T1, T2> on Either2<T1, T2> {
   T1 get t1 {
     late T1 result;
diff --git a/pkg/analyzer/test/src/dart/analysis/test_all.dart b/pkg/analyzer/test/src/dart/analysis/test_all.dart
index 2c5030d..10ff606 100644
--- a/pkg/analyzer/test/src/dart/analysis/test_all.dart
+++ b/pkg/analyzer/test/src/dart/analysis/test_all.dart
@@ -12,7 +12,6 @@
 import 'context_root_test.dart' as context_root;
 import 'crc32_test.dart' as crc32_test;
 import 'defined_names_test.dart' as defined_names;
-import 'dependency/test_all.dart' as dependency_test;
 import 'driver_caching_test.dart' as driver_caching;
 import 'driver_resolution_test.dart' as driver_resolution;
 import 'driver_test.dart' as driver;
@@ -42,7 +41,6 @@
     context_root.main();
     crc32_test.main();
     defined_names.main();
-    dependency_test.main();
     driver.main();
     driver_caching.main();
     driver_resolution.main();
diff --git a/pkg/analyzer/test/src/dart/analysis/unlinked_api_signature_test.dart b/pkg/analyzer/test/src/dart/analysis/unlinked_api_signature_test.dart
index 21157c3..4e29972 100644
--- a/pkg/analyzer/test/src/dart/analysis/unlinked_api_signature_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/unlinked_api_signature_test.dart
@@ -1010,6 +1010,16 @@
 ''');
   }
 
+  test_executable_body_block_to_native() {
+    _assertNotSameSignature_executable(r'''
+int foo() {
+  return 0;
+}
+''', r'''
+int foo() native;
+''');
+  }
+
   test_executable_body_expression() {
     _assertSameSignature_executable(r'''
 int foo() => 1;
@@ -1028,6 +1038,32 @@
 ''');
   }
 
+  test_executable_body_expression_to_native() {
+    _assertNotSameSignature_executable(r'''
+int foo() => 0;
+''', r'''
+int foo() native;
+''');
+  }
+
+  test_executable_body_native_to_block() {
+    _assertNotSameSignature_executable(r'''
+int foo() native;
+''', r'''
+int foo() {
+  return 0;
+}
+''');
+  }
+
+  test_executable_body_native_to_expression() {
+    _assertNotSameSignature_executable(r'''
+int foo() native;
+''', r'''
+int foo() => 0;
+''');
+  }
+
   test_executable_body_sync_to_async() {
     _assertNotSameSignature_executable(r'''
 foo() {}
diff --git a/pkg/analyzer/test/src/dart/element/element_test.dart b/pkg/analyzer/test/src/dart/element/element_test.dart
index 6873d5f..0f13ac7 100644
--- a/pkg/analyzer/test/src/dart/element/element_test.dart
+++ b/pkg/analyzer/test/src/dart/element/element_test.dart
@@ -524,14 +524,14 @@
     (library1.definingCompilationUnit).classes = <ClassElement>[classElement];
     LibraryElementImpl library2 =
         ElementFactory.library(analysisContext, "lib2");
-    expect(classElement.isAccessibleIn(library2), isFalse);
+    expect(classElement.isAccessibleIn2(library2), isFalse);
   }
 
   void test_isAccessibleIn_private_sameLibrary() {
     LibraryElementImpl library = ElementFactory.library(analysisContext, "lib");
     ClassElement classElement = ElementFactory.classElement2("_C");
     (library.definingCompilationUnit).classes = <ClassElement>[classElement];
-    expect(classElement.isAccessibleIn(library), isTrue);
+    expect(classElement.isAccessibleIn2(library), isTrue);
   }
 
   void test_isAccessibleIn_public_differentLibrary() {
@@ -541,14 +541,14 @@
     (library1.definingCompilationUnit).classes = <ClassElement>[classElement];
     LibraryElementImpl library2 =
         ElementFactory.library(analysisContext, "lib2");
-    expect(classElement.isAccessibleIn(library2), isTrue);
+    expect(classElement.isAccessibleIn2(library2), isTrue);
   }
 
   void test_isAccessibleIn_public_sameLibrary() {
     LibraryElementImpl library = ElementFactory.library(analysisContext, "lib");
     ClassElement classElement = ElementFactory.classElement2("C");
     (library.definingCompilationUnit).classes = <ClassElement>[classElement];
-    expect(classElement.isAccessibleIn(library), isTrue);
+    expect(classElement.isAccessibleIn2(library), isTrue);
   }
 
   void test_isPrivate_false() {
diff --git a/pkg/analyzer/test/src/dart/resolution/assignment_test.dart b/pkg/analyzer/test/src/dart/resolution/assignment_test.dart
index 2a5f408..a694e0b 100644
--- a/pkg/analyzer/test/src/dart/resolution/assignment_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/assignment_test.dart
@@ -100,6 +100,7 @@
     leftBracket: [
     index: IntegerLiteral
       literal: 0
+      parameter: self::@class::A::@method::[]=::@parameter::index
       staticType: int
     rightBracket: ]
     staticElement: <null>
@@ -107,6 +108,7 @@
   operator: +=
   rightHandSide: IntegerLiteral
     literal: 2
+    parameter: dart:core::@class::num::@method::+::@parameter::other
     staticType: int
   readElement: self::@class::A::@method::[]
   readType: int
@@ -141,6 +143,7 @@
     leftBracket: [
     index: IntegerLiteral
       literal: 0
+      parameter: self::@class::A::@method::[]=::@parameter::index
       staticType: int
     rightBracket: ]
     staticElement: <null>
@@ -148,6 +151,7 @@
   operator: +=
   rightHandSide: IntegerLiteral
     literal: 2
+    parameter: dart:core::@class::num::@method::+::@parameter::other
     staticType: int
   readElement: self::@class::A::@method::[]
   readType: int
@@ -182,6 +186,7 @@
     leftBracket: [
     index: IntegerLiteral
       literal: 0
+      parameter: self::@class::A::@method::[]=::@parameter::index
       staticType: int
     rightBracket: ]
     staticElement: <null>
@@ -189,6 +194,7 @@
   operator: +=
   rightHandSide: DoubleLiteral
     literal: 2.0
+    parameter: dart:core::@class::num::@method::+::@parameter::other
     staticType: double
   readElement: self::@class::A::@method::[]
   readType: num
@@ -223,6 +229,7 @@
     leftBracket: [
     index: IntegerLiteral
       literal: 0
+      parameter: self::@class::A::@method::[]=::@parameter::index
       staticType: int
     rightBracket: ]
     staticElement: <null>
@@ -230,6 +237,7 @@
   operator: ??=
   rightHandSide: IntegerLiteral
     literal: 2
+    parameter: <null>
     staticType: int
   readElement: self::@class::A::@method::[]
   readType: int?
@@ -263,6 +271,7 @@
     leftBracket: [
     index: IntegerLiteral
       literal: 0
+      parameter: self::@class::A::@method::[]=::@parameter::index
       staticType: int
     rightBracket: ]
     staticElement: <null>
@@ -270,6 +279,7 @@
   operator: =
   rightHandSide: IntegerLiteral
     literal: 2
+    parameter: self::@class::A::@method::[]=::@parameter::_
     staticType: int
   readElement: <null>
   readType: null
@@ -305,6 +315,7 @@
     leftBracket: [
     index: IntegerLiteral
       literal: 0
+      parameter: self::@class::A::@method::[]=::@parameter::index
       staticType: int
     rightBracket: ]
     staticElement: <null>
@@ -312,6 +323,7 @@
   operator: +=
   rightHandSide: IntegerLiteral
     literal: 2
+    parameter: dart:core::@class::num::@method::+::@parameter::other
     staticType: int
   readElement: self::@class::A::@method::[]
   readType: int
@@ -345,6 +357,7 @@
     leftBracket: [
     index: IntegerLiteral
       literal: 0
+      parameter: self::@class::A::@method::[]=::@parameter::index
       staticType: int
     rightBracket: ]
     staticElement: <null>
@@ -352,6 +365,7 @@
   operator: +=
   rightHandSide: IntegerLiteral
     literal: 2
+    parameter: dart:core::@class::num::@method::+::@parameter::other
     staticType: int
   readElement: self::@class::A::@method::[]
   readType: int
@@ -384,6 +398,7 @@
     leftBracket: [
     index: SimpleIdentifier
       token: b
+      parameter: <null>
       staticElement: <null>
       staticType: dynamic
     rightBracket: ]
@@ -392,6 +407,7 @@
   operator: =
   rightHandSide: SimpleIdentifier
     token: c
+    parameter: <null>
     staticElement: self::@function::f::@parameter::c
     staticType: int
   readElement: <null>
@@ -425,6 +441,7 @@
     leftBracket: [
     index: SimpleIdentifier
       token: b
+      parameter: <null>
       staticElement: <null>
       staticType: dynamic
     rightBracket: ]
@@ -433,6 +450,7 @@
   operator: =
   rightHandSide: SimpleIdentifier
     token: c
+    parameter: <null>
     staticElement: self::@function::f::@parameter::c
     staticType: int
   readElement: <null>
@@ -469,6 +487,7 @@
     leftBracket: [
     index: SimpleIdentifier
       token: b
+      parameter: self::@class::A::@method::[]=::@parameter::index
       staticElement: <null>
       staticType: dynamic
     rightBracket: ]
@@ -477,6 +496,7 @@
   operator: =
   rightHandSide: SimpleIdentifier
     token: c
+    parameter: self::@class::A::@method::[]=::@parameter::_
     staticElement: self::@function::f::@parameter::c
     staticType: int
   readElement: <null>
@@ -510,6 +530,7 @@
     operator: +
     rightOperand: SimpleIdentifier
       token: b
+      parameter: dart:core::@class::num::@method::+::@parameter::other
       staticElement: self::@function::f::@parameter::b
       staticType: int
     staticElement: dart:core::@class::num::@method::+
@@ -518,6 +539,7 @@
   operator: +=
   rightHandSide: SimpleIdentifier
     token: c
+    parameter: <null>
     staticElement: self::@function::f::@parameter::c
     staticType: double
   readElement: <null>
@@ -553,6 +575,7 @@
       operator: +
       rightOperand: SimpleIdentifier
         token: b
+        parameter: dart:core::@class::num::@method::+::@parameter::other
         staticElement: self::@function::f::@parameter::b
         staticType: int
       staticElement: dart:core::@class::num::@method::+
@@ -563,6 +586,7 @@
   operator: +=
   rightHandSide: SimpleIdentifier
     token: c
+    parameter: <null>
     staticElement: self::@function::f::@parameter::c
     staticType: double
   readElement: <null>
@@ -598,6 +622,7 @@
       operator: +
       rightOperand: SimpleIdentifier
         token: b
+        parameter: dart:core::@class::num::@method::+::@parameter::other
         staticElement: self::@function::f::@parameter::b
         staticType: int
       staticElement: dart:core::@class::num::@method::+
@@ -608,6 +633,7 @@
   operator: =
   rightHandSide: SimpleIdentifier
     token: c
+    parameter: <null>
     staticElement: self::@function::f::@parameter::c
     staticType: double
   readElement: <null>
@@ -648,6 +674,7 @@
   operator: +=
   rightHandSide: SimpleIdentifier
     token: y
+    parameter: <null>
     staticElement: self::@function::f::@parameter::y
     staticType: int
   readElement: <null>
@@ -688,6 +715,7 @@
   operator: ??=
   rightHandSide: SimpleIdentifier
     token: y
+    parameter: <null>
     staticElement: self::@function::f::@parameter::y
     staticType: int
   readElement: <null>
@@ -728,6 +756,7 @@
   operator: =
   rightHandSide: SimpleIdentifier
     token: y
+    parameter: <null>
     staticElement: self::@function::f::@parameter::y
     staticType: int
   readElement: <null>
@@ -768,6 +797,7 @@
   operator: +=
   rightHandSide: SimpleIdentifier
     token: y
+    parameter: <null>
     staticElement: self::@function::f::@parameter::y
     staticType: int
   readElement: <null>
@@ -808,6 +838,7 @@
   operator: ??=
   rightHandSide: SimpleIdentifier
     token: y
+    parameter: <null>
     staticElement: self::@function::f::@parameter::y
     staticType: int
   readElement: <null>
@@ -848,6 +879,7 @@
   operator: =
   rightHandSide: SimpleIdentifier
     token: y
+    parameter: <null>
     staticElement: self::@function::f::@parameter::y
     staticType: int
   readElement: <null>
@@ -883,6 +915,7 @@
   operator: =
   rightHandSide: IntegerLiteral
     literal: 0
+    parameter: <null>
     staticType: int
   readElement: <null>
   readType: null
@@ -915,6 +948,7 @@
   operator: =
   rightHandSide: IntegerLiteral
     literal: 0
+    parameter: <null>
     staticType: int
   readElement: <null>
   readType: null
@@ -967,6 +1001,7 @@
   operator: +=
   rightHandSide: IntegerLiteral
     literal: 2
+    parameter: dart:core::@class::num::@method::+::@parameter::other
     staticType: int
   readElement: self::@class::A::@getter::x
   readType: int
@@ -1008,6 +1043,7 @@
   operator: ??=
   rightHandSide: IntegerLiteral
     literal: 2
+    parameter: <null>
     staticType: int
   readElement: self::@class::A::@getter::x
   readType: int?
@@ -1048,6 +1084,7 @@
   operator: =
   rightHandSide: IntegerLiteral
     literal: 2
+    parameter: self::@class::A::@setter::x::@parameter::_
     staticType: int
   readElement: <null>
   readType: null
@@ -1090,6 +1127,7 @@
   operator: =
   rightHandSide: IntegerLiteral
     literal: 2
+    parameter: <null>
     staticType: int
   readElement: <null>
   readType: null
@@ -1130,6 +1168,7 @@
   operator: =
   rightHandSide: IntegerLiteral
     literal: 2
+    parameter: self::@class::A::@setter::x::@parameter::_
     staticType: int
   readElement: <null>
   readType: null
@@ -1172,6 +1211,7 @@
   operator: =
   rightHandSide: IntegerLiteral
     literal: 2
+    parameter: <null>
     staticType: int
   readElement: <null>
   readType: null
@@ -1214,6 +1254,7 @@
   operator: +=
   rightHandSide: IntegerLiteral
     literal: 2
+    parameter: dart:core::@class::num::@method::+::@parameter::other
     staticType: int
   readElement: package:test/a.dart::@getter::x
   readType: int
@@ -1257,6 +1298,7 @@
   operator: +=
   rightHandSide: IntegerLiteral
     literal: 2
+    parameter: dart:core::@class::num::@method::+::@parameter::other
     staticType: int
   readElement: self::@class::A::@getter::x
   readType: int
@@ -1295,6 +1337,7 @@
   operator: =
   rightHandSide: SimpleIdentifier
     token: c
+    parameter: <null>
     staticElement: self::@function::f::@parameter::c
     staticType: int
   readElement: <null>
@@ -1335,6 +1378,7 @@
   operator: +=
   rightHandSide: SimpleIdentifier
     token: c
+    parameter: <null>
     staticElement: self::@function::f::@parameter::c
     staticType: int
   readElement: <null>
@@ -1372,6 +1416,7 @@
   operator: +=
   rightHandSide: IntegerLiteral
     literal: 2
+    parameter: dart:core::@class::num::@method::+::@parameter::other
     staticType: int
   readElement: self::@class::A::@getter::x
   readType: int
@@ -1424,6 +1469,7 @@
   operator: =
   rightHandSide: IntegerLiteral
     literal: 1
+    parameter: self::@class::A::@setter::x::@parameter::_x
     staticType: int
   readElement: <null>
   readType: null
@@ -1468,6 +1514,7 @@
   operator: +=
   rightHandSide: IntegerLiteral
     literal: 2
+    parameter: dart:core::@class::num::@method::+::@parameter::other
     staticType: int
   readElement: self::@class::A::@getter::x
   readType: int
@@ -1520,6 +1567,7 @@
   operator: +=
   rightHandSide: IntegerLiteral
     literal: 2
+    parameter: dart:core::@class::num::@method::+::@parameter::other
     staticType: int
   readElement: self::@class::M2::@getter::x
   readType: int
@@ -1564,6 +1612,7 @@
   operator: ??=
   rightHandSide: IntegerLiteral
     literal: 2
+    parameter: <null>
     staticType: int
   readElement: self::@class::A::@getter::x
   readType: int?
@@ -1607,6 +1656,7 @@
   operator: =
   rightHandSide: IntegerLiteral
     literal: 2
+    parameter: self::@class::A::@setter::x::@parameter::_
     staticType: int
   readElement: <null>
   readType: null
@@ -1651,6 +1701,7 @@
   operator: +=
   rightHandSide: IntegerLiteral
     literal: 2
+    parameter: dart:core::@class::num::@method::+::@parameter::other
     staticType: int
   readElement: self::@class::A::@getter::x
   readType: int
@@ -1690,6 +1741,7 @@
   operator: +=
   rightHandSide: IntegerLiteral
     literal: 2
+    parameter: dart:core::@class::num::@method::+::@parameter::other
     staticType: int
   readElement: self::@class::A::@getter::x
   readType: int
@@ -1731,6 +1783,7 @@
   operator: =
   rightHandSide: SimpleIdentifier
     token: c
+    parameter: <null>
     staticElement: self::@function::f::@parameter::c
     staticType: int
   readElement: <null>
@@ -1773,6 +1826,7 @@
   operator: =
   rightHandSide: SimpleIdentifier
     token: c
+    parameter: <null>
     staticElement: self::@function::f::@parameter::c
     staticType: int
   readElement: <null>
@@ -1806,6 +1860,7 @@
   operator: =
   rightHandSide: IntegerLiteral
     literal: 2
+    parameter: self::@class::C::@setter::x::@parameter::_x
     staticType: int
   readElement: <null>
   readType: null
@@ -1838,6 +1893,7 @@
   operator: =
   rightHandSide: IntegerLiteral
     literal: 2
+    parameter: self::@class::C::@setter::x::@parameter::_x
     staticType: int
   readElement: <null>
   readType: null
@@ -1872,6 +1928,7 @@
   operator: =
   rightHandSide: IntegerLiteral
     literal: 2
+    parameter: <null>
     staticType: int
   readElement: <null>
   readType: null
@@ -1906,6 +1963,7 @@
   operator: =
   rightHandSide: IntegerLiteral
     literal: 2
+    parameter: <null>
     staticType: int
   readElement: <null>
   readType: null
@@ -1938,6 +1996,7 @@
   operator: =
   rightHandSide: IntegerLiteral
     literal: 2
+    parameter: <null>
     staticType: int
   readElement: <null>
   readType: null
@@ -1977,6 +2036,7 @@
   operator: =
   rightHandSide: IntegerLiteral
     literal: 2
+    parameter: <null>
     staticType: int
   readElement: <null>
   readType: null
@@ -2009,6 +2069,7 @@
   operator: =
   rightHandSide: IntegerLiteral
     literal: 2
+    parameter: <null>
     staticType: int
   readElement: <null>
   readType: null
@@ -2039,6 +2100,7 @@
   operator: +=
   rightHandSide: IntegerLiteral
     literal: 3
+    parameter: dart:core::@class::num::@method::+::@parameter::other
     staticType: int
   readElement: x@51
   readType: num
@@ -2069,6 +2131,7 @@
   operator: =
   rightHandSide: IntegerLiteral
     literal: 2
+    parameter: <null>
     staticType: int
   readElement: <null>
   readType: null
@@ -2101,6 +2164,7 @@
   operator: =
   rightHandSide: IntegerLiteral
     literal: 2
+    parameter: <null>
     staticType: int
   readElement: <null>
   readType: null
@@ -2133,6 +2197,7 @@
   operator: =
   rightHandSide: IntegerLiteral
     literal: 2
+    parameter: <null>
     staticType: int
   readElement: <null>
   readType: null
@@ -2161,6 +2226,7 @@
   operator: ??=
   rightHandSide: IntegerLiteral
     literal: 0
+    parameter: <null>
     staticType: int
   readElement: self::@function::f::@parameter::x
   readType: num?
@@ -2205,6 +2271,7 @@
     argumentList: ArgumentList
       leftParenthesis: (
       rightParenthesis: )
+    parameter: <null>
     staticType: C
   readElement: self::@function::f::@parameter::x
   readType: B?
@@ -2235,6 +2302,7 @@
   operator: ??=
   rightHandSide: SimpleIdentifier
     token: b
+    parameter: <null>
     staticElement: self::@function::f::@parameter::b
     staticType: int
   readElement: self::@function::f::@parameter::a
@@ -2301,6 +2369,7 @@
   operator: =
   rightHandSide: IntegerLiteral
     literal: 2
+    parameter: <null>
     staticType: int
   readElement: <null>
   readType: null
@@ -2331,6 +2400,7 @@
   operator: =
   rightHandSide: IntegerLiteral
     literal: 1
+    parameter: <null>
     staticType: double
   readElement: <null>
   readType: null
@@ -2361,6 +2431,7 @@
   operator: =
   rightHandSide: BooleanLiteral
     literal: true
+    parameter: <null>
     staticType: bool
   readElement: <null>
   readType: null
@@ -2391,6 +2462,7 @@
   operator: =
   rightHandSide: IntegerLiteral
     literal: 2
+    parameter: <null>
     staticType: int
   readElement: <null>
   readType: null
@@ -2430,6 +2502,7 @@
   operator: =
   rightHandSide: IntegerLiteral
     literal: 2
+    parameter: <null>
     staticType: int
   readElement: <null>
   readType: null
@@ -2469,6 +2542,7 @@
   operator: =
   rightHandSide: IntegerLiteral
     literal: 2
+    parameter: <null>
     staticType: int
   readElement: <null>
   readType: null
@@ -2503,6 +2577,7 @@
   operator: =
   rightHandSide: IntegerLiteral
     literal: 2
+    parameter: self::@class::A::@setter::x::@parameter::_
     staticType: int
   readElement: <null>
   readType: null
@@ -2533,6 +2608,7 @@
   operator: =
   rightHandSide: SimpleIdentifier
     token: y
+    parameter: <null>
     staticElement: self::@function::f::@parameter::y
     staticType: int
   readElement: <null>
@@ -2570,6 +2646,7 @@
   operator: =
   rightHandSide: IntegerLiteral
     literal: 2
+    parameter: self::@class::A::@setter::x::@parameter::_x
     staticType: int
   readElement: <null>
   readType: null
@@ -2603,6 +2680,7 @@
   operator: +=
   rightHandSide: IntegerLiteral
     literal: 2
+    parameter: dart:core::@class::num::@method::+::@parameter::other
     staticType: int
   readElement: self::@class::C::@getter::x
   readType: int
@@ -2643,6 +2721,7 @@
   operator: +=
   rightHandSide: IntegerLiteral
     literal: 2
+    parameter: dart:core::@class::num::@method::+::@parameter::other
     staticType: int
   readElement: self::@class::M2::@getter::x
   readType: int
@@ -2676,6 +2755,7 @@
   operator: ??=
   rightHandSide: IntegerLiteral
     literal: 2
+    parameter: <null>
     staticType: int
   readElement: self::@class::C::@getter::x
   readType: int?
@@ -2715,6 +2795,7 @@
   operator: =
   rightHandSide: IntegerLiteral
     literal: 2
+    parameter: <null>
     staticType: int
   readElement: <null>
   readType: null
@@ -2746,6 +2827,7 @@
   operator: +=
   rightHandSide: IntegerLiteral
     literal: 2
+    parameter: dart:core::@class::num::@method::+::@parameter::other
     staticType: int
   readElement: self::@getter::x
   readType: int
@@ -2793,6 +2875,7 @@
     argumentList: ArgumentList
       leftParenthesis: (
       rightParenthesis: )
+    parameter: <null>
     staticType: C
   readElement: self::@getter::x
   readType: B?
@@ -2826,6 +2909,7 @@
   operator: +=
   rightHandSide: IntegerLiteral
     literal: 2
+    parameter: dart:core::@class::num::@method::+::@parameter::other
     staticType: int
   readElement: self::@getter::x
   readType: int
@@ -2856,6 +2940,7 @@
   operator: =
   rightHandSide: IntegerLiteral
     literal: 2
+    parameter: self::@setter::x::@parameter::_x
     staticType: int
   readElement: <null>
   readType: null
@@ -2888,6 +2973,7 @@
   operator: =
   rightHandSide: BooleanLiteral
     literal: true
+    parameter: self::@setter::x::@parameter::_x
     staticType: bool
   readElement: <null>
   readType: null
@@ -2920,6 +3006,7 @@
   operator: =
   rightHandSide: IntegerLiteral
     literal: 2
+    parameter: <null>
     staticType: int
   readElement: <null>
   readType: null
@@ -2950,6 +3037,7 @@
   operator: +=
   rightHandSide: IntegerLiteral
     literal: 3
+    parameter: <null>
     staticType: int
   readElement: dart:core::@class::int
   readType: dynamic
@@ -2980,6 +3068,7 @@
   operator: =
   rightHandSide: IntegerLiteral
     literal: 0
+    parameter: <null>
     staticType: int
   readElement: <null>
   readType: null
@@ -3010,6 +3099,7 @@
   operator: +=
   rightHandSide: IntegerLiteral
     literal: 1
+    parameter: <null>
     staticType: int
   readElement: <null>
   readType: dynamic
@@ -3040,6 +3130,7 @@
   operator: =
   rightHandSide: SimpleIdentifier
     token: a
+    parameter: <null>
     staticElement: self::@function::f::@parameter::a
     staticType: int
   readElement: <null>
diff --git a/pkg/analyzer/test/src/dart/resolution/ast_rewrite_test.dart b/pkg/analyzer/test/src/dart/resolution/ast_rewrite_test.dart
index 6a8b233..f2100ef 100644
--- a/pkg/analyzer/test/src/dart/resolution/ast_rewrite_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/ast_rewrite_test.dart
@@ -399,6 +399,9 @@
     arguments
       IntegerLiteral
         literal: 0
+        parameter: ParameterMember
+          base: self::@class::A::@constructor::•::@parameter::a
+          substitution: {T: int, U: String}
         staticType: int
     rightParenthesis: )
   staticType: A<int, String>
@@ -464,6 +467,9 @@
     arguments
       IntegerLiteral
         literal: 0
+        parameter: ParameterMember
+          base: self::@function::A::@parameter::a
+          substitution: {T: int, U: String}
         staticType: int
     rightParenthesis: )
   staticInvokeType: void Function(int)
@@ -521,6 +527,9 @@
     arguments
       IntegerLiteral
         literal: 0
+        parameter: ParameterMember
+          base: self::@class::A::@constructor::•::@parameter::_
+          substitution: {T: int, U: String}
         staticType: int
     rightParenthesis: )
   staticType: A<int, String>
@@ -590,6 +599,9 @@
     arguments
       IntegerLiteral
         literal: 0
+        parameter: ParameterMember
+          base: package:test/a.dart::@class::A::@constructor::named::@parameter::a
+          substitution: {T: int}
         staticType: int
     rightParenthesis: )
   staticType: A<int>
@@ -658,6 +670,9 @@
     arguments
       IntegerLiteral
         literal: 0
+        parameter: ParameterMember
+          base: package:test/a.dart::@class::A::@constructor::named::@parameter::a
+          substitution: {T: int}
         staticType: int
     rightParenthesis: )
   staticType: A<int>
@@ -726,6 +741,9 @@
     arguments
       IntegerLiteral
         literal: 0
+        parameter: ParameterMember
+          base: package:test/a.dart::@class::A::@constructor::•::@parameter::a
+          substitution: {T: int}
         staticType: int
     rightParenthesis: )
   staticType: A<int>
@@ -774,6 +792,7 @@
     arguments
       IntegerLiteral
         literal: 0
+        parameter: package:test/a.dart::@class::A::@method::bar::@parameter::a
         staticType: int
     rightParenthesis: )
   staticInvokeType: void Function(int)
@@ -831,6 +850,9 @@
     arguments
       IntegerLiteral
         literal: 0
+        parameter: ParameterMember
+          base: package:test/a.dart::@class::A::@constructor::named::@parameter::a
+          substitution: {T: int}
         staticType: int
     rightParenthesis: )
   staticType: A<int>
@@ -873,6 +895,9 @@
     arguments
       IntegerLiteral
         literal: 0
+        parameter: ParameterMember
+          base: self::@class::A::@constructor::named::@parameter::a
+          substitution: {T: int}
         staticType: int
     rightParenthesis: )
   staticType: A<int>
@@ -936,6 +961,9 @@
     arguments
       IntegerLiteral
         literal: 0
+        parameter: ParameterMember
+          base: self::@class::A::@constructor::named::@parameter::a
+          substitution: {T: dynamic, U: dynamic}
         staticType: int
     rightParenthesis: )
   staticType: A<dynamic, dynamic>
@@ -999,6 +1027,9 @@
     arguments
       IntegerLiteral
         literal: 0
+        parameter: ParameterMember
+          base: self::@class::A::@constructor::•::@parameter::a
+          substitution: {T: dynamic, U: dynamic}
         staticType: int
     rightParenthesis: )
   staticType: A<dynamic, dynamic>
@@ -1077,6 +1108,9 @@
     arguments
       IntegerLiteral
         literal: 0
+        parameter: ParameterMember
+          base: package:test/a.dart::@class::A::@constructor::•::@parameter::a
+          substitution: {T: int, U: String}
         staticType: int
     rightParenthesis: )
   staticType: A<int, String>
@@ -1158,6 +1192,9 @@
     arguments
       IntegerLiteral
         literal: 0
+        parameter: ParameterMember
+          base: package:test/a.dart::@function::A::@parameter::a
+          substitution: {T: int, U: String}
         staticType: int
     rightParenthesis: )
   staticInvokeType: void Function(int)
@@ -1206,6 +1243,9 @@
     arguments
       IntegerLiteral
         literal: 0
+        parameter: ParameterMember
+          base: self::@class::A::@constructor::named::@parameter::a
+          substitution: {T: int}
         staticType: int
     rightParenthesis: )
   staticType: A<int>
diff --git a/pkg/analyzer/test/src/dart/resolution/binary_expression_test.dart b/pkg/analyzer/test/src/dart/resolution/binary_expression_test.dart
index a848c7c..4d89bf3 100644
--- a/pkg/analyzer/test/src/dart/resolution/binary_expression_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/binary_expression_test.dart
@@ -36,6 +36,9 @@
       arguments
         NullLiteral
           literal: null
+          parameter: ParameterMember
+            base: root::@parameter::t
+            substitution: {T: int?}
           staticType: Null
       rightParenthesis: )
     staticInvokeType: int? Function(int?)
@@ -45,6 +48,7 @@
   operator: ??
   rightOperand: IntegerLiteral
     literal: 0
+    parameter: <null>
     staticType: int
   staticElement: <null>
   staticInvokeType: null
@@ -68,6 +72,7 @@
   operator: ??
   rightOperand: SimpleIdentifier
     token: y
+    parameter: <null>
     staticElement: self::@function::f::@parameter::y
     staticType: int
   staticElement: <null>
@@ -92,6 +97,7 @@
   operator: ??
   rightOperand: SimpleIdentifier
     token: y
+    parameter: <null>
     staticElement: self::@function::f::@parameter::y
     staticType: double?
   staticElement: <null>
@@ -116,6 +122,7 @@
   operator: ??
   rightOperand: SimpleIdentifier
     token: x
+    parameter: <null>
     staticElement: self::@function::f::@parameter::x
     staticType: int?
   staticElement: <null>
@@ -140,6 +147,7 @@
   operator: +
   rightOperand: SimpleIdentifier
     token: b
+    parameter: dart:core::@class::num::@method::+::@parameter::other
     staticElement: self::@function::f::@parameter::b
     staticType: Never
   staticElement: dart:core::@class::num::@method::+
@@ -167,6 +175,7 @@
   operator: +
   rightOperand: SimpleIdentifier
     token: b
+    parameter: <null>
     staticElement: self::@function::f::@parameter::b
     staticType: int
   staticElement: <null>
@@ -193,6 +202,7 @@
   operator: !=
   rightOperand: SimpleIdentifier
     token: b
+    parameter: dart:core::@class::num::@method::==::@parameter::other
     staticElement: self::@function::f::@parameter::b
     staticType: int
   staticElement: dart:core::@class::num::@method::==
@@ -224,6 +234,7 @@
       arguments
         SimpleIdentifier
           token: a
+          parameter: <null>
           staticElement: self::@function::f::@parameter::a
           staticType: int
       rightParenthesis: )
@@ -232,6 +243,7 @@
   operator: !=
   rightOperand: IntegerLiteral
     literal: 0
+    parameter: <null>
     staticType: int
   staticElement: <null>
   staticInvokeType: null
@@ -257,6 +269,7 @@
   operator: !==
   rightOperand: SimpleIdentifier
     token: b
+    parameter: <null>
     staticElement: self::@function::f::@parameter::b
     staticType: int
   staticElement: <null>
@@ -281,6 +294,7 @@
   operator: ==
   rightOperand: SimpleIdentifier
     token: b
+    parameter: dart:core::@class::num::@method::==::@parameter::other
     staticElement: self::@function::f::@parameter::b
     staticType: int
   staticElement: dart:core::@class::num::@method::==
@@ -312,6 +326,7 @@
       arguments
         SimpleIdentifier
           token: a
+          parameter: <null>
           staticElement: self::@function::f::@parameter::a
           staticType: int
       rightParenthesis: )
@@ -320,6 +335,7 @@
   operator: ==
   rightOperand: IntegerLiteral
     literal: 0
+    parameter: <null>
     staticType: int
   staticElement: <null>
   staticInvokeType: null
@@ -345,6 +361,7 @@
   operator: ===
   rightOperand: SimpleIdentifier
     token: b
+    parameter: <null>
     staticElement: self::@function::f::@parameter::b
     staticType: int
   staticElement: <null>
@@ -370,6 +387,7 @@
   operator: ??
   rightOperand: SimpleIdentifier
     token: b
+    parameter: <null>
     staticElement: self::@function::f::@parameter::b
     staticType: double
   staticElement: <null>
@@ -394,6 +412,7 @@
   operator: &&
   rightOperand: SimpleIdentifier
     token: b
+    parameter: <null>
     staticElement: self::@function::f::@parameter::b
     staticType: bool
   staticElement: <null>
@@ -418,6 +437,7 @@
   operator: ||
   rightOperand: SimpleIdentifier
     token: b
+    parameter: <null>
     staticElement: self::@function::f::@parameter::b
     staticType: bool
   staticElement: <null>
@@ -455,6 +475,7 @@
   operator: -
   rightOperand: SimpleIdentifier
     token: b
+    parameter: dart:core::@class::num::@method::-::@parameter::other
     staticElement: self::@function::f::@parameter::b
     staticType: double
   staticElement: dart:core::@class::num::@method::-
@@ -479,6 +500,7 @@
   operator: -
   rightOperand: SimpleIdentifier
     token: b
+    parameter: dart:core::@class::num::@method::-::@parameter::other
     staticElement: self::@function::f::@parameter::b
     staticType: int
   staticElement: dart:core::@class::num::@method::-
@@ -516,6 +538,7 @@
   operator: %
   rightOperand: SimpleIdentifier
     token: b
+    parameter: dart:core::@class::num::@method::%::@parameter::other
     staticElement: self::@function::f::@parameter::b
     staticType: double
   staticElement: dart:core::@class::num::@method::%
@@ -540,6 +563,7 @@
   operator: %
   rightOperand: SimpleIdentifier
     token: b
+    parameter: dart:core::@class::num::@method::%::@parameter::other
     staticElement: self::@function::f::@parameter::b
     staticType: int
   staticElement: dart:core::@class::num::@method::%
@@ -601,6 +625,7 @@
   operator: +
   rightOperand: SimpleIdentifier
     token: b
+    parameter: dart:core::@class::double::@method::+::@parameter::other
     staticElement: self::@function::f::@parameter::b
     staticType: dynamic
   staticElement: dart:core::@class::double::@method::+
@@ -692,6 +717,7 @@
   operator: +
   rightOperand: SimpleIdentifier
     token: b
+    parameter: dart:core::@class::num::@method::+::@parameter::other
     staticElement: self::@function::f::@parameter::b
     staticType: double
   staticElement: dart:core::@class::num::@method::+
@@ -716,6 +742,7 @@
   operator: +
   rightOperand: SimpleIdentifier
     token: b
+    parameter: dart:core::@class::num::@method::+::@parameter::other
     staticElement: self::@function::f::@parameter::b
     staticType: dynamic
   staticElement: dart:core::@class::num::@method::+
@@ -740,6 +767,7 @@
   operator: +
   rightOperand: SimpleIdentifier
     token: b
+    parameter: dart:core::@class::num::@method::+::@parameter::other
     staticElement: self::@function::f::@parameter::b
     staticType: int
   staticElement: dart:core::@class::num::@method::+
@@ -771,6 +799,7 @@
   operator: +
   rightOperand: SimpleIdentifier
     token: b
+    parameter: dart:core::@class::num::@method::+::@parameter::other
     staticElement: self::@function::f::@parameter::b
     staticType: int
   staticElement: dart:core::@class::num::@method::+
@@ -801,6 +830,7 @@
       arguments
         SimpleIdentifier
           token: a
+          parameter: <null>
           staticElement: self::@function::f::@parameter::a
           staticType: int
       rightParenthesis: )
@@ -809,6 +839,7 @@
   operator: +
   rightOperand: SimpleIdentifier
     token: b
+    parameter: self::@extension::E::@method::+::@parameter::other
     staticElement: self::@function::f::@parameter::b
     staticType: int
   staticElement: self::@extension::E::@method::+
@@ -833,6 +864,7 @@
   operator: +
   rightOperand: SimpleIdentifier
     token: b
+    parameter: dart:core::@class::num::@method::+::@parameter::other
     staticElement: self::@function::f::@parameter::b
     staticType: num
   staticElement: dart:core::@class::num::@method::+
@@ -931,6 +963,7 @@
   operator: +
   rightOperand: SimpleIdentifier
     token: b
+    parameter: self::@class::A::@method::+::@parameter::other
     staticElement: self::@function::f::@parameter::b
     staticType: double
   staticElement: self::@class::A::@method::+
@@ -962,6 +995,7 @@
       arguments
         SimpleIdentifier
           token: a
+          parameter: <null>
           staticElement: self::@function::f::@parameter::a
           staticType: A
       rightParenthesis: )
@@ -970,6 +1004,7 @@
   operator: +
   rightOperand: SimpleIdentifier
     token: b
+    parameter: self::@extension::E::@method::+::@parameter::other
     staticElement: self::@function::f::@parameter::b
     staticType: int
   staticElement: self::@extension::E::@method::+
@@ -998,6 +1033,7 @@
   operator: +
   rightOperand: SimpleIdentifier
     token: b
+    parameter: self::@extension::E::@method::+::@parameter::other
     staticElement: self::@function::f::@parameter::b
     staticType: int
   staticElement: self::@extension::E::@method::+
@@ -1022,6 +1058,7 @@
   operator: +
   rightOperand: IntegerLiteral
     literal: 0
+    parameter: <null>
     staticType: int
   staticElement: <null>
   staticInvokeType: null
@@ -1045,6 +1082,7 @@
   operator: +
   rightOperand: IntegerLiteral
     literal: 0
+    parameter: dart:core::@class::num::@method::+::@parameter::other
     staticType: int
   staticElement: dart:core::@class::num::@method::+
   staticInvokeType: num Function(num)
@@ -1068,6 +1106,7 @@
   operator: /
   rightOperand: SimpleIdentifier
     token: b
+    parameter: dart:core::@class::num::@method::/::@parameter::other
     staticElement: self::@function::f::@parameter::b
     staticType: int
   staticElement: dart:core::@class::num::@method::/
@@ -1105,6 +1144,7 @@
   operator: *
   rightOperand: SimpleIdentifier
     token: b
+    parameter: dart:core::@class::num::@method::*::@parameter::other
     staticElement: self::@function::f::@parameter::b
     staticType: double
   staticElement: dart:core::@class::num::@method::*
@@ -1129,6 +1169,7 @@
   operator: *
   rightOperand: SimpleIdentifier
     token: b
+    parameter: dart:core::@class::num::@method::*::@parameter::other
     staticElement: self::@function::f::@parameter::b
     staticType: int
   staticElement: dart:core::@class::num::@method::*
diff --git a/pkg/analyzer/test/src/dart/resolution/context_collection_resolution.dart b/pkg/analyzer/test/src/dart/resolution/context_collection_resolution.dart
index f638f17..8773df4 100644
--- a/pkg/analyzer/test/src/dart/resolution/context_collection_resolution.dart
+++ b/pkg/analyzer/test/src/dart/resolution/context_collection_resolution.dart
@@ -12,6 +12,7 @@
 import 'package:analyzer/src/dart/analysis/driver_based_analysis_context.dart';
 import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer/src/generated/engine.dart' show AnalysisOptionsImpl;
+import 'package:analyzer/src/summary2/kernel_compilation_service.dart';
 import 'package:analyzer/src/test_utilities/mock_packages.dart';
 import 'package:analyzer/src/test_utilities/mock_sdk.dart';
 import 'package:analyzer/src/test_utilities/package_config_file_builder.dart';
@@ -176,7 +177,9 @@
   void disposeAnalysisContextCollection() {
     final analysisContextCollection = _analysisContextCollection;
     if (analysisContextCollection != null) {
-      analysisContextCollection.dispose();
+      analysisContextCollection.dispose(
+        forTesting: true,
+      );
       _analysisContextCollection = null;
     }
   }
@@ -218,6 +221,9 @@
   @mustCallSuper
   Future<void> tearDown() async {
     disposeAnalysisContextCollection();
+    KernelCompilationService.disposeDelayed(
+      const Duration(milliseconds: 500),
+    );
   }
 
   /// Override this method to update [analysisOptions] for every context root,
diff --git a/pkg/analyzer/test/src/dart/resolution/extension_method_test.dart b/pkg/analyzer/test/src/dart/resolution/extension_method_test.dart
index a385e48..0073ce7 100644
--- a/pkg/analyzer/test/src/dart/resolution/extension_method_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/extension_method_test.dart
@@ -1168,6 +1168,7 @@
   operator: +
   rightOperand: IntegerLiteral
     literal: 1
+    parameter: self::@extension::E::@method::+::@parameter::_
     staticType: int
   staticElement: self::@extension::E::@method::+
   staticInvokeType: int Function(int)
@@ -1195,6 +1196,7 @@
   leftBracket: [
   index: IntegerLiteral
     literal: 0
+    parameter: self::@extension::E::@method::[]::@parameter::index
     staticType: int
   rightBracket: ]
   staticElement: self::@extension::E::@method::[]
@@ -1222,6 +1224,7 @@
   leftBracket: [
   index: IntegerLiteral
     literal: 0
+    parameter: self::@extension::E::@method::[]::@parameter::index
     staticType: int
   rightBracket: ]
   staticElement: self::@extension::E::@method::[]
@@ -1339,6 +1342,7 @@
   operator: =
   rightHandSide: IntegerLiteral
     literal: 1
+    parameter: self::@extension::E::@setter::foo::@parameter::_
     staticType: int
   readElement: <null>
   readType: null
@@ -1375,6 +1379,7 @@
   operator: =
   rightHandSide: IntegerLiteral
     literal: 1
+    parameter: self::@extension::E::@setter::foo::@parameter::_
     staticType: int
   readElement: <null>
   readType: null
@@ -1434,6 +1439,7 @@
     arguments
       IntegerLiteral
         literal: 2
+        parameter: self::@class::C::@method::call::@parameter::x
         staticType: int
     rightParenthesis: )
   staticElement: self::@class::C::@method::call
@@ -1452,6 +1458,7 @@
     arguments
       IntegerLiteral
         literal: 2
+        parameter: self::@class::C::@method::call::@parameter::x
         staticType: int*
     rightParenthesis: )
   staticElement: self::@class::C::@method::call
@@ -1486,6 +1493,7 @@
     arguments
       IntegerLiteral
         literal: 2
+        parameter: self::@extension::E::@method::call::@parameter::x
         staticType: int
     rightParenthesis: )
   staticElement: self::@extension::E::@method::call
@@ -1504,6 +1512,7 @@
     arguments
       IntegerLiteral
         literal: 2
+        parameter: self::@extension::E::@method::call::@parameter::x
         staticType: int*
     rightParenthesis: )
   staticElement: self::@extension::E::@method::call
@@ -1535,6 +1544,7 @@
     arguments
       IntegerLiteral
         literal: 2
+        parameter: self::@extension::E::@method::call::@parameter::x
         staticType: int
     rightParenthesis: )
   staticElement: self::@extension::E::@method::call
@@ -1552,6 +1562,7 @@
     arguments
       IntegerLiteral
         literal: 2
+        parameter: self::@extension::E::@method::call::@parameter::x
         staticType: int*
     rightParenthesis: )
   staticElement: self::@extension::E::@method::call
@@ -1584,6 +1595,7 @@
   operator: +=
   rightHandSide: IntegerLiteral
     literal: 2
+    parameter: self::@class::C::@method::+::@parameter::i
     staticType: int
   readElement: self::@function::f::@parameter::c
   readType: C
@@ -1602,6 +1614,7 @@
   operator: +=
   rightHandSide: IntegerLiteral
     literal: 2
+    parameter: self::@class::C::@method::+::@parameter::i
     staticType: int*
   readElement: self::@function::f::@parameter::c
   readType: C*
@@ -1634,6 +1647,7 @@
   operator: +=
   rightHandSide: IntegerLiteral
     literal: 2
+    parameter: self::@extension::E::@method::+::@parameter::i
     staticType: int
   readElement: self::@function::f::@parameter::c
   readType: C
@@ -1652,6 +1666,7 @@
   operator: +=
   rightHandSide: IntegerLiteral
     literal: 2
+    parameter: self::@extension::E::@method::+::@parameter::i
     staticType: int*
   readElement: self::@function::f::@parameter::c
   readType: C*
@@ -1902,6 +1917,7 @@
     arguments
       IntegerLiteral
         literal: 0
+        parameter: root::@parameter::
         staticType: int
     rightParenthesis: )
   staticElement: <null>
@@ -1927,6 +1943,7 @@
     arguments
       IntegerLiteral
         literal: 0
+        parameter: root::@parameter::
         staticType: int*
     rightParenthesis: )
   staticElement: <null>
@@ -2405,6 +2422,7 @@
     arguments
       SimpleIdentifier
         token: o
+        parameter: root::@parameter::x
         staticElement: self::@function::f::@parameter::o
         staticType: C
     rightParenthesis: )
@@ -2430,6 +2448,7 @@
     arguments
       SimpleIdentifier
         token: o
+        parameter: root::@parameter::x
         staticElement: self::@function::f::@parameter::o
         staticType: C*
     rightParenthesis: )
@@ -2462,6 +2481,7 @@
   operator: +
   rightOperand: IntegerLiteral
     literal: 2
+    parameter: self::@class::C::@method::+::@parameter::i
     staticType: int
   staticElement: self::@class::C::@method::+
   staticInvokeType: void Function(int)
@@ -2477,6 +2497,7 @@
   operator: +
   rightOperand: IntegerLiteral
     literal: 2
+    parameter: self::@class::C::@method::+::@parameter::i
     staticType: int*
   staticElement: self::@class::C::@method::+
   staticInvokeType: void Function(int*)*
@@ -2505,6 +2526,7 @@
   operator: +
   rightOperand: IntegerLiteral
     literal: 2
+    parameter: self::@extension::E::@method::+::@parameter::i
     staticType: int
   staticElement: self::@extension::E::@method::+
   staticInvokeType: void Function(int)
@@ -2520,6 +2542,7 @@
   operator: +
   rightOperand: IntegerLiteral
     literal: 2
+    parameter: self::@extension::E::@method::+::@parameter::i
     staticType: int*
   staticElement: self::@extension::E::@method::+
   staticInvokeType: void Function(int*)*
@@ -2549,6 +2572,7 @@
   operator: +
   rightOperand: IntegerLiteral
     literal: 2
+    parameter: self::@extension::E::@method::+::@parameter::i
     staticType: int
   staticElement: self::@extension::E::@method::+
   staticInvokeType: void Function(int)
@@ -2564,6 +2588,7 @@
   operator: +
   rightOperand: IntegerLiteral
     literal: 2
+    parameter: self::@extension::E::@method::+::@parameter::i
     staticType: int*
   staticElement: self::@extension::E::@method::+
   staticInvokeType: void Function(int*)*
@@ -2606,6 +2631,7 @@
   leftBracket: [
   index: IntegerLiteral
     literal: 2
+    parameter: self::@class::C::@method::[]::@parameter::index
     staticType: int
   rightBracket: ]
   staticElement: self::@class::C::@method::[]
@@ -2621,6 +2647,7 @@
   leftBracket: [
   index: IntegerLiteral
     literal: 2
+    parameter: self::@class::C::@method::[]::@parameter::index
     staticType: int*
   rightBracket: ]
   staticElement: self::@class::C::@method::[]
@@ -2649,6 +2676,7 @@
   leftBracket: [
   index: IntegerLiteral
     literal: 2
+    parameter: self::@extension::E::@method::[]::@parameter::index
     staticType: int
   rightBracket: ]
   staticElement: self::@extension::E::@method::[]
@@ -2664,6 +2692,7 @@
   leftBracket: [
   index: IntegerLiteral
     literal: 2
+    parameter: self::@extension::E::@method::[]::@parameter::index
     staticType: int*
   rightBracket: ]
   staticElement: self::@extension::E::@method::[]
@@ -2693,6 +2722,7 @@
   leftBracket: [
   index: IntegerLiteral
     literal: 2
+    parameter: self::@extension::E::@method::[]::@parameter::index
     staticType: int
   rightBracket: ]
   staticElement: self::@extension::E::@method::[]
@@ -2708,6 +2738,7 @@
   leftBracket: [
   index: IntegerLiteral
     literal: 2
+    parameter: self::@extension::E::@method::[]::@parameter::index
     staticType: int*
   rightBracket: ]
   staticElement: self::@extension::E::@method::[]
@@ -2740,6 +2771,7 @@
     leftBracket: [
     index: IntegerLiteral
       literal: 2
+      parameter: self::@class::C::@method::[]=::@parameter::index
       staticType: int
     rightBracket: ]
     staticElement: <null>
@@ -2747,6 +2779,7 @@
   operator: =
   rightHandSide: IntegerLiteral
     literal: 1
+    parameter: self::@class::C::@method::[]=::@parameter::value
     staticType: int
   readElement: <null>
   readType: null
@@ -2766,6 +2799,7 @@
     leftBracket: [
     index: IntegerLiteral
       literal: 2
+      parameter: self::@class::C::@method::[]=::@parameter::index
       staticType: int*
     rightBracket: ]
     staticElement: <null>
@@ -2773,6 +2807,7 @@
   operator: =
   rightHandSide: IntegerLiteral
     literal: 1
+    parameter: self::@class::C::@method::[]=::@parameter::value
     staticType: int*
   readElement: <null>
   readType: null
@@ -2805,6 +2840,7 @@
     leftBracket: [
     index: IntegerLiteral
       literal: 2
+      parameter: self::@extension::E::@method::[]=::@parameter::index
       staticType: int
     rightBracket: ]
     staticElement: <null>
@@ -2812,6 +2848,7 @@
   operator: =
   rightHandSide: IntegerLiteral
     literal: 3
+    parameter: self::@extension::E::@method::[]=::@parameter::value
     staticType: int
   readElement: <null>
   readType: null
@@ -2831,6 +2868,7 @@
     leftBracket: [
     index: IntegerLiteral
       literal: 2
+      parameter: self::@extension::E::@method::[]=::@parameter::index
       staticType: int*
     rightBracket: ]
     staticElement: <null>
@@ -2838,6 +2876,7 @@
   operator: =
   rightHandSide: IntegerLiteral
     literal: 3
+    parameter: self::@extension::E::@method::[]=::@parameter::value
     staticType: int*
   readElement: <null>
   readType: null
@@ -2871,6 +2910,7 @@
     leftBracket: [
     index: IntegerLiteral
       literal: 2
+      parameter: self::@extension::E::@method::[]=::@parameter::index
       staticType: int
     rightBracket: ]
     staticElement: <null>
@@ -2878,6 +2918,7 @@
   operator: =
   rightHandSide: IntegerLiteral
     literal: 3
+    parameter: self::@extension::E::@method::[]=::@parameter::value
     staticType: int
   readElement: <null>
   readType: null
@@ -2897,6 +2938,7 @@
     leftBracket: [
     index: IntegerLiteral
       literal: 2
+      parameter: self::@extension::E::@method::[]=::@parameter::index
       staticType: int*
     rightBracket: ]
     staticElement: <null>
@@ -2904,6 +2946,7 @@
   operator: =
   rightHandSide: IntegerLiteral
     literal: 3
+    parameter: self::@extension::E::@method::[]=::@parameter::value
     staticType: int*
   readElement: <null>
   readType: null
@@ -3318,6 +3361,7 @@
   operator: =
   rightHandSide: IntegerLiteral
     literal: 1
+    parameter: self::@extension::E::@setter::a::@parameter::x
     staticType: int
   readElement: <null>
   readType: null
@@ -3344,6 +3388,7 @@
   operator: =
   rightHandSide: IntegerLiteral
     literal: 1
+    parameter: self::@extension::E::@setter::a::@parameter::x
     staticType: int*
   readElement: <null>
   readType: null
@@ -3386,6 +3431,7 @@
   operator: =
   rightHandSide: IntegerLiteral
     literal: 1
+    parameter: self::@extension::E::@setter::a::@parameter::x
     staticType: int
   readElement: <null>
   readType: null
@@ -3412,6 +3458,7 @@
   operator: =
   rightHandSide: IntegerLiteral
     literal: 1
+    parameter: self::@extension::E::@setter::a::@parameter::x
     staticType: int*
   readElement: <null>
   readType: null
@@ -3890,6 +3937,7 @@
   operator: =
   rightHandSide: IntegerLiteral
     literal: 3
+    parameter: package:test/lib.dart::@extension::E::@setter::a::@parameter::x
     staticType: int
   readElement: <null>
   readType: null
@@ -3923,6 +3971,7 @@
   operator: =
   rightHandSide: IntegerLiteral
     literal: 3
+    parameter: package:test/lib.dart::@extension::E::@setter::a::@parameter::x
     staticType: int*
   readElement: <null>
   readType: null
@@ -3965,6 +4014,7 @@
   operator: =
   rightHandSide: IntegerLiteral
     literal: 3
+    parameter: self::@extension::E::@setter::a::@parameter::x
     staticType: int
   readElement: <null>
   readType: null
@@ -3991,6 +4041,7 @@
   operator: =
   rightHandSide: IntegerLiteral
     literal: 3
+    parameter: self::@extension::E::@setter::a::@parameter::x
     staticType: int*
   readElement: <null>
   readType: null
@@ -4109,6 +4160,7 @@
     arguments
       IntegerLiteral
         literal: 2
+        parameter: self::@extension::E::@method::call::@parameter::x
         staticType: int
     rightParenthesis: )
   staticElement: self::@extension::E::@method::call
@@ -4126,6 +4178,7 @@
     arguments
       IntegerLiteral
         literal: 2
+        parameter: self::@extension::E::@method::call::@parameter::x
         staticType: int*
     rightParenthesis: )
   staticElement: self::@extension::E::@method::call
@@ -4161,6 +4214,7 @@
   operator: =
   rightHandSide: IntegerLiteral
     literal: 0
+    parameter: <null>
     staticType: int
   readElement: <null>
   readType: null
@@ -4179,6 +4233,7 @@
   operator: =
   rightHandSide: IntegerLiteral
     literal: 0
+    parameter: <null>
     staticType: int*
   readElement: <null>
   readType: null
@@ -4427,6 +4482,7 @@
   operator: +
   rightOperand: IntegerLiteral
     literal: 2
+    parameter: self::@class::C::@method::+::@parameter::i
     staticType: int
   staticElement: self::@class::C::@method::+
   staticInvokeType: void Function(int)
@@ -4441,6 +4497,7 @@
   operator: +
   rightOperand: IntegerLiteral
     literal: 2
+    parameter: self::@class::C::@method::+::@parameter::i
     staticType: int*
   staticElement: self::@class::C::@method::+
   staticInvokeType: void Function(int*)*
@@ -4467,6 +4524,7 @@
   operator: +
   rightOperand: IntegerLiteral
     literal: 2
+    parameter: self::@extension::E::@method::+::@parameter::i
     staticType: int
   staticElement: self::@extension::E::@method::+
   staticInvokeType: void Function(int)
@@ -4481,6 +4539,7 @@
   operator: +
   rightOperand: IntegerLiteral
     literal: 2
+    parameter: self::@extension::E::@method::+::@parameter::i
     staticType: int*
   staticElement: self::@extension::E::@method::+
   staticInvokeType: void Function(int*)*
@@ -4509,6 +4568,7 @@
   leftBracket: [
   index: IntegerLiteral
     literal: 2
+    parameter: self::@class::C::@method::[]::@parameter::index
     staticType: int
   rightBracket: ]
   staticElement: self::@class::C::@method::[]
@@ -4523,6 +4583,7 @@
   leftBracket: [
   index: IntegerLiteral
     literal: 2
+    parameter: self::@class::C::@method::[]::@parameter::index
     staticType: int*
   rightBracket: ]
   staticElement: self::@class::C::@method::[]
@@ -4549,6 +4610,7 @@
   leftBracket: [
   index: IntegerLiteral
     literal: 2
+    parameter: self::@extension::E::@method::[]::@parameter::index
     staticType: int
   rightBracket: ]
   staticElement: self::@extension::E::@method::[]
@@ -4563,6 +4625,7 @@
   leftBracket: [
   index: IntegerLiteral
     literal: 2
+    parameter: self::@extension::E::@method::[]::@parameter::index
     staticType: int*
   rightBracket: ]
   staticElement: self::@extension::E::@method::[]
@@ -4592,6 +4655,7 @@
     leftBracket: [
     index: IntegerLiteral
       literal: 2
+      parameter: self::@class::C::@method::[]=::@parameter::index
       staticType: int
     rightBracket: ]
     staticElement: <null>
@@ -4599,6 +4663,7 @@
   operator: =
   rightHandSide: IntegerLiteral
     literal: 1
+    parameter: self::@class::C::@method::[]=::@parameter::value
     staticType: int
   readElement: <null>
   readType: null
@@ -4617,6 +4682,7 @@
     leftBracket: [
     index: IntegerLiteral
       literal: 2
+      parameter: self::@class::C::@method::[]=::@parameter::index
       staticType: int*
     rightBracket: ]
     staticElement: <null>
@@ -4624,6 +4690,7 @@
   operator: =
   rightHandSide: IntegerLiteral
     literal: 1
+    parameter: self::@class::C::@method::[]=::@parameter::value
     staticType: int*
   readElement: <null>
   readType: null
@@ -4654,6 +4721,7 @@
     leftBracket: [
     index: IntegerLiteral
       literal: 2
+      parameter: self::@extension::E::@method::[]=::@parameter::index
       staticType: int
     rightBracket: ]
     staticElement: <null>
@@ -4661,6 +4729,7 @@
   operator: =
   rightHandSide: IntegerLiteral
     literal: 3
+    parameter: self::@extension::E::@method::[]=::@parameter::value
     staticType: int
   readElement: <null>
   readType: null
@@ -4679,6 +4748,7 @@
     leftBracket: [
     index: IntegerLiteral
       literal: 2
+      parameter: self::@extension::E::@method::[]=::@parameter::index
       staticType: int*
     rightBracket: ]
     staticElement: <null>
@@ -4686,6 +4756,7 @@
   operator: =
   rightHandSide: IntegerLiteral
     literal: 3
+    parameter: self::@extension::E::@method::[]=::@parameter::value
     staticType: int*
   readElement: <null>
   readType: null
@@ -4820,6 +4891,7 @@
   operator: =
   rightHandSide: IntegerLiteral
     literal: 3
+    parameter: self::@extension::E::@setter::a::@parameter::_
     staticType: int
   readElement: <null>
   readType: null
@@ -4838,6 +4910,7 @@
   operator: =
   rightHandSide: IntegerLiteral
     literal: 3
+    parameter: self::@extension::E::@setter::a::@parameter::_
     staticType: int*
   readElement: <null>
   readType: null
@@ -4879,6 +4952,7 @@
   operator: =
   rightHandSide: IntegerLiteral
     literal: 3
+    parameter: self::@class::C::@setter::a::@parameter::_
     staticType: int
   readElement: <null>
   readType: null
@@ -4903,6 +4977,7 @@
   operator: =
   rightHandSide: IntegerLiteral
     literal: 3
+    parameter: self::@class::C::@setter::a::@parameter::_
     staticType: int*
   readElement: <null>
   readType: null
@@ -4942,6 +5017,7 @@
   operator: =
   rightHandSide: IntegerLiteral
     literal: 3
+    parameter: self::@extension::E::@setter::a::@parameter::_
     staticType: int
   readElement: <null>
   readType: null
@@ -4966,6 +5042,7 @@
   operator: =
   rightHandSide: IntegerLiteral
     literal: 3
+    parameter: self::@extension::E::@setter::a::@parameter::_
     staticType: int*
   readElement: <null>
   readType: null
@@ -5249,6 +5326,7 @@
   operator: =
   rightHandSide: IntegerLiteral
     literal: 3
+    parameter: self::@extension::E::@setter::a::@parameter::x
     staticType: int
   readElement: <null>
   readType: null
@@ -5267,6 +5345,7 @@
   operator: =
   rightHandSide: IntegerLiteral
     literal: 3
+    parameter: self::@extension::E::@setter::a::@parameter::x
     staticType: int*
   readElement: <null>
   readType: null
@@ -5300,6 +5379,7 @@
   operator: =
   rightHandSide: IntegerLiteral
     literal: 3
+    parameter: self::@extension::E::@setter::a::@parameter::x
     staticType: int
   readElement: <null>
   readType: null
@@ -5318,6 +5398,7 @@
   operator: =
   rightHandSide: IntegerLiteral
     literal: 3
+    parameter: self::@extension::E::@setter::a::@parameter::x
     staticType: int*
   readElement: <null>
   readType: null
@@ -5560,6 +5641,7 @@
   operator: =
   rightHandSide: IntegerLiteral
     literal: 0
+    parameter: self::@setter::a::@parameter::_
     staticType: int
   readElement: <null>
   readType: null
@@ -5578,6 +5660,7 @@
   operator: =
   rightHandSide: IntegerLiteral
     literal: 0
+    parameter: self::@setter::a::@parameter::_
     staticType: int*
   readElement: <null>
   readType: null
@@ -5614,6 +5697,7 @@
   operator: =
   rightHandSide: IntegerLiteral
     literal: 0
+    parameter: self::@setter::a::@parameter::_
     staticType: int
   readElement: <null>
   readType: null
@@ -5632,6 +5716,7 @@
   operator: =
   rightHandSide: IntegerLiteral
     literal: 0
+    parameter: self::@setter::a::@parameter::_
     staticType: int*
   readElement: <null>
   readType: null
diff --git a/pkg/analyzer/test/src/dart/resolution/extension_override_test.dart b/pkg/analyzer/test/src/dart/resolution/extension_override_test.dart
index de64c30..249d75a 100644
--- a/pkg/analyzer/test/src/dart/resolution/extension_override_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/extension_override_test.dart
@@ -40,6 +40,7 @@
       arguments
         SimpleIdentifier
           token: a
+          parameter: <null>
           staticElement: self::@function::f::@parameter::a
           staticType: int?
       rightParenthesis: )
@@ -48,6 +49,7 @@
   leftBracket: [
   index: IntegerLiteral
     literal: 0
+    parameter: self::@extension::E::@method::[]::@parameter::index
     staticType: int
   rightBracket: ]
   staticElement: self::@extension::E::@method::[]
@@ -79,6 +81,7 @@
         arguments
           SimpleIdentifier
             token: a
+            parameter: <null>
             staticElement: self::@function::f::@parameter::a
             staticType: int?
         rightParenthesis: )
@@ -87,6 +90,7 @@
     leftBracket: [
     index: IntegerLiteral
       literal: 0
+      parameter: self::@extension::E::@method::[]=::@parameter::index
       staticType: int
     rightBracket: ]
     staticElement: <null>
@@ -94,6 +98,7 @@
   operator: =
   rightHandSide: IntegerLiteral
     literal: 1
+    parameter: self::@extension::E::@method::[]=::@parameter::value
     staticType: int
   readElement: <null>
   readType: null
@@ -128,6 +133,7 @@
       arguments
         SimpleIdentifier
           token: a
+          parameter: <null>
           staticElement: self::@function::f::@parameter::a
           staticType: int?
       rightParenthesis: )
@@ -203,6 +209,7 @@
       arguments
         SimpleIdentifier
           token: a
+          parameter: <null>
           staticElement: self::@function::f::@parameter::a
           staticType: A
       rightParenthesis: )
@@ -231,6 +238,7 @@
       arguments
         SimpleIdentifier
           token: a
+          parameter: <null>
           staticElement: self::@function::f::@parameter::a
           staticType: A*
       rightParenthesis: )
@@ -285,6 +293,7 @@
       arguments
         SimpleIdentifier
           token: a
+          parameter: <null>
           staticElement: self::@function::f::@parameter::a
           staticType: A
       rightParenthesis: )
@@ -327,6 +336,7 @@
       arguments
         SimpleIdentifier
           token: a
+          parameter: <null>
           staticElement: self::@function::f::@parameter::a
           staticType: A*
       rightParenthesis: )
@@ -385,6 +395,7 @@
       arguments
         SimpleIdentifier
           token: a
+          parameter: <null>
           staticElement: self::@function::f::@parameter::a
           staticType: A
       rightParenthesis: )
@@ -421,6 +432,7 @@
       arguments
         SimpleIdentifier
           token: a
+          parameter: <null>
           staticElement: self::@function::f::@parameter::a
           staticType: A*
       rightParenthesis: )
@@ -486,6 +498,7 @@
       arguments
         SimpleIdentifier
           token: a
+          parameter: <null>
           staticElement: self::@function::f::@parameter::a
           staticType: A
       rightParenthesis: )
@@ -536,6 +549,7 @@
       arguments
         SimpleIdentifier
           token: a
+          parameter: <null>
           staticElement: self::@function::f::@parameter::a
           staticType: A*
       rightParenthesis: )
@@ -583,6 +597,7 @@
       arguments
         SimpleIdentifier
           token: a
+          parameter: <null>
           staticElement: self::@function::f::@parameter::a
           staticType: A
       rightParenthesis: )
@@ -608,6 +623,7 @@
       arguments
         SimpleIdentifier
           token: a
+          parameter: <null>
           staticElement: self::@function::f::@parameter::a
           staticType: A*
       rightParenthesis: )
@@ -651,6 +667,7 @@
         arguments
           SimpleIdentifier
             token: a
+            parameter: <null>
             staticElement: self::@function::f::@parameter::a
             staticType: A
         rightParenthesis: )
@@ -667,6 +684,7 @@
     arguments
       IntegerLiteral
         literal: 0
+        parameter: root::@parameter::
         staticType: int
     rightParenthesis: )
   staticElement: <null>
@@ -687,6 +705,7 @@
         arguments
           SimpleIdentifier
             token: a
+            parameter: <null>
             staticElement: self::@function::f::@parameter::a
             staticType: A*
         rightParenthesis: )
@@ -703,6 +722,7 @@
     arguments
       IntegerLiteral
         literal: 0
+        parameter: root::@parameter::
         staticType: int*
     rightParenthesis: )
   staticElement: <null>
@@ -747,6 +767,7 @@
       arguments
         SimpleIdentifier
           token: a
+          parameter: <null>
           staticElement: self::@function::f::@parameter::a
           staticType: A
       rightParenthesis: )
@@ -786,6 +807,7 @@
       arguments
         SimpleIdentifier
           token: a
+          parameter: <null>
           staticElement: self::@function::f::@parameter::a
           staticType: A*
       rightParenthesis: )
@@ -841,6 +863,7 @@
       arguments
         SimpleIdentifier
           token: a
+          parameter: <null>
           staticElement: self::@function::f::@parameter::a
           staticType: A
       rightParenthesis: )
@@ -874,6 +897,7 @@
       arguments
         SimpleIdentifier
           token: a
+          parameter: <null>
           staticElement: self::@function::f::@parameter::a
           staticType: A*
       rightParenthesis: )
@@ -935,6 +959,7 @@
       arguments
         SimpleIdentifier
           token: a
+          parameter: <null>
           staticElement: self::@function::f::@parameter::a
           staticType: A
       rightParenthesis: )
@@ -982,6 +1007,7 @@
       arguments
         SimpleIdentifier
           token: a
+          parameter: <null>
           staticElement: self::@function::f::@parameter::a
           staticType: A*
       rightParenthesis: )
@@ -1026,6 +1052,7 @@
       arguments
         SimpleIdentifier
           token: a
+          parameter: <null>
           staticElement: self::@function::f::@parameter::a
           staticType: A
       rightParenthesis: )
@@ -1055,6 +1082,7 @@
       arguments
         SimpleIdentifier
           token: a
+          parameter: <null>
           staticElement: self::@function::f::@parameter::a
           staticType: A*
       rightParenthesis: )
@@ -1109,6 +1137,7 @@
       arguments
         SimpleIdentifier
           token: a
+          parameter: <null>
           staticElement: self::@function::f::@parameter::a
           staticType: A
       rightParenthesis: )
@@ -1152,6 +1181,7 @@
       arguments
         SimpleIdentifier
           token: a
+          parameter: <null>
           staticElement: self::@function::f::@parameter::a
           staticType: A*
       rightParenthesis: )
@@ -1211,6 +1241,7 @@
       arguments
         SimpleIdentifier
           token: a
+          parameter: <null>
           staticElement: self::@function::f::@parameter::a
           staticType: A
       rightParenthesis: )
@@ -1248,6 +1279,7 @@
       arguments
         SimpleIdentifier
           token: a
+          parameter: <null>
           staticElement: self::@function::f::@parameter::a
           staticType: A*
       rightParenthesis: )
@@ -1313,6 +1345,7 @@
       arguments
         SimpleIdentifier
           token: a
+          parameter: <null>
           staticElement: self::@function::f::@parameter::a
           staticType: A
       rightParenthesis: )
@@ -1364,6 +1397,7 @@
       arguments
         SimpleIdentifier
           token: a
+          parameter: <null>
           staticElement: self::@function::f::@parameter::a
           staticType: A*
       rightParenthesis: )
@@ -1412,6 +1446,7 @@
       arguments
         SimpleIdentifier
           token: a
+          parameter: <null>
           staticElement: self::@function::f::@parameter::a
           staticType: A
       rightParenthesis: )
@@ -1420,6 +1455,7 @@
   operator: +
   rightOperand: IntegerLiteral
     literal: 1
+    parameter: self::@extension::E::@method::+::@parameter::offset
     staticType: int
   staticElement: self::@extension::E::@method::+
   staticInvokeType: void Function(int)
@@ -1438,6 +1474,7 @@
       arguments
         SimpleIdentifier
           token: a
+          parameter: <null>
           staticElement: self::@function::f::@parameter::a
           staticType: A*
       rightParenthesis: )
@@ -1446,6 +1483,7 @@
   operator: +
   rightOperand: IntegerLiteral
     literal: 1
+    parameter: self::@extension::E::@method::+::@parameter::offset
     staticType: int*
   staticElement: self::@extension::E::@method::+
   staticInvokeType: void Function(int*)*
@@ -1489,6 +1527,7 @@
       arguments
         SimpleIdentifier
           token: a
+          parameter: <null>
           staticElement: self::@function::f::@parameter::a
           staticType: A
       rightParenthesis: )
@@ -1499,6 +1538,7 @@
   operator: +
   rightOperand: IntegerLiteral
     literal: 1
+    parameter: self::@extension::E::@method::+::@parameter::offset
     staticType: int
   staticElement: self::@extension::E::@method::+
   staticInvokeType: void Function(int)
@@ -1527,6 +1567,7 @@
       arguments
         SimpleIdentifier
           token: a
+          parameter: <null>
           staticElement: self::@function::f::@parameter::a
           staticType: A*
       rightParenthesis: )
@@ -1537,6 +1578,7 @@
   operator: +
   rightOperand: IntegerLiteral
     literal: 1
+    parameter: self::@extension::E::@method::+::@parameter::offset
     staticType: int*
   staticElement: self::@extension::E::@method::+
   staticInvokeType: void Function(int*)*
@@ -1574,6 +1616,7 @@
         arguments
           IntegerLiteral
             literal: 0
+            parameter: <null>
             staticType: int
         rightParenthesis: )
       extendedType: int
@@ -1606,6 +1649,7 @@
         arguments
           IntegerLiteral
             literal: 0
+            parameter: <null>
             staticType: int*
         rightParenthesis: )
       extendedType: int*
@@ -1663,6 +1707,7 @@
       arguments
         SimpleIdentifier
           token: a
+          parameter: <null>
           staticElement: self::@function::f::@parameter::a
           staticType: A
       rightParenthesis: )
@@ -1671,6 +1716,7 @@
   operator: +
   rightOperand: IntegerLiteral
     literal: 1
+    parameter: package:test/lib.dart::@extension::E::@method::+::@parameter::offset
     staticType: int
   staticElement: package:test/lib.dart::@extension::E::@method::+
   staticInvokeType: void Function(int)
@@ -1697,6 +1743,7 @@
       arguments
         SimpleIdentifier
           token: a
+          parameter: <null>
           staticElement: self::@function::f::@parameter::a
           staticType: A*
       rightParenthesis: )
@@ -1705,6 +1752,7 @@
   operator: +
   rightOperand: IntegerLiteral
     literal: 1
+    parameter: package:test/lib.dart::@extension::E::@method::+::@parameter::offset
     staticType: int*
   staticElement: package:test/lib.dart::@extension::E::@method::+
   staticInvokeType: void Function(int*)*
@@ -1759,6 +1807,7 @@
       arguments
         SimpleIdentifier
           token: a
+          parameter: <null>
           staticElement: self::@function::f::@parameter::a
           staticType: A
       rightParenthesis: )
@@ -1769,6 +1818,7 @@
   operator: +
   rightOperand: IntegerLiteral
     literal: 1
+    parameter: package:test/lib.dart::@extension::E::@method::+::@parameter::offset
     staticType: int
   staticElement: package:test/lib.dart::@extension::E::@method::+
   staticInvokeType: void Function(int)
@@ -1805,6 +1855,7 @@
       arguments
         SimpleIdentifier
           token: a
+          parameter: <null>
           staticElement: self::@function::f::@parameter::a
           staticType: A*
       rightParenthesis: )
@@ -1815,6 +1866,7 @@
   operator: +
   rightOperand: IntegerLiteral
     literal: 1
+    parameter: package:test/lib.dart::@extension::E::@method::+::@parameter::offset
     staticType: int*
   staticElement: package:test/lib.dart::@extension::E::@method::+
   staticInvokeType: void Function(int*)*
@@ -1849,6 +1901,7 @@
         arguments
           SimpleIdentifier
             token: a
+            parameter: <null>
             staticElement: self::@function::f::@parameter::a
             staticType: A
         rightParenthesis: )
@@ -1863,6 +1916,7 @@
   operator: =
   rightHandSide: IntegerLiteral
     literal: 0
+    parameter: self::@extension::E::@setter::s::@parameter::x
     staticType: int
   readElement: <null>
   readType: null
@@ -1885,6 +1939,7 @@
         arguments
           SimpleIdentifier
             token: a
+            parameter: <null>
             staticElement: self::@function::f::@parameter::a
             staticType: A*
         rightParenthesis: )
@@ -1899,6 +1954,7 @@
   operator: =
   rightHandSide: IntegerLiteral
     literal: 0
+    parameter: self::@extension::E::@setter::s::@parameter::x
     staticType: int*
   readElement: <null>
   readType: null
@@ -1946,6 +2002,7 @@
         arguments
           SimpleIdentifier
             token: a
+            parameter: <null>
             staticElement: self::@function::f::@parameter::a
             staticType: A
         rightParenthesis: )
@@ -1962,6 +2019,9 @@
   operator: =
   rightHandSide: IntegerLiteral
     literal: 0
+    parameter: ParameterMember
+      base: self::@extension::E::@setter::s::@parameter::x
+      substitution: {T: int}
     staticType: int
   readElement: <null>
   readType: null
@@ -1996,6 +2056,7 @@
         arguments
           SimpleIdentifier
             token: a
+            parameter: <null>
             staticElement: self::@function::f::@parameter::a
             staticType: A*
         rightParenthesis: )
@@ -2012,6 +2073,9 @@
   operator: =
   rightHandSide: IntegerLiteral
     literal: 0
+    parameter: ParameterMember
+      base: self::@extension::E::@setter::s::@parameter::x
+      substitution: {T: int*}
     staticType: int*
   readElement: <null>
   readType: null
@@ -2062,6 +2126,7 @@
         arguments
           SimpleIdentifier
             token: a
+            parameter: <null>
             staticElement: self::@function::f::@parameter::a
             staticType: A
         rightParenthesis: )
@@ -2076,6 +2141,7 @@
   operator: =
   rightHandSide: IntegerLiteral
     literal: 0
+    parameter: package:test/lib.dart::@extension::E::@setter::s::@parameter::x
     staticType: int
   readElement: <null>
   readType: null
@@ -2106,6 +2172,7 @@
         arguments
           SimpleIdentifier
             token: a
+            parameter: <null>
             staticElement: self::@function::f::@parameter::a
             staticType: A*
         rightParenthesis: )
@@ -2120,6 +2187,7 @@
   operator: =
   rightHandSide: IntegerLiteral
     literal: 0
+    parameter: package:test/lib.dart::@extension::E::@setter::s::@parameter::x
     staticType: int*
   readElement: <null>
   readType: null
@@ -2178,6 +2246,7 @@
         arguments
           SimpleIdentifier
             token: a
+            parameter: <null>
             staticElement: self::@function::f::@parameter::a
             staticType: A
         rightParenthesis: )
@@ -2194,6 +2263,9 @@
   operator: =
   rightHandSide: IntegerLiteral
     literal: 0
+    parameter: ParameterMember
+      base: package:test/lib.dart::@extension::E::@setter::s::@parameter::x
+      substitution: {T: int}
     staticType: int
   readElement: <null>
   readType: null
@@ -2236,6 +2308,7 @@
         arguments
           SimpleIdentifier
             token: a
+            parameter: <null>
             staticElement: self::@function::f::@parameter::a
             staticType: A*
         rightParenthesis: )
@@ -2252,6 +2325,9 @@
   operator: =
   rightHandSide: IntegerLiteral
     literal: 0
+    parameter: ParameterMember
+      base: package:test/lib.dart::@extension::E::@setter::s::@parameter::x
+      substitution: {T: int*}
     staticType: int*
   readElement: <null>
   readType: null
@@ -2292,6 +2368,7 @@
         arguments
           SimpleIdentifier
             token: a
+            parameter: <null>
             staticElement: self::@function::f::@parameter::a
             staticType: A
         rightParenthesis: )
@@ -2306,6 +2383,7 @@
   operator: +=
   rightHandSide: IntegerLiteral
     literal: 0
+    parameter: dart:core::@class::num::@method::+::@parameter::other
     staticType: int
   readElement: self::@extension::E::@getter::s
   readType: int
@@ -2328,6 +2406,7 @@
         arguments
           SimpleIdentifier
             token: a
+            parameter: <null>
             staticElement: self::@function::f::@parameter::a
             staticType: A*
         rightParenthesis: )
@@ -2342,6 +2421,9 @@
   operator: +=
   rightHandSide: IntegerLiteral
     literal: 0
+    parameter: ParameterMember
+      base: dart:core::@class::num::@method::+::@parameter::other
+      isLegacy: true
     staticType: int*
   readElement: self::@extension::E::@getter::s
   readType: int*
@@ -2392,6 +2474,7 @@
         arguments
           SimpleIdentifier
             token: a
+            parameter: <null>
             staticElement: self::@function::f::@parameter::a
             staticType: A
         rightParenthesis: )
@@ -2408,6 +2491,7 @@
   operator: +=
   rightHandSide: IntegerLiteral
     literal: 0
+    parameter: dart:core::@class::num::@method::+::@parameter::other
     staticType: int
   readElement: PropertyAccessorMember
     base: self::@extension::E::@getter::s
@@ -2444,6 +2528,7 @@
         arguments
           SimpleIdentifier
             token: a
+            parameter: <null>
             staticElement: self::@function::f::@parameter::a
             staticType: A*
         rightParenthesis: )
@@ -2460,6 +2545,9 @@
   operator: +=
   rightHandSide: IntegerLiteral
     literal: 0
+    parameter: ParameterMember
+      base: dart:core::@class::num::@method::+::@parameter::other
+      isLegacy: true
     staticType: int*
   readElement: PropertyAccessorMember
     base: self::@extension::E::@getter::s
@@ -2515,6 +2603,7 @@
         arguments
           SimpleIdentifier
             token: a
+            parameter: <null>
             staticElement: self::@function::f::@parameter::a
             staticType: A
         rightParenthesis: )
@@ -2529,6 +2618,7 @@
   operator: +=
   rightHandSide: IntegerLiteral
     literal: 0
+    parameter: dart:core::@class::num::@method::+::@parameter::other
     staticType: int
   readElement: package:test/lib.dart::@extension::E::@getter::s
   readType: int
@@ -2559,6 +2649,7 @@
         arguments
           SimpleIdentifier
             token: a
+            parameter: <null>
             staticElement: self::@function::f::@parameter::a
             staticType: A*
         rightParenthesis: )
@@ -2573,6 +2664,9 @@
   operator: +=
   rightHandSide: IntegerLiteral
     literal: 0
+    parameter: ParameterMember
+      base: dart:core::@class::num::@method::+::@parameter::other
+      isLegacy: true
     staticType: int*
   readElement: package:test/lib.dart::@extension::E::@getter::s
   readType: int*
@@ -2634,6 +2728,7 @@
         arguments
           SimpleIdentifier
             token: a
+            parameter: <null>
             staticElement: self::@function::f::@parameter::a
             staticType: A
         rightParenthesis: )
@@ -2650,6 +2745,7 @@
   operator: +=
   rightHandSide: IntegerLiteral
     literal: 0
+    parameter: dart:core::@class::num::@method::+::@parameter::other
     staticType: int
   readElement: PropertyAccessorMember
     base: package:test/lib.dart::@extension::E::@getter::s
@@ -2694,6 +2790,7 @@
         arguments
           SimpleIdentifier
             token: a
+            parameter: <null>
             staticElement: self::@function::f::@parameter::a
             staticType: A*
         rightParenthesis: )
@@ -2710,6 +2807,9 @@
   operator: +=
   rightHandSide: IntegerLiteral
     literal: 0
+    parameter: ParameterMember
+      base: dart:core::@class::num::@method::+::@parameter::other
+      isLegacy: true
     staticType: int*
   readElement: PropertyAccessorMember
     base: package:test/lib.dart::@extension::E::@getter::s
@@ -2752,6 +2852,7 @@
       arguments
         SimpleIdentifier
           token: c
+          parameter: <null>
           staticElement: self::@function::f::@parameter::c
           staticType: C
       rightParenthesis: )
@@ -2777,6 +2878,7 @@
       arguments
         SimpleIdentifier
           token: c
+          parameter: <null>
           staticElement: self::@function::f::@parameter::c
           staticType: C*
       rightParenthesis: )
diff --git a/pkg/analyzer/test/src/dart/resolution/function_reference_test.dart b/pkg/analyzer/test/src/dart/resolution/function_reference_test.dart
index 1ef7367..0cb0ce2 100644
--- a/pkg/analyzer/test/src/dart/resolution/function_reference_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/function_reference_test.dart
@@ -113,6 +113,7 @@
     operator: =
     rightHandSide: SimpleIdentifier
       token: f
+      parameter: self::@setter::g::@parameter::_g
       staticElement: self::@function::foo::@parameter::f
       staticType: void Function<T>(T)
     readElement: <null>
@@ -150,6 +151,7 @@
     operator: +=
     rightHandSide: IntegerLiteral
       literal: 1
+      parameter: self::@extension::0::@method::+::@parameter::i
       staticType: int
     readElement: self::@function::foo::@parameter::f
     readType: void Function<T>(T)
@@ -208,6 +210,7 @@
     operator: +
     rightOperand: IntegerLiteral
       literal: 1
+      parameter: self::@class::C::@method::+::@parameter::i
       staticType: int
     staticElement: self::@class::C::@method::+
     staticInvokeType: void Function<T>(T) Function(int)
@@ -402,6 +405,9 @@
     leftBracket: [
     index: IntegerLiteral
       literal: 0
+      parameter: ParameterMember
+        base: dart:core::@class::List::@method::[]::@parameter::index
+        substitution: {E: void Function<T>(T)}
       staticType: int
     rightBracket: ]
     staticElement: MethodMember
@@ -1089,6 +1095,7 @@
         arguments
           SimpleIdentifier
             token: a
+            parameter: <null>
             staticElement: self::@function::bar::@parameter::a
             staticType: A
         rightParenthesis: )
@@ -1221,6 +1228,7 @@
         arguments
           SimpleIdentifier
             token: a
+            parameter: <null>
             staticElement: self::@function::bar::@parameter::a
             staticType: A
         rightParenthesis: )
@@ -1321,6 +1329,7 @@
         arguments
           SimpleIdentifier
             token: a
+            parameter: <null>
             staticElement: self::@function::bar::@parameter::a
             staticType: A
         rightParenthesis: )
@@ -1374,6 +1383,7 @@
         arguments
           SimpleIdentifier
             token: a
+            parameter: <null>
             staticElement: self::@function::bar::@parameter::a
             staticType: A
         rightParenthesis: )
@@ -2272,6 +2282,7 @@
         operator: ??
         rightOperand: SimpleIdentifier
           token: b
+          parameter: <null>
           staticElement: self::@function::f::@parameter::b
           staticType: A
         staticElement: <null>
diff --git a/pkg/analyzer/test/src/dart/resolution/index_expression_test.dart b/pkg/analyzer/test/src/dart/resolution/index_expression_test.dart
index 6bb0204..2c998d6 100644
--- a/pkg/analyzer/test/src/dart/resolution/index_expression_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/index_expression_test.dart
@@ -20,6 +20,7 @@
 void f({a = b?[0]}) {}
 ''');
 
+    // TODO(scheglov) https://github.com/dart-lang/sdk/issues/49101
     assertResolvedNodeText(findNode.index('[0]'), r'''
 IndexExpression
   target: SimpleIdentifier
@@ -29,6 +30,7 @@
   leftBracket: [
   index: IntegerLiteral
     literal: 0
+    parameter: <null>
     staticType: int
   rightBracket: ]
   staticElement: <null>
@@ -50,6 +52,7 @@
   leftBracket: [
   index: IntegerLiteral
     literal: 0
+    parameter: <null>
     staticType: int
   rightBracket: ]
   staticElement: <null>
@@ -80,6 +83,7 @@
   leftBracket: [
   index: IntegerLiteral
     literal: 0
+    parameter: self::@class::A::@method::[]::@parameter::index
     staticType: int
   rightBracket: ]
   staticElement: self::@class::A::@method::[]
@@ -108,6 +112,7 @@
   leftBracket: [
   index: IntegerLiteral
     literal: 0
+    parameter: self::@class::A::@method::[]::@parameter::index
     staticType: int
   rightBracket: ]
   staticElement: self::@class::A::@method::[]
@@ -120,6 +125,7 @@
   leftBracket: [
   index: IntegerLiteral
     literal: 1
+    parameter: self::@class::A::@method::[]::@parameter::index
     staticType: int
   rightBracket: ]
   staticElement: self::@class::A::@method::[]
@@ -152,6 +158,9 @@
   leftBracket: [
   index: IntegerLiteral
     literal: 0
+    parameter: ParameterMember
+      base: self::@class::A::@method::[]::@parameter::index
+      substitution: {T: double}
     staticType: int
   rightBracket: ]
   staticElement: MethodMember
@@ -189,6 +198,7 @@
   leftBracket: [
   index: IntegerLiteral
     literal: 0
+    parameter: self::@class::A::@method::[]::@parameter::index
     staticType: int
   rightBracket: ]
   staticElement: self::@class::A::@method::[]
@@ -228,6 +238,7 @@
     leftBracket: [
     index: IntegerLiteral
       literal: 0
+      parameter: self::@class::A::@method::[]=::@parameter::index
       staticType: int
     rightBracket: ]
     staticElement: <null>
@@ -235,6 +246,7 @@
   operator: +=
   rightHandSide: DoubleLiteral
     literal: 1.2
+    parameter: dart:core::@class::num::@method::+::@parameter::other
     staticType: double
   readElement: self::@class::A::@method::[]
   readType: num
@@ -286,6 +298,9 @@
     leftBracket: [
     index: IntegerLiteral
       literal: 0
+      parameter: ParameterMember
+        base: self::@class::A::@method::[]=::@parameter::index
+        substitution: {T: double}
       staticType: int
     rightBracket: ]
     staticElement: <null>
@@ -293,6 +308,7 @@
   operator: +=
   rightHandSide: DoubleLiteral
     literal: 1.2
+    parameter: dart:core::@class::double::@method::+::@parameter::other
     staticType: double
   readElement: MethodMember
     base: self::@class::A::@method::[]
@@ -345,6 +361,7 @@
     leftBracket: [
     index: IntegerLiteral
       literal: 0
+      parameter: self::@class::A::@method::[]=::@parameter::index
       staticType: int
     rightBracket: ]
     staticElement: <null>
@@ -352,6 +369,7 @@
   operator: +=
   rightHandSide: DoubleLiteral
     literal: 1.2
+    parameter: dart:core::@class::num::@method::+::@parameter::other
     staticType: double
   readElement: self::@class::A::@method::[]
   readType: num
@@ -398,6 +416,7 @@
     leftBracket: [
     index: IntegerLiteral
       literal: 0
+      parameter: self::@class::A::@method::[]=::@parameter::index
       staticType: int
     rightBracket: ]
     staticElement: <null>
@@ -405,6 +424,7 @@
   operator: =
   rightHandSide: DoubleLiteral
     literal: 1.2
+    parameter: self::@class::A::@method::[]=::@parameter::value
     staticType: double
   readElement: <null>
   readType: null
@@ -445,6 +465,7 @@
         leftBracket: [
         index: IntegerLiteral
           literal: 0
+          parameter: self::@class::A::@method::[]=::@parameter::index
           staticType: int
         rightBracket: ]
         staticElement: <null>
@@ -452,6 +473,7 @@
       operator: =
       rightHandSide: SimpleIdentifier
         token: a
+        parameter: self::@class::A::@method::[]=::@parameter::a
         staticElement: self::@function::f::@parameter::a
         staticType: A
       readElement: <null>
@@ -466,6 +488,7 @@
         leftBracket: [
         index: IntegerLiteral
           literal: 1
+          parameter: self::@class::A::@method::[]=::@parameter::index
           staticType: int
         rightBracket: ]
         staticElement: <null>
@@ -473,6 +496,7 @@
       operator: =
       rightHandSide: SimpleIdentifier
         token: a
+        parameter: self::@class::A::@method::[]=::@parameter::a
         staticElement: self::@function::f::@parameter::a
         staticType: A
       readElement: <null>
@@ -519,6 +543,9 @@
     leftBracket: [
     index: IntegerLiteral
       literal: 0
+      parameter: ParameterMember
+        base: self::@class::A::@method::[]=::@parameter::index
+        substitution: {T: double}
       staticType: int
     rightBracket: ]
     staticElement: <null>
@@ -526,6 +553,9 @@
   operator: =
   rightHandSide: DoubleLiteral
     literal: 1.2
+    parameter: ParameterMember
+      base: self::@class::A::@method::[]=::@parameter::value
+      substitution: {T: double}
     staticType: double
   readElement: <null>
   readType: null
@@ -577,6 +607,7 @@
     leftBracket: [
     index: IntegerLiteral
       literal: 0
+      parameter: self::@class::A::@method::[]=::@parameter::index
       staticType: int
     rightBracket: ]
     staticElement: <null>
@@ -584,6 +615,7 @@
   operator: =
   rightHandSide: DoubleLiteral
     literal: 1.2
+    parameter: self::@class::A::@method::[]=::@parameter::value
     staticType: double
   readElement: <null>
   readType: null
diff --git a/pkg/analyzer/test/src/dart/resolution/instance_creation_test.dart b/pkg/analyzer/test/src/dart/resolution/instance_creation_test.dart
index b0f2e14..ee95251 100644
--- a/pkg/analyzer/test/src/dart/resolution/instance_creation_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/instance_creation_test.dart
@@ -57,6 +57,9 @@
     arguments
       IntegerLiteral
         literal: 0
+        parameter: ParameterMember
+          base: self::@class::A::@constructor::named::@parameter::t
+          substitution: {T: int}
         staticType: int
     rightParenthesis: )
   staticType: A<int>
@@ -143,6 +146,9 @@
     arguments
       IntegerLiteral
         literal: 0
+        parameter: ParameterMember
+          base: self::@class::A::@constructor::•::@parameter::t
+          substitution: {T: int}
         staticType: int
     rightParenthesis: )
   staticType: A<int>
@@ -218,6 +224,7 @@
     arguments
       IntegerLiteral
         literal: 0
+        parameter: self::@class::A::@constructor::•::@parameter::a
         staticType: int
     rightParenthesis: )
   staticType: A
@@ -256,6 +263,9 @@
     arguments
       SimpleIdentifier
         token: s
+        parameter: ParameterMember
+          base: self::@class::A::@constructor::•::@parameter::t
+          substitution: {T: S}
         staticElement: self::@function::f::@parameter::s
         staticType: S & int
     rightParenthesis: )
@@ -626,6 +636,7 @@
         argumentList: ArgumentList
           leftParenthesis: (
           rightParenthesis: )
+        parameter: self::@class::X::@constructor::•::@parameter::a
         staticInvokeType: A Function()
         staticType: A
         typeArgumentTypes
@@ -645,6 +656,7 @@
           argumentList: ArgumentList
             leftParenthesis: (
             rightParenthesis: )
+          parameter: <null>
           staticInvokeType: C? Function()
           staticType: C?
           typeArgumentTypes
@@ -657,6 +669,7 @@
         argumentList: ArgumentList
           leftParenthesis: (
           rightParenthesis: )
+        parameter: self::@class::X::@constructor::•::@parameter::b
         staticInvokeType: B Function()
         staticType: B
         typeArgumentTypes
@@ -676,6 +689,7 @@
           argumentList: ArgumentList
             leftParenthesis: (
             rightParenthesis: )
+          parameter: <null>
           staticInvokeType: D? Function()
           staticType: D?
           typeArgumentTypes
@@ -741,6 +755,9 @@
     arguments
       IntegerLiteral
         literal: 0
+        parameter: ParameterMember
+          base: self::@class::A::@constructor::named::@parameter::t
+          substitution: {T: int}
         staticType: int
     rightParenthesis: )
   staticType: A<int>
@@ -785,6 +802,9 @@
     arguments
       IntegerLiteral
         literal: 0
+        parameter: ParameterMember
+          base: self::@class::A::@constructor::named::@parameter::t
+          substitution: {T: int, U: String}
         staticType: int
       SimpleStringLiteral
         literal: ''
@@ -824,6 +844,9 @@
     arguments
       IntegerLiteral
         literal: 0
+        parameter: ParameterMember
+          base: self::@class::A::@constructor::•::@parameter::t
+          substitution: {T: int}
         staticType: int
     rightParenthesis: )
   staticType: A<int>
@@ -861,6 +884,9 @@
     arguments
       IntegerLiteral
         literal: 0
+        parameter: ParameterMember
+          base: self::@class::A::@constructor::•::@parameter::t
+          substitution: {T: int, U: String}
         staticType: int
       SimpleStringLiteral
         literal: ''
@@ -909,6 +935,9 @@
     arguments
       IntegerLiteral
         literal: 0
+        parameter: ParameterMember
+          base: self::@class::A::@constructor::named::@parameter::t
+          substitution: {T: String}
         staticType: int
     rightParenthesis: )
   staticType: A<String>
@@ -948,6 +977,9 @@
     arguments
       IntegerLiteral
         literal: 0
+        parameter: ParameterMember
+          base: self::@class::A::@constructor::•::@parameter::t
+          substitution: {T: String}
         staticType: int
     rightParenthesis: )
   staticType: A<String>
@@ -982,6 +1014,7 @@
     arguments
       IntegerLiteral
         literal: 0
+        parameter: self::@class::A::@constructor::•::@parameter::a
         staticType: int
     rightParenthesis: )
   staticType: A
@@ -1021,6 +1054,7 @@
     arguments
       IntegerLiteral
         literal: 0
+        parameter: self::@class::A::@constructor::•::@parameter::a
         staticType: int
     rightParenthesis: )
   staticType: A
@@ -1060,6 +1094,7 @@
     arguments
       IntegerLiteral
         literal: 0
+        parameter: self::@class::A::@constructor::•::@parameter::a
         staticType: int
     rightParenthesis: )
   staticType: A
@@ -1106,6 +1141,7 @@
     arguments
       IntegerLiteral
         literal: 0
+        parameter: self::@class::A::@constructor::•::@parameter::a
         staticType: int
     rightParenthesis: )
   staticType: A
diff --git a/pkg/analyzer/test/src/dart/resolution/metadata_test.dart b/pkg/analyzer/test/src/dart/resolution/metadata_test.dart
index 7a787e3..8da2b07 100644
--- a/pkg/analyzer/test/src/dart/resolution/metadata_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/metadata_test.dart
@@ -168,8 +168,10 @@
           arguments
             IntegerLiteral
               literal: 0
+              parameter: self::@class::A::@constructor::•::@parameter::f
               staticType: int
           rightParenthesis: )
+        parameter: self::@class::A::@constructor::•::@parameter::f
         staticType: A
     rightParenthesis: )
   element: self::@class::A::@constructor::•
@@ -208,6 +210,7 @@
     arguments
       IntegerLiteral
         literal: 3
+        parameter: self::@class::A::@constructor::•::@parameter::a
         staticType: int
     rightParenthesis: )
   element: self::@class::A::@constructor::•
@@ -248,6 +251,9 @@
     arguments
       IntegerLiteral
         literal: 0
+        parameter: ParameterMember
+          base: package:test/a.dart::@class::A::@constructor::•::@parameter::a
+          isLegacy: true
         staticType: int*
     rightParenthesis: )
   element: ConstructorMember
@@ -297,6 +303,9 @@
     arguments
       IntegerLiteral
         literal: 42
+        parameter: FieldFormalParameterMember
+          base: package:test/a.dart::@class::A::@constructor::named::@parameter::a
+          isLegacy: true
         staticType: int*
     rightParenthesis: )
   element: ConstructorMember
@@ -475,6 +484,9 @@
     arguments
       IntegerLiteral
         literal: 0
+        parameter: ParameterMember
+          base: package:test/a.dart::@class::A::@constructor::•::@parameter::a
+          isLegacy: true
         staticType: int*
     rightParenthesis: )
   element: ConstructorMember
@@ -525,6 +537,9 @@
     arguments
       IntegerLiteral
         literal: 0
+        parameter: ParameterMember
+          base: package:test/a.dart::@class::A::@constructor::named::@parameter::a
+          isLegacy: true
         staticType: int*
     rightParenthesis: )
   element: ConstructorMember
@@ -646,6 +661,7 @@
     arguments
       IntegerLiteral
         literal: 42
+        parameter: self::@class::A::@constructor::named::@parameter::f
         staticType: int
     rightParenthesis: )
   element: self::@class::A::@constructor::named
@@ -718,6 +734,7 @@
     arguments
       IntegerLiteral
         literal: 42
+        parameter: self::@class::A::@constructor::•::@parameter::f
         staticType: int
     rightParenthesis: )
   element: self::@class::A::@constructor::•
@@ -770,6 +787,9 @@
       ListLiteral
         leftBracket: [
         rightBracket: ]
+        parameter: FieldFormalParameterMember
+          base: self::@class::A::@constructor::named::@parameter::f
+          substitution: {T: Object?}
         staticType: List<List<Object?>>
     rightParenthesis: )
   element: ConstructorMember
@@ -813,6 +833,9 @@
       ListLiteral
         leftBracket: [
         rightBracket: ]
+        parameter: FieldFormalParameterMember
+          base: self::@class::A::@constructor::•::@parameter::f
+          substitution: {T: Object?}
         staticType: List<List<Object?>>
     rightParenthesis: )
   element: ConstructorMember
@@ -867,6 +890,9 @@
     arguments
       IntegerLiteral
         literal: 42
+        parameter: FieldFormalParameterMember
+          base: self::@class::A::@constructor::named::@parameter::f
+          substitution: {T: int}
         staticType: int
     rightParenthesis: )
   element: ConstructorMember
@@ -908,6 +934,9 @@
     arguments
       IntegerLiteral
         literal: 42
+        parameter: FieldFormalParameterMember
+          base: self::@class::A::@constructor::•::@parameter::f
+          substitution: {T: int}
         staticType: int
     rightParenthesis: )
   element: ConstructorMember
@@ -990,6 +1019,9 @@
     arguments
       IntegerLiteral
         literal: 42
+        parameter: FieldFormalParameterMember
+          base: self::@class::A::@constructor::named::@parameter::f
+          substitution: {T: dynamic}
         staticType: int
     rightParenthesis: )
   element: ConstructorMember
@@ -1076,6 +1108,9 @@
     arguments
       IntegerLiteral
         literal: 42
+        parameter: FieldFormalParameterMember
+          base: self::@class::A::@constructor::named::@parameter::f
+          substitution: {T: int}
         staticType: int
     rightParenthesis: )
   element: ConstructorMember
@@ -1127,6 +1162,9 @@
     arguments
       IntegerLiteral
         literal: 42
+        parameter: FieldFormalParameterMember
+          base: self::@class::A::@constructor::•::@parameter::f
+          substitution: {T: int}
         staticType: int
     rightParenthesis: )
   element: ConstructorMember
@@ -1169,6 +1207,9 @@
     arguments
       IntegerLiteral
         literal: 42
+        parameter: FieldFormalParameterMember
+          base: self::@class::A::@constructor::•::@parameter::f
+          substitution: {T: dynamic}
         staticType: int
     rightParenthesis: )
   element: ConstructorMember
@@ -1214,6 +1255,9 @@
     arguments
       IntegerLiteral
         literal: 42
+        parameter: ParameterMember
+          base: self::@class::B::@constructor::•::@parameter::f
+          substitution: {T: int}
         staticType: int
     rightParenthesis: )
   element: ConstructorMember
@@ -1258,6 +1302,9 @@
     arguments
       IntegerLiteral
         literal: 42
+        parameter: ParameterMember
+          base: self::@class::B::@constructor::•::@parameter::f
+          substitution: {T: int}
         staticType: int
     rightParenthesis: )
   element: ConstructorMember
@@ -1299,6 +1346,9 @@
     arguments
       IntegerLiteral
         literal: 42
+        parameter: ParameterMember
+          base: self::@class::B::@constructor::•::@parameter::f
+          substitution: {T: int}
         staticType: int
     rightParenthesis: )
   element: ConstructorMember
@@ -1339,6 +1389,9 @@
     arguments
       IntegerLiteral
         literal: 42
+        parameter: ParameterMember
+          base: self::@class::B::@constructor::•::@parameter::f
+          substitution: {T: int}
         staticType: int
     rightParenthesis: )
   element: ConstructorMember
@@ -1380,6 +1433,9 @@
     arguments
       IntegerLiteral
         literal: 42
+        parameter: ParameterMember
+          base: self::@class::B::@constructor::•::@parameter::f
+          substitution: {T: int}
         staticType: int
     rightParenthesis: )
   element: ConstructorMember
@@ -1423,6 +1479,9 @@
     arguments
       IntegerLiteral
         literal: 42
+        parameter: ParameterMember
+          base: self::@class::B::@constructor::•::@parameter::f
+          substitution: {T: int}
         staticType: int
     rightParenthesis: )
   element: ConstructorMember
@@ -1474,6 +1533,9 @@
     arguments
       IntegerLiteral
         literal: 42
+        parameter: ParameterMember
+          base: self::@class::B::@constructor::•::@parameter::f
+          substitution: {T: int}
         staticType: int
     rightParenthesis: )
   element: ConstructorMember
@@ -1663,6 +1725,9 @@
     arguments
       IntegerLiteral
         literal: 42
+        parameter: FieldFormalParameterMember
+          base: package:test/a.dart::@class::A::@constructor::named::@parameter::f
+          substitution: {T: int}
         staticType: int
     rightParenthesis: )
   element: ConstructorMember
@@ -1718,6 +1783,9 @@
     arguments
       IntegerLiteral
         literal: 42
+        parameter: FieldFormalParameterMember
+          base: package:test/a.dart::@class::A::@constructor::•::@parameter::f
+          substitution: {T: int}
         staticType: int
     rightParenthesis: )
   element: ConstructorMember
@@ -1790,6 +1858,9 @@
     arguments
       IntegerLiteral
         literal: 42
+        parameter: FieldFormalParameterMember
+          base: package:test/a.dart::@class::A::@constructor::named::@parameter::f
+          substitution: {T: int}
         staticType: int
     rightParenthesis: )
   element: ConstructorMember
@@ -1855,6 +1926,9 @@
     arguments
       IntegerLiteral
         literal: 42
+        parameter: FieldFormalParameterMember
+          base: package:test/a.dart::@class::A::@constructor::•::@parameter::f
+          substitution: {T: int}
         staticType: int
     rightParenthesis: )
   element: ConstructorMember
@@ -1952,9 +2026,15 @@
     arguments
       IntegerLiteral
         literal: 42
+        parameter: FieldFormalParameterMember
+          base: self::@class::A::@constructor::named::@parameter::t
+          substitution: {T: int, U: double}
         staticType: int
       DoubleLiteral
         literal: 1.2
+        parameter: FieldFormalParameterMember
+          base: self::@class::A::@constructor::named::@parameter::u
+          substitution: {T: int, U: double}
         staticType: double
     rightParenthesis: )
   element: ConstructorMember
@@ -2017,9 +2097,15 @@
     arguments
       IntegerLiteral
         literal: 42
+        parameter: FieldFormalParameterMember
+          base: self::@class::A::@constructor::•::@parameter::t
+          substitution: {T: int, U: double}
         staticType: int
       DoubleLiteral
         literal: 1.2
+        parameter: FieldFormalParameterMember
+          base: self::@class::A::@constructor::•::@parameter::u
+          substitution: {T: int, U: double}
         staticType: double
     rightParenthesis: )
   element: ConstructorMember
@@ -2083,6 +2169,9 @@
     arguments
       IntegerLiteral
         literal: 42
+        parameter: FieldFormalParameterMember
+          base: self::@class::A::@constructor::named::@parameter::f
+          substitution: {T: int}
         staticType: int
     rightParenthesis: )
   element: ConstructorMember
@@ -2127,6 +2216,9 @@
     arguments
       IntegerLiteral
         literal: 42
+        parameter: FieldFormalParameterMember
+          base: self::@class::A::@constructor::•::@parameter::f
+          substitution: {T: int}
         staticType: int
     rightParenthesis: )
   element: ConstructorMember
@@ -2188,6 +2280,9 @@
     arguments
       IntegerLiteral
         literal: 42
+        parameter: FieldFormalParameterMember
+          base: self::@class::A::@constructor::named::@parameter::f
+          substitution: {T: int}
         staticType: int
     rightParenthesis: )
   element: ConstructorMember
@@ -2242,6 +2337,9 @@
     arguments
       IntegerLiteral
         literal: 42
+        parameter: FieldFormalParameterMember
+          base: self::@class::A::@constructor::•::@parameter::f
+          substitution: {T: int}
         staticType: int
     rightParenthesis: )
   element: ConstructorMember
@@ -2298,6 +2396,9 @@
     arguments
       IntegerLiteral
         literal: 42
+        parameter: FieldFormalParameterMember
+          base: self::@class::A::@constructor::named::@parameter::f
+          substitution: {T: int}
         staticType: int
     rightParenthesis: )
   element: ConstructorMember
@@ -2342,6 +2443,9 @@
     arguments
       IntegerLiteral
         literal: 42
+        parameter: FieldFormalParameterMember
+          base: self::@class::A::@constructor::•::@parameter::f
+          substitution: {T: int}
         staticType: int
     rightParenthesis: )
   element: ConstructorMember
@@ -2394,6 +2498,7 @@
     arguments
       IntegerLiteral
         literal: 42
+        parameter: self::@class::A::@constructor::named::@parameter::f
         staticType: int
     rightParenthesis: )
   element: self::@class::A::@constructor::named
@@ -2435,6 +2540,7 @@
     arguments
       IntegerLiteral
         literal: 42
+        parameter: self::@class::A::@constructor::•::@parameter::f
         staticType: int
     rightParenthesis: )
   element: self::@class::A::@constructor::•
diff --git a/pkg/analyzer/test/src/dart/resolution/method_invocation_test.dart b/pkg/analyzer/test/src/dart/resolution/method_invocation_test.dart
index 8179271..342e26d 100644
--- a/pkg/analyzer/test/src/dart/resolution/method_invocation_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/method_invocation_test.dart
@@ -187,6 +187,7 @@
     arguments
       SimpleIdentifier
         token: c
+        parameter: root::@parameter::
         staticElement: self::@function::f::@parameter::c
         staticType: C
     rightParenthesis: )
@@ -534,6 +535,7 @@
     arguments
       IntegerLiteral
         literal: 0
+        parameter: self::@class::A::@method::foo::@parameter::_
         staticType: int
     rightParenthesis: )
   staticInvokeType: void Function(int)
@@ -571,6 +573,7 @@
     arguments
       IntegerLiteral
         literal: 0
+        parameter: self::@class::A::@method::foo::@parameter::_
         staticType: int
     rightParenthesis: )
   staticInvokeType: void Function(int)
@@ -679,6 +682,7 @@
         argumentList: ArgumentList
           leftParenthesis: (
           rightParenthesis: )
+        parameter: self::@function::foo::@parameter::a
         staticInvokeType: A Function()
         staticType: A
         typeArgumentTypes
@@ -698,6 +702,7 @@
           argumentList: ArgumentList
             leftParenthesis: (
             rightParenthesis: )
+          parameter: <null>
           staticInvokeType: C? Function()
           staticType: C?
           typeArgumentTypes
@@ -710,6 +715,7 @@
         argumentList: ArgumentList
           leftParenthesis: (
           rightParenthesis: )
+        parameter: self::@function::foo::@parameter::b
         staticInvokeType: B Function()
         staticType: B
         typeArgumentTypes
@@ -729,6 +735,7 @@
           argumentList: ArgumentList
             leftParenthesis: (
             rightParenthesis: )
+          parameter: <null>
           staticInvokeType: D? Function()
           staticType: D?
           typeArgumentTypes
@@ -915,6 +922,9 @@
     arguments
       SimpleIdentifier
         token: o
+        parameter: ParameterMember
+          base: root::@parameter::value
+          substitution: {T: Object}
         staticElement: self::@function::f::@parameter::o
         staticType: dynamic
     rightParenthesis: )
@@ -946,6 +956,9 @@
     arguments
       SimpleIdentifier
         token: o
+        parameter: ParameterMember
+          base: root::@parameter::value
+          substitution: {T: Object}
         staticElement: self::@function::f::@parameter::o
         staticType: List<void>
     rightParenthesis: )
@@ -999,6 +1012,7 @@
               argumentList: ArgumentList
                 leftParenthesis: (
                 rightParenthesis: )
+              parameter: dart:core::@class::num::@method::clamp::@parameter::lowerLimit
               staticInvokeType: double Function()
               staticType: double
               typeArgumentTypes
@@ -1011,11 +1025,13 @@
               argumentList: ArgumentList
                 leftParenthesis: (
                 rightParenthesis: )
+              parameter: dart:core::@class::num::@method::clamp::@parameter::upperLimit
               staticInvokeType: double Function()
               staticType: double
               typeArgumentTypes
                 double
           rightParenthesis: )
+        parameter: self::@function::h::@parameter::x
         staticInvokeType: num Function(num, num)
         staticType: double
     rightParenthesis: )
@@ -1055,6 +1071,7 @@
               argumentList: ArgumentList
                 leftParenthesis: (
                 rightParenthesis: )
+              parameter: root::@parameter::lowerLimit
               staticInvokeType: num* Function()*
               staticType: num*
               typeArgumentTypes
@@ -1067,11 +1084,13 @@
               argumentList: ArgumentList
                 leftParenthesis: (
                 rightParenthesis: )
+              parameter: root::@parameter::upperLimit
               staticInvokeType: num* Function()*
               staticType: num*
               typeArgumentTypes
                 num*
           rightParenthesis: )
+        parameter: self::@function::h::@parameter::x
         staticInvokeType: num* Function(num*, num*)*
         staticType: num*
     rightParenthesis: )
@@ -1126,6 +1145,7 @@
               argumentList: ArgumentList
                 leftParenthesis: (
                 rightParenthesis: )
+              parameter: dart:core::@class::num::@method::clamp::@parameter::lowerLimit
               staticInvokeType: num Function()
               staticType: num
               typeArgumentTypes
@@ -1138,11 +1158,13 @@
               argumentList: ArgumentList
                 leftParenthesis: (
                 rightParenthesis: )
+              parameter: dart:core::@class::num::@method::clamp::@parameter::upperLimit
               staticInvokeType: num Function()
               staticType: num
               typeArgumentTypes
                 num
           rightParenthesis: )
+        parameter: self::@function::h::@parameter::x
         staticInvokeType: num Function(num, num)
         staticType: num
     rightParenthesis: )
@@ -1182,6 +1204,7 @@
               argumentList: ArgumentList
                 leftParenthesis: (
                 rightParenthesis: )
+              parameter: root::@parameter::lowerLimit
               staticInvokeType: num* Function()*
               staticType: num*
               typeArgumentTypes
@@ -1194,11 +1217,13 @@
               argumentList: ArgumentList
                 leftParenthesis: (
                 rightParenthesis: )
+              parameter: root::@parameter::upperLimit
               staticInvokeType: num* Function()*
               staticType: num*
               typeArgumentTypes
                 num*
           rightParenthesis: )
+        parameter: self::@function::h::@parameter::x
         staticInvokeType: num* Function(num*, num*)*
         staticType: num*
     rightParenthesis: )
@@ -1240,6 +1265,7 @@
         argumentList: ArgumentList
           leftParenthesis: (
           rightParenthesis: )
+        parameter: dart:core::@class::num::@method::clamp::@parameter::lowerLimit
         staticInvokeType: num Function()
         staticType: num
         typeArgumentTypes
@@ -1252,6 +1278,7 @@
         argumentList: ArgumentList
           leftParenthesis: (
           rightParenthesis: )
+        parameter: dart:core::@class::num::@method::clamp::@parameter::upperLimit
         staticInvokeType: num Function()
         staticType: num
         typeArgumentTypes
@@ -1285,6 +1312,7 @@
         argumentList: ArgumentList
           leftParenthesis: (
           rightParenthesis: )
+        parameter: root::@parameter::lowerLimit
         staticInvokeType: num* Function()*
         staticType: num*
         typeArgumentTypes
@@ -1297,6 +1325,7 @@
         argumentList: ArgumentList
           leftParenthesis: (
           rightParenthesis: )
+        parameter: root::@parameter::upperLimit
         staticInvokeType: num* Function()*
         staticType: num*
         typeArgumentTypes
@@ -1333,10 +1362,12 @@
     arguments
       SimpleIdentifier
         token: b
+        parameter: dart:core::@class::num::@method::clamp::@parameter::lowerLimit
         staticElement: self::@function::f::@parameter::b
         staticType: double
       SimpleIdentifier
         token: c
+        parameter: dart:core::@class::num::@method::clamp::@parameter::upperLimit
         staticElement: self::@function::f::@parameter::c
         staticType: double
     rightParenthesis: )
@@ -1362,10 +1393,12 @@
     arguments
       SimpleIdentifier
         token: b
+        parameter: root::@parameter::lowerLimit
         staticElement: self::@function::f::@parameter::b
         staticType: double*
       SimpleIdentifier
         token: c
+        parameter: root::@parameter::upperLimit
         staticElement: self::@function::f::@parameter::c
         staticType: double*
     rightParenthesis: )
@@ -1400,10 +1433,12 @@
     arguments
       SimpleIdentifier
         token: b
+        parameter: dart:core::@class::num::@method::clamp::@parameter::lowerLimit
         staticElement: self::@function::f::@parameter::b
         staticType: double
       SimpleIdentifier
         token: c
+        parameter: dart:core::@class::num::@method::clamp::@parameter::upperLimit
         staticElement: self::@function::f::@parameter::c
         staticType: int
     rightParenthesis: )
@@ -1429,10 +1464,12 @@
     arguments
       SimpleIdentifier
         token: b
+        parameter: root::@parameter::lowerLimit
         staticElement: self::@function::f::@parameter::b
         staticType: double*
       SimpleIdentifier
         token: c
+        parameter: root::@parameter::upperLimit
         staticElement: self::@function::f::@parameter::c
         staticType: int*
     rightParenthesis: )
@@ -1467,10 +1504,12 @@
     arguments
       SimpleIdentifier
         token: b
+        parameter: dart:core::@class::num::@method::clamp::@parameter::lowerLimit
         staticElement: self::@function::f::@parameter::b
         staticType: int
       SimpleIdentifier
         token: c
+        parameter: dart:core::@class::num::@method::clamp::@parameter::upperLimit
         staticElement: self::@function::f::@parameter::c
         staticType: double
     rightParenthesis: )
@@ -1496,10 +1535,12 @@
     arguments
       SimpleIdentifier
         token: b
+        parameter: root::@parameter::lowerLimit
         staticElement: self::@function::f::@parameter::b
         staticType: int*
       SimpleIdentifier
         token: c
+        parameter: root::@parameter::upperLimit
         staticElement: self::@function::f::@parameter::c
         staticType: double*
     rightParenthesis: )
@@ -1534,10 +1575,12 @@
     arguments
       SimpleIdentifier
         token: b
+        parameter: dart:core::@class::num::@method::clamp::@parameter::lowerLimit
         staticElement: self::@function::f::@parameter::b
         staticType: int
       SimpleIdentifier
         token: c
+        parameter: dart:core::@class::num::@method::clamp::@parameter::upperLimit
         staticElement: self::@function::f::@parameter::c
         staticType: int
     rightParenthesis: )
@@ -1563,10 +1606,12 @@
     arguments
       SimpleIdentifier
         token: b
+        parameter: root::@parameter::lowerLimit
         staticElement: self::@function::f::@parameter::b
         staticType: int*
       SimpleIdentifier
         token: c
+        parameter: root::@parameter::upperLimit
         staticElement: self::@function::f::@parameter::c
         staticType: int*
     rightParenthesis: )
@@ -1621,6 +1666,7 @@
               argumentList: ArgumentList
                 leftParenthesis: (
                 rightParenthesis: )
+              parameter: dart:core::@class::num::@method::clamp::@parameter::lowerLimit
               staticInvokeType: num Function()
               staticType: num
               typeArgumentTypes
@@ -1633,11 +1679,13 @@
               argumentList: ArgumentList
                 leftParenthesis: (
                 rightParenthesis: )
+              parameter: dart:core::@class::num::@method::clamp::@parameter::upperLimit
               staticInvokeType: num Function()
               staticType: num
               typeArgumentTypes
                 num
           rightParenthesis: )
+        parameter: self::@function::h::@parameter::x
         staticInvokeType: num Function(num, num)
         staticType: num
     rightParenthesis: )
@@ -1677,6 +1725,7 @@
               argumentList: ArgumentList
                 leftParenthesis: (
                 rightParenthesis: )
+              parameter: root::@parameter::lowerLimit
               staticInvokeType: num* Function()*
               staticType: num*
               typeArgumentTypes
@@ -1689,11 +1738,13 @@
               argumentList: ArgumentList
                 leftParenthesis: (
                 rightParenthesis: )
+              parameter: root::@parameter::upperLimit
               staticInvokeType: num* Function()*
               staticType: num*
               typeArgumentTypes
                 num*
           rightParenthesis: )
+        parameter: self::@function::h::@parameter::x
         staticInvokeType: num* Function(num*, num*)*
         staticType: num*
     rightParenthesis: )
@@ -1744,6 +1795,7 @@
               argumentList: ArgumentList
                 leftParenthesis: (
                 rightParenthesis: )
+              parameter: dart:core::@class::num::@method::clamp::@parameter::lowerLimit
               staticInvokeType: int Function()
               staticType: int
               typeArgumentTypes
@@ -1756,11 +1808,13 @@
               argumentList: ArgumentList
                 leftParenthesis: (
                 rightParenthesis: )
+              parameter: dart:core::@class::num::@method::clamp::@parameter::upperLimit
               staticInvokeType: int Function()
               staticType: int
               typeArgumentTypes
                 int
           rightParenthesis: )
+        parameter: self::@function::h::@parameter::x
         staticInvokeType: num Function(num, num)
         staticType: int
     rightParenthesis: )
@@ -1800,6 +1854,7 @@
               argumentList: ArgumentList
                 leftParenthesis: (
                 rightParenthesis: )
+              parameter: root::@parameter::lowerLimit
               staticInvokeType: num* Function()*
               staticType: num*
               typeArgumentTypes
@@ -1812,11 +1867,13 @@
               argumentList: ArgumentList
                 leftParenthesis: (
                 rightParenthesis: )
+              parameter: root::@parameter::upperLimit
               staticInvokeType: num* Function()*
               staticType: num*
               typeArgumentTypes
                 num*
           rightParenthesis: )
+        parameter: self::@function::h::@parameter::x
         staticInvokeType: num* Function(num*, num*)*
         staticType: num*
     rightParenthesis: )
@@ -1858,6 +1915,7 @@
         argumentList: ArgumentList
           leftParenthesis: (
           rightParenthesis: )
+        parameter: dart:core::@class::num::@method::clamp::@parameter::lowerLimit
         staticInvokeType: num Function()
         staticType: num
         typeArgumentTypes
@@ -1870,6 +1928,7 @@
         argumentList: ArgumentList
           leftParenthesis: (
           rightParenthesis: )
+        parameter: dart:core::@class::num::@method::clamp::@parameter::upperLimit
         staticInvokeType: num Function()
         staticType: num
         typeArgumentTypes
@@ -1903,6 +1962,7 @@
         argumentList: ArgumentList
           leftParenthesis: (
           rightParenthesis: )
+        parameter: root::@parameter::lowerLimit
         staticInvokeType: num* Function()*
         staticType: num*
         typeArgumentTypes
@@ -1915,6 +1975,7 @@
         argumentList: ArgumentList
           leftParenthesis: (
           rightParenthesis: )
+        parameter: root::@parameter::upperLimit
         staticInvokeType: num* Function()*
         staticType: num*
         typeArgumentTypes
@@ -1951,10 +2012,12 @@
     arguments
       SimpleIdentifier
         token: b
+        parameter: dart:core::@class::num::@method::clamp::@parameter::lowerLimit
         staticElement: self::@function::f::@parameter::b
         staticType: double
       SimpleIdentifier
         token: c
+        parameter: dart:core::@class::num::@method::clamp::@parameter::upperLimit
         staticElement: self::@function::f::@parameter::c
         staticType: double
     rightParenthesis: )
@@ -1980,10 +2043,12 @@
     arguments
       SimpleIdentifier
         token: b
+        parameter: root::@parameter::lowerLimit
         staticElement: self::@function::f::@parameter::b
         staticType: double*
       SimpleIdentifier
         token: c
+        parameter: root::@parameter::upperLimit
         staticElement: self::@function::f::@parameter::c
         staticType: double*
     rightParenthesis: )
@@ -2018,10 +2083,12 @@
     arguments
       SimpleIdentifier
         token: b
+        parameter: dart:core::@class::num::@method::clamp::@parameter::lowerLimit
         staticElement: self::@function::f::@parameter::b
         staticType: double
       SimpleIdentifier
         token: c
+        parameter: dart:core::@class::num::@method::clamp::@parameter::upperLimit
         staticElement: self::@function::f::@parameter::c
         staticType: dynamic
     rightParenthesis: )
@@ -2047,10 +2114,12 @@
     arguments
       SimpleIdentifier
         token: b
+        parameter: root::@parameter::lowerLimit
         staticElement: self::@function::f::@parameter::b
         staticType: double*
       SimpleIdentifier
         token: c
+        parameter: root::@parameter::upperLimit
         staticElement: self::@function::f::@parameter::c
         staticType: dynamic
     rightParenthesis: )
@@ -2085,10 +2154,12 @@
     arguments
       SimpleIdentifier
         token: b
+        parameter: dart:core::@class::num::@method::clamp::@parameter::lowerLimit
         staticElement: self::@function::f::@parameter::b
         staticType: double
       SimpleIdentifier
         token: c
+        parameter: dart:core::@class::num::@method::clamp::@parameter::upperLimit
         staticElement: self::@function::f::@parameter::c
         staticType: int
     rightParenthesis: )
@@ -2114,10 +2185,12 @@
     arguments
       SimpleIdentifier
         token: b
+        parameter: root::@parameter::lowerLimit
         staticElement: self::@function::f::@parameter::b
         staticType: double*
       SimpleIdentifier
         token: c
+        parameter: root::@parameter::upperLimit
         staticElement: self::@function::f::@parameter::c
         staticType: int*
     rightParenthesis: )
@@ -2152,10 +2225,12 @@
     arguments
       SimpleIdentifier
         token: b
+        parameter: dart:core::@class::num::@method::clamp::@parameter::lowerLimit
         staticElement: self::@function::f::@parameter::b
         staticType: dynamic
       SimpleIdentifier
         token: c
+        parameter: dart:core::@class::num::@method::clamp::@parameter::upperLimit
         staticElement: self::@function::f::@parameter::c
         staticType: double
     rightParenthesis: )
@@ -2181,10 +2256,12 @@
     arguments
       SimpleIdentifier
         token: b
+        parameter: root::@parameter::lowerLimit
         staticElement: self::@function::f::@parameter::b
         staticType: dynamic
       SimpleIdentifier
         token: c
+        parameter: root::@parameter::upperLimit
         staticElement: self::@function::f::@parameter::c
         staticType: double*
     rightParenthesis: )
@@ -2219,10 +2296,12 @@
     arguments
       SimpleIdentifier
         token: b
+        parameter: dart:core::@class::num::@method::clamp::@parameter::lowerLimit
         staticElement: self::@function::f::@parameter::b
         staticType: dynamic
       SimpleIdentifier
         token: c
+        parameter: dart:core::@class::num::@method::clamp::@parameter::upperLimit
         staticElement: self::@function::f::@parameter::c
         staticType: int
     rightParenthesis: )
@@ -2248,10 +2327,12 @@
     arguments
       SimpleIdentifier
         token: b
+        parameter: root::@parameter::lowerLimit
         staticElement: self::@function::f::@parameter::b
         staticType: dynamic
       SimpleIdentifier
         token: c
+        parameter: root::@parameter::upperLimit
         staticElement: self::@function::f::@parameter::c
         staticType: int*
     rightParenthesis: )
@@ -2286,10 +2367,12 @@
     arguments
       SimpleIdentifier
         token: b
+        parameter: dart:core::@class::num::@method::clamp::@parameter::lowerLimit
         staticElement: self::@function::f::@parameter::b
         staticType: int
       SimpleIdentifier
         token: c
+        parameter: dart:core::@class::num::@method::clamp::@parameter::upperLimit
         staticElement: self::@function::f::@parameter::c
         staticType: double
     rightParenthesis: )
@@ -2315,10 +2398,12 @@
     arguments
       SimpleIdentifier
         token: b
+        parameter: root::@parameter::lowerLimit
         staticElement: self::@function::f::@parameter::b
         staticType: int*
       SimpleIdentifier
         token: c
+        parameter: root::@parameter::upperLimit
         staticElement: self::@function::f::@parameter::c
         staticType: double*
     rightParenthesis: )
@@ -2353,10 +2438,12 @@
     arguments
       SimpleIdentifier
         token: b
+        parameter: dart:core::@class::num::@method::clamp::@parameter::lowerLimit
         staticElement: self::@function::f::@parameter::b
         staticType: int
       SimpleIdentifier
         token: c
+        parameter: dart:core::@class::num::@method::clamp::@parameter::upperLimit
         staticElement: self::@function::f::@parameter::c
         staticType: dynamic
     rightParenthesis: )
@@ -2382,10 +2469,12 @@
     arguments
       SimpleIdentifier
         token: b
+        parameter: root::@parameter::lowerLimit
         staticElement: self::@function::f::@parameter::b
         staticType: int*
       SimpleIdentifier
         token: c
+        parameter: root::@parameter::upperLimit
         staticElement: self::@function::f::@parameter::c
         staticType: dynamic
     rightParenthesis: )
@@ -2420,10 +2509,12 @@
     arguments
       SimpleIdentifier
         token: b
+        parameter: dart:core::@class::num::@method::clamp::@parameter::lowerLimit
         staticElement: self::@function::f::@parameter::b
         staticType: int
       SimpleIdentifier
         token: c
+        parameter: dart:core::@class::num::@method::clamp::@parameter::upperLimit
         staticElement: self::@function::f::@parameter::c
         staticType: int
     rightParenthesis: )
@@ -2449,10 +2540,12 @@
     arguments
       SimpleIdentifier
         token: b
+        parameter: root::@parameter::lowerLimit
         staticElement: self::@function::f::@parameter::b
         staticType: int*
       SimpleIdentifier
         token: c
+        parameter: root::@parameter::upperLimit
         staticElement: self::@function::f::@parameter::c
         staticType: int*
     rightParenthesis: )
@@ -2487,10 +2580,12 @@
     arguments
       SimpleIdentifier
         token: b
+        parameter: dart:core::@class::num::@method::clamp::@parameter::lowerLimit
         staticElement: self::@function::f::@parameter::b
         staticType: int
       SimpleIdentifier
         token: c
+        parameter: dart:core::@class::num::@method::clamp::@parameter::upperLimit
         staticElement: self::@function::f::@parameter::c
         staticType: int
     rightParenthesis: )
@@ -2512,10 +2607,12 @@
     arguments
       SimpleIdentifier
         token: b
+        parameter: root::@parameter::lowerLimit
         staticElement: self::@function::f::@parameter::b
         staticType: int*
       SimpleIdentifier
         token: c
+        parameter: root::@parameter::upperLimit
         staticElement: self::@function::f::@parameter::c
         staticType: int*
     rightParenthesis: )
@@ -2549,6 +2646,7 @@
       arguments
         SimpleIdentifier
           token: a
+          parameter: <null>
           staticElement: self::@function::f::@parameter::a
           staticType: int
       rightParenthesis: )
@@ -2564,10 +2662,12 @@
     arguments
       SimpleIdentifier
         token: b
+        parameter: self::@extension::E::@method::clamp::@parameter::x
         staticElement: self::@function::f::@parameter::b
         staticType: int
       SimpleIdentifier
         token: c
+        parameter: self::@extension::E::@method::clamp::@parameter::y
         staticElement: self::@function::f::@parameter::c
         staticType: int
     rightParenthesis: )
@@ -2587,6 +2687,7 @@
       arguments
         SimpleIdentifier
           token: a
+          parameter: <null>
           staticElement: self::@function::f::@parameter::a
           staticType: int*
       rightParenthesis: )
@@ -2602,10 +2703,12 @@
     arguments
       SimpleIdentifier
         token: b
+        parameter: self::@extension::E::@method::clamp::@parameter::x
         staticElement: self::@function::f::@parameter::b
         staticType: int*
       SimpleIdentifier
         token: c
+        parameter: self::@extension::E::@method::clamp::@parameter::y
         staticElement: self::@function::f::@parameter::c
         staticType: int*
     rightParenthesis: )
@@ -2640,10 +2743,12 @@
     arguments
       SimpleIdentifier
         token: b
+        parameter: dart:core::@class::num::@method::clamp::@parameter::lowerLimit
         staticElement: self::@function::f::@parameter::b
         staticType: int
       SimpleIdentifier
         token: c
+        parameter: dart:core::@class::num::@method::clamp::@parameter::upperLimit
         staticElement: self::@function::f::@parameter::c
         staticType: Never
     rightParenthesis: )
@@ -2669,10 +2774,12 @@
     arguments
       SimpleIdentifier
         token: b
+        parameter: root::@parameter::lowerLimit
         staticElement: self::@function::f::@parameter::b
         staticType: int*
       SimpleIdentifier
         token: c
+        parameter: root::@parameter::upperLimit
         staticElement: self::@function::f::@parameter::c
         staticType: Null*
     rightParenthesis: )
@@ -2711,10 +2818,12 @@
     arguments
       SimpleIdentifier
         token: b
+        parameter: dart:core::@class::num::@method::clamp::@parameter::lowerLimit
         staticElement: self::@function::f::@parameter::b
         staticType: Never
       SimpleIdentifier
         token: c
+        parameter: dart:core::@class::num::@method::clamp::@parameter::upperLimit
         staticElement: self::@function::f::@parameter::c
         staticType: int
     rightParenthesis: )
@@ -2740,10 +2849,12 @@
     arguments
       SimpleIdentifier
         token: b
+        parameter: root::@parameter::lowerLimit
         staticElement: self::@function::f::@parameter::b
         staticType: Null*
       SimpleIdentifier
         token: c
+        parameter: root::@parameter::upperLimit
         staticElement: self::@function::f::@parameter::c
         staticType: int*
     rightParenthesis: )
@@ -2785,10 +2896,12 @@
     arguments
       SimpleIdentifier
         token: b
+        parameter: <null>
         staticElement: self::@function::f::@parameter::b
         staticType: int
       SimpleIdentifier
         token: c
+        parameter: <null>
         staticElement: self::@function::f::@parameter::c
         staticType: int
     rightParenthesis: )
@@ -2812,10 +2925,12 @@
     arguments
       SimpleIdentifier
         token: b
+        parameter: <null>
         staticElement: self::@function::f::@parameter::b
         staticType: int*
       SimpleIdentifier
         token: c
+        parameter: <null>
         staticElement: self::@function::f::@parameter::c
         staticType: int*
     rightParenthesis: )
@@ -2873,6 +2988,7 @@
               argumentList: ArgumentList
                 leftParenthesis: (
                 rightParenthesis: )
+              parameter: self::@class::A::@method::clamp::@parameter::x
               staticInvokeType: String Function()
               staticType: String
               typeArgumentTypes
@@ -2885,11 +3001,13 @@
               argumentList: ArgumentList
                 leftParenthesis: (
                 rightParenthesis: )
+              parameter: self::@class::A::@method::clamp::@parameter::y
               staticInvokeType: String Function()
               staticType: String
               typeArgumentTypes
                 String
           rightParenthesis: )
+        parameter: self::@function::h::@parameter::x
         staticInvokeType: num Function(String, String)
         staticType: num
     rightParenthesis: )
@@ -2927,6 +3045,7 @@
               argumentList: ArgumentList
                 leftParenthesis: (
                 rightParenthesis: )
+              parameter: self::@class::A::@method::clamp::@parameter::x
               staticInvokeType: String* Function()*
               staticType: String*
               typeArgumentTypes
@@ -2939,11 +3058,13 @@
               argumentList: ArgumentList
                 leftParenthesis: (
                 rightParenthesis: )
+              parameter: self::@class::A::@method::clamp::@parameter::y
               staticInvokeType: String* Function()*
               staticType: String*
               typeArgumentTypes
                 String*
           rightParenthesis: )
+        parameter: self::@function::h::@parameter::x
         staticInvokeType: num* Function(String*, String*)*
         staticType: num*
     rightParenthesis: )
@@ -2981,10 +3102,12 @@
     arguments
       SimpleIdentifier
         token: b
+        parameter: self::@class::A::@method::clamp::@parameter::x
         staticElement: self::@function::f::@parameter::b
         staticType: int
       SimpleIdentifier
         token: c
+        parameter: self::@class::A::@method::clamp::@parameter::y
         staticElement: self::@function::f::@parameter::c
         staticType: int
     rightParenthesis: )
@@ -3008,10 +3131,12 @@
     arguments
       SimpleIdentifier
         token: b
+        parameter: self::@class::A::@method::clamp::@parameter::x
         staticElement: self::@function::f::@parameter::b
         staticType: int*
       SimpleIdentifier
         token: c
+        parameter: self::@class::A::@method::clamp::@parameter::y
         staticElement: self::@function::f::@parameter::c
         staticType: int*
     rightParenthesis: )
@@ -3046,6 +3171,7 @@
       arguments
         SimpleIdentifier
           token: a
+          parameter: <null>
           staticElement: self::@function::f::@parameter::a
           staticType: A
       rightParenthesis: )
@@ -3061,10 +3187,12 @@
     arguments
       SimpleIdentifier
         token: b
+        parameter: self::@extension::E::@method::clamp::@parameter::x
         staticElement: self::@function::f::@parameter::b
         staticType: int
       SimpleIdentifier
         token: c
+        parameter: self::@extension::E::@method::clamp::@parameter::y
         staticElement: self::@function::f::@parameter::c
         staticType: int
     rightParenthesis: )
@@ -3084,6 +3212,7 @@
       arguments
         SimpleIdentifier
           token: a
+          parameter: <null>
           staticElement: self::@function::f::@parameter::a
           staticType: A*
       rightParenthesis: )
@@ -3099,10 +3228,12 @@
     arguments
       SimpleIdentifier
         token: b
+        parameter: self::@extension::E::@method::clamp::@parameter::x
         staticElement: self::@function::f::@parameter::b
         staticType: int*
       SimpleIdentifier
         token: c
+        parameter: self::@extension::E::@method::clamp::@parameter::y
         staticElement: self::@function::f::@parameter::c
         staticType: int*
     rightParenthesis: )
@@ -3141,10 +3272,12 @@
     arguments
       SimpleIdentifier
         token: b
+        parameter: self::@extension::E::@method::clamp::@parameter::x
         staticElement: self::@function::f::@parameter::b
         staticType: int
       SimpleIdentifier
         token: c
+        parameter: self::@extension::E::@method::clamp::@parameter::y
         staticElement: self::@function::f::@parameter::c
         staticType: int
     rightParenthesis: )
@@ -3168,10 +3301,12 @@
     arguments
       SimpleIdentifier
         token: b
+        parameter: self::@extension::E::@method::clamp::@parameter::x
         staticElement: self::@function::f::@parameter::b
         staticType: int*
       SimpleIdentifier
         token: c
+        parameter: self::@extension::E::@method::clamp::@parameter::y
         staticElement: self::@function::f::@parameter::c
         staticType: int*
     rightParenthesis: )
@@ -3206,6 +3341,9 @@
     arguments
       SimpleIdentifier
         token: s
+        parameter: ParameterMember
+          base: root::@parameter::t
+          substitution: {T: S}
         staticElement: self::@function::f::@parameter::s
         staticType: S & int
     rightParenthesis: )
@@ -3226,6 +3364,9 @@
     arguments
       SimpleIdentifier
         token: s
+        parameter: ParameterMember
+          base: root::@parameter::t
+          substitution: {T: S*}
         staticElement: self::@function::f::@parameter::s
         staticType: S* & int*
     rightParenthesis: )
@@ -3269,6 +3410,7 @@
     arguments
       IntegerLiteral
         literal: 0
+        parameter: package:test/a.dart::@function::foo::@parameter::_
         staticType: int
     rightParenthesis: )
   staticInvokeType: void Function(int)
@@ -3286,6 +3428,7 @@
     arguments
       IntegerLiteral
         literal: 0
+        parameter: package:test/a.dart::@function::foo::@parameter::_
         staticType: int*
     rightParenthesis: )
   staticInvokeType: void Function(int*)*
@@ -3331,6 +3474,7 @@
     arguments
       IntegerLiteral
         literal: 0
+        parameter: package:test/a.dart::@function::foo::@parameter::_
         staticType: int
     rightParenthesis: )
   staticInvokeType: void Function(int)
@@ -3353,6 +3497,7 @@
     arguments
       IntegerLiteral
         literal: 0
+        parameter: package:test/a.dart::@function::foo::@parameter::_
         staticType: int*
     rightParenthesis: )
   staticInvokeType: void Function(int*)*
@@ -3392,6 +3537,7 @@
     arguments
       IntegerLiteral
         literal: 0
+        parameter: self::@class::A::@method::foo::@parameter::_
         staticType: int
     rightParenthesis: )
   staticInvokeType: void Function(int)
@@ -3414,6 +3560,7 @@
     arguments
       IntegerLiteral
         literal: 0
+        parameter: self::@class::A::@method::foo::@parameter::_
         staticType: int*
     rightParenthesis: )
   staticInvokeType: void Function(int*)*
@@ -3632,9 +3779,11 @@
     arguments
       IntegerLiteral
         literal: 1
+        parameter: <null>
         staticType: int
       IntegerLiteral
         literal: 2
+        parameter: <null>
         staticType: int
     rightParenthesis: )
   staticElement: <null>
@@ -3653,9 +3802,11 @@
     arguments
       IntegerLiteral
         literal: 1
+        parameter: <null>
         staticType: int*
       IntegerLiteral
         literal: 2
+        parameter: <null>
         staticType: int*
     rightParenthesis: )
   staticElement: <null>
@@ -3693,6 +3844,7 @@
     arguments
       IntegerLiteral
         literal: 0
+        parameter: root::@parameter::_
         staticType: int
     rightParenthesis: )
   staticElement: <null>
@@ -3713,6 +3865,7 @@
     arguments
       IntegerLiteral
         literal: 0
+        parameter: root::@parameter::_
         staticType: int*
     rightParenthesis: )
   staticElement: <null>
@@ -4138,6 +4291,7 @@
     arguments
       IntegerLiteral
         literal: 0
+        parameter: <null>
         staticType: int
     rightParenthesis: )
   staticInvokeType: dynamic
@@ -4155,6 +4309,7 @@
     arguments
       IntegerLiteral
         literal: 0
+        parameter: <null>
         staticType: int*
     rightParenthesis: )
   staticInvokeType: dynamic
@@ -4192,6 +4347,7 @@
     arguments
       IntegerLiteral
         literal: 0
+        parameter: <null>
         staticType: int
     rightParenthesis: )
   staticInvokeType: dynamic
@@ -4214,6 +4370,7 @@
     arguments
       IntegerLiteral
         literal: 0
+        parameter: <null>
         staticType: int*
     rightParenthesis: )
   staticInvokeType: dynamic
@@ -4249,6 +4406,7 @@
     arguments
       IntegerLiteral
         literal: 0
+        parameter: <null>
         staticType: int
     rightParenthesis: )
   staticInvokeType: dynamic
@@ -4271,6 +4429,7 @@
     arguments
       IntegerLiteral
         literal: 0
+        parameter: <null>
         staticType: int*
     rightParenthesis: )
   staticInvokeType: dynamic
@@ -4307,6 +4466,7 @@
     arguments
       IntegerLiteral
         literal: 0
+        parameter: <null>
         staticType: int
     rightParenthesis: )
   staticInvokeType: dynamic
@@ -4329,6 +4489,7 @@
     arguments
       IntegerLiteral
         literal: 0
+        parameter: <null>
         staticType: int*
     rightParenthesis: )
   staticInvokeType: dynamic
@@ -4367,6 +4528,7 @@
     arguments
       SimpleIdentifier
         token: x
+        parameter: <null>
         staticElement: self::@getter::x
         staticType: int
     rightParenthesis: )
@@ -4390,6 +4552,7 @@
     arguments
       SimpleIdentifier
         token: x
+        parameter: <null>
         staticElement: self::@getter::x
         staticType: int*
     rightParenthesis: )
@@ -4433,6 +4596,7 @@
     arguments
       IntegerLiteral
         literal: 0
+        parameter: <null>
         staticType: int
     rightParenthesis: )
   staticInvokeType: dynamic
@@ -4455,6 +4619,7 @@
     arguments
       IntegerLiteral
         literal: 0
+        parameter: <null>
         staticType: int*
     rightParenthesis: )
   staticInvokeType: dynamic
@@ -4613,6 +4778,7 @@
     arguments
       IntegerLiteral
         literal: 0
+        parameter: <null>
         staticType: int
     rightParenthesis: )
   staticInvokeType: dynamic
@@ -4634,6 +4800,7 @@
     arguments
       IntegerLiteral
         literal: 0
+        parameter: <null>
         staticType: int*
     rightParenthesis: )
   staticInvokeType: dynamic
@@ -4670,6 +4837,7 @@
     arguments
       IntegerLiteral
         literal: 0
+        parameter: <null>
         staticType: int
     rightParenthesis: )
   staticInvokeType: dynamic
@@ -4692,6 +4860,7 @@
     arguments
       IntegerLiteral
         literal: 0
+        parameter: <null>
         staticType: int*
     rightParenthesis: )
   staticInvokeType: dynamic
@@ -4724,6 +4893,7 @@
     arguments
       IntegerLiteral
         literal: 0
+        parameter: <null>
         staticType: int
     rightParenthesis: )
   staticInvokeType: dynamic
@@ -4741,6 +4911,7 @@
     arguments
       IntegerLiteral
         literal: 0
+        parameter: <null>
         staticType: int*
     rightParenthesis: )
   staticInvokeType: dynamic
@@ -4840,6 +5011,7 @@
     arguments
       IntegerLiteral
         literal: 0
+        parameter: <null>
         staticType: int
     rightParenthesis: )
   staticInvokeType: dynamic
@@ -4857,6 +5029,7 @@
     arguments
       IntegerLiteral
         literal: 0
+        parameter: <null>
         staticType: int*
     rightParenthesis: )
   staticInvokeType: dynamic
@@ -4922,6 +5095,7 @@
     arguments
       IntegerLiteral
         literal: 0
+        parameter: <null>
         staticType: int
     rightParenthesis: )
   staticInvokeType: dynamic
@@ -4943,6 +5117,7 @@
     arguments
       IntegerLiteral
         literal: 0
+        parameter: <null>
         staticType: int*
     rightParenthesis: )
   staticInvokeType: dynamic
@@ -4983,6 +5158,7 @@
     arguments
       IntegerLiteral
         literal: 0
+        parameter: <null>
         staticType: int
     rightParenthesis: )
   staticInvokeType: void Function()
@@ -5000,6 +5176,7 @@
     arguments
       IntegerLiteral
         literal: 0
+        parameter: <null>
         staticType: int*
     rightParenthesis: )
   staticInvokeType: void Function()*
@@ -5041,6 +5218,7 @@
     arguments
       IntegerLiteral
         literal: 1
+        parameter: <null>
         staticType: int
     rightParenthesis: )
   staticInvokeType: dynamic
@@ -5063,6 +5241,7 @@
     arguments
       IntegerLiteral
         literal: 1
+        parameter: <null>
         staticType: int*
     rightParenthesis: )
   staticInvokeType: dynamic
@@ -5099,6 +5278,7 @@
     arguments
       IntegerLiteral
         literal: 1
+        parameter: <null>
         staticType: int
     rightParenthesis: )
   staticInvokeType: dynamic
@@ -5116,6 +5296,7 @@
     arguments
       IntegerLiteral
         literal: 1
+        parameter: <null>
         staticType: int*
     rightParenthesis: )
   staticInvokeType: dynamic
@@ -5617,6 +5798,7 @@
     arguments
       IntegerLiteral
         literal: 0
+        parameter: root::@parameter::
         staticType: int
     rightParenthesis: )
   staticElement: <null>
@@ -5642,6 +5824,7 @@
     arguments
       IntegerLiteral
         literal: 0
+        parameter: root::@parameter::
         staticType: int*
     rightParenthesis: )
   staticElement: <null>
@@ -5680,6 +5863,7 @@
     arguments
       IntegerLiteral
         literal: 0
+        parameter: self::@class::C::@method::foo::@parameter::_
         staticType: int
     rightParenthesis: )
   staticInvokeType: void Function(int)
@@ -5702,6 +5886,7 @@
     arguments
       IntegerLiteral
         literal: 0
+        parameter: self::@class::C::@method::foo::@parameter::_
         staticType: int*
     rightParenthesis: )
   staticInvokeType: void Function(int*)*
@@ -5799,7 +5984,9 @@
         operator: +
         rightOperand: IntegerLiteral
           literal: 2
+          parameter: dart:core::@class::num::@method::+::@parameter::other
           staticType: int
+        parameter: <null>
         staticElement: dart:core::@class::num::@method::+
         staticInvokeType: num Function(num)
         staticType: int
@@ -5831,7 +6018,9 @@
         operator: +
         rightOperand: IntegerLiteral
           literal: 2
+          parameter: root::@parameter::other
           staticType: int*
+        parameter: <null>
         staticElement: MethodMember
           base: dart:core::@class::num::@method::+
           isLegacy: true
@@ -5869,9 +6058,11 @@
     arguments
       IntegerLiteral
         literal: 0
+        parameter: <null>
         staticType: int
       IntegerLiteral
         literal: 1
+        parameter: <null>
         staticType: int
     rightParenthesis: )
   staticInvokeType: dynamic
@@ -5894,9 +6085,11 @@
     arguments
       IntegerLiteral
         literal: 0
+        parameter: <null>
         staticType: int*
       IntegerLiteral
         literal: 1
+        parameter: <null>
         staticType: int*
     rightParenthesis: )
   staticInvokeType: dynamic
@@ -5932,6 +6125,7 @@
     arguments
       IntegerLiteral
         literal: 0
+        parameter: self::@function::foo::@parameter::_
         staticType: int
     rightParenthesis: )
   staticInvokeType: void Function(int)
@@ -5954,6 +6148,7 @@
     arguments
       IntegerLiteral
         literal: 0
+        parameter: self::@function::foo::@parameter::_
         staticType: int*
     rightParenthesis: )
   staticInvokeType: void Function(int*)*
@@ -5989,6 +6184,9 @@
     arguments
       IntegerLiteral
         literal: 0
+        parameter: ParameterMember
+          base: root::@parameter::_
+          substitution: {T: int}
         staticType: int
     rightParenthesis: )
   staticInvokeType: void Function(int)
@@ -6013,6 +6211,9 @@
     arguments
       IntegerLiteral
         literal: 0
+        parameter: ParameterMember
+          base: root::@parameter::_
+          substitution: {T: int*}
         staticType: int*
     rightParenthesis: )
   staticInvokeType: void Function(int*)*
@@ -6054,9 +6255,15 @@
     arguments
       IntegerLiteral
         literal: 1
+        parameter: ParameterMember
+          base: root::@parameter::a
+          substitution: {T: int}
         staticType: int
       IntegerLiteral
         literal: 2
+        parameter: ParameterMember
+          base: root::@parameter::b
+          substitution: {T: int}
         staticType: int
     rightParenthesis: )
   staticInvokeType: int Function(int, int)
@@ -6081,9 +6288,15 @@
     arguments
       IntegerLiteral
         literal: 1
+        parameter: ParameterMember
+          base: root::@parameter::a
+          substitution: {T: int*}
         staticType: int*
       IntegerLiteral
         literal: 2
+        parameter: ParameterMember
+          base: root::@parameter::b
+          substitution: {T: int*}
         staticType: int*
     rightParenthesis: )
   staticInvokeType: int* Function(int*, int*)*
@@ -6128,9 +6341,15 @@
     arguments
       IntegerLiteral
         literal: 1
+        parameter: ParameterMember
+          base: root::@parameter::a
+          substitution: {T: int}
         staticType: int
       IntegerLiteral
         literal: 2
+        parameter: ParameterMember
+          base: root::@parameter::b
+          substitution: {T: int}
         staticType: int
     rightParenthesis: )
   staticElement: <null>
@@ -6159,9 +6378,15 @@
     arguments
       IntegerLiteral
         literal: 1
+        parameter: ParameterMember
+          base: root::@parameter::a
+          substitution: {T: int*}
         staticType: int*
       IntegerLiteral
         literal: 2
+        parameter: ParameterMember
+          base: root::@parameter::b
+          substitution: {T: int*}
         staticType: int*
     rightParenthesis: )
   staticElement: <null>
@@ -6200,6 +6425,7 @@
     arguments
       IntegerLiteral
         literal: 0
+        parameter: <null>
         staticType: int
     rightParenthesis: )
   staticInvokeType: dynamic
@@ -6222,6 +6448,7 @@
     arguments
       IntegerLiteral
         literal: 0
+        parameter: <null>
         staticType: int*
     rightParenthesis: )
   staticInvokeType: dynamic
@@ -6257,6 +6484,7 @@
     arguments
       IntegerLiteral
         literal: 0
+        parameter: <null>
         staticType: int
     rightParenthesis: )
   staticInvokeType: dynamic
@@ -6279,6 +6507,7 @@
     arguments
       IntegerLiteral
         literal: 0
+        parameter: <null>
         staticType: int*
     rightParenthesis: )
   staticInvokeType: dynamic
@@ -6318,6 +6547,7 @@
     arguments
       IntegerLiteral
         literal: 0
+        parameter: root::@parameter::
         staticType: int
     rightParenthesis: )
   staticElement: <null>
@@ -6343,6 +6573,7 @@
     arguments
       IntegerLiteral
         literal: 0
+        parameter: root::@parameter::
         staticType: int*
     rightParenthesis: )
   staticElement: <null>
@@ -6383,6 +6614,7 @@
     arguments
       IntegerLiteral
         literal: 0
+        parameter: root::@parameter::
         staticType: int
     rightParenthesis: )
   staticElement: <null>
@@ -6401,6 +6633,7 @@
     arguments
       IntegerLiteral
         literal: 0
+        parameter: root::@parameter::
         staticType: int*
     rightParenthesis: )
   staticElement: <null>
@@ -6499,6 +6732,7 @@
     arguments
       IntegerLiteral
         literal: 0
+        parameter: self::@class::C::@method::foo::@parameter::_
         staticType: int
     rightParenthesis: )
   staticInvokeType: void Function(int)
@@ -6521,6 +6755,7 @@
     arguments
       IntegerLiteral
         literal: 0
+        parameter: self::@class::C::@method::foo::@parameter::_
         staticType: int*
     rightParenthesis: )
   staticInvokeType: void Function(int*)*
@@ -6560,6 +6795,9 @@
     arguments
       IntegerLiteral
         literal: 0
+        parameter: ParameterMember
+          base: root::@parameter::a
+          substitution: {T: int}
         staticType: int
     rightParenthesis: )
   staticInvokeType: int Function(int)
@@ -6584,6 +6822,9 @@
     arguments
       IntegerLiteral
         literal: 0
+        parameter: ParameterMember
+          base: root::@parameter::a
+          substitution: {T: int*}
         staticType: int*
     rightParenthesis: )
   staticInvokeType: int* Function(int*)*
@@ -6695,6 +6936,7 @@
     arguments
       IntegerLiteral
         literal: 0
+        parameter: self::@class::A::@method::foo::@parameter::_
         staticType: int
     rightParenthesis: )
   staticInvokeType: void Function(int)
@@ -6717,6 +6959,7 @@
     arguments
       IntegerLiteral
         literal: 0
+        parameter: self::@class::A::@method::foo::@parameter::_
         staticType: int*
     rightParenthesis: )
   staticInvokeType: void Function(int*)*
@@ -6768,6 +7011,7 @@
     arguments
       IntegerLiteral
         literal: 0
+        parameter: root::@parameter::
         staticType: int
     rightParenthesis: )
   staticElement: <null>
@@ -6801,6 +7045,7 @@
     arguments
       IntegerLiteral
         literal: 0
+        parameter: root::@parameter::
         staticType: int*
     rightParenthesis: )
   staticElement: <null>
@@ -6851,6 +7096,7 @@
     arguments
       IntegerLiteral
         literal: 0
+        parameter: package:test/a.dart::@class::C::@method::foo::@parameter::_
         staticType: int
     rightParenthesis: )
   staticInvokeType: void Function(int)
@@ -6881,6 +7127,7 @@
     arguments
       IntegerLiteral
         literal: 0
+        parameter: package:test/a.dart::@class::C::@method::foo::@parameter::_
         staticType: int*
     rightParenthesis: )
   staticInvokeType: void Function(int*)*
@@ -6921,6 +7168,7 @@
     arguments
       IntegerLiteral
         literal: 0
+        parameter: root::@parameter::
         staticType: int
     rightParenthesis: )
   staticElement: <null>
@@ -6945,6 +7193,7 @@
     arguments
       IntegerLiteral
         literal: 0
+        parameter: root::@parameter::
         staticType: int*
     rightParenthesis: )
   staticElement: <null>
@@ -6984,6 +7233,7 @@
     arguments
       IntegerLiteral
         literal: 0
+        parameter: self::@class::A::@method::foo::@parameter::_
         staticType: int
     rightParenthesis: )
   staticInvokeType: void Function(int)
@@ -7005,6 +7255,7 @@
     arguments
       IntegerLiteral
         literal: 0
+        parameter: self::@class::A::@method::foo::@parameter::_
         staticType: int*
     rightParenthesis: )
   staticInvokeType: void Function(int*)*
@@ -7133,6 +7384,7 @@
           colon: :
         expression: BooleanLiteral
           literal: false
+          parameter: <null>
           staticType: bool
       NamedExpression
         name: Label
@@ -7143,6 +7395,7 @@
           colon: :
         expression: IntegerLiteral
           literal: 0
+          parameter: <null>
           staticType: int
     rightParenthesis: )
   staticInvokeType: void Function({int? a, bool? b})
@@ -7167,6 +7420,7 @@
           colon: :
         expression: BooleanLiteral
           literal: false
+          parameter: <null>
           staticType: bool*
       NamedExpression
         name: Label
@@ -7177,6 +7431,7 @@
           colon: :
         expression: IntegerLiteral
           literal: 0
+          parameter: <null>
           staticType: int*
     rightParenthesis: )
   staticInvokeType: void Function({int* a, bool* b})*
@@ -7211,6 +7466,7 @@
     arguments
       IntegerLiteral
         literal: 0
+        parameter: root::@parameter::
         staticType: int
     rightParenthesis: )
   staticElement: <null>
@@ -7229,6 +7485,7 @@
     arguments
       IntegerLiteral
         literal: 0
+        parameter: root::@parameter::
         staticType: int*
     rightParenthesis: )
   staticElement: <null>
@@ -7262,6 +7519,7 @@
     arguments
       IntegerLiteral
         literal: 0
+        parameter: root::@parameter::
         staticType: int
     rightParenthesis: )
   staticElement: <null>
@@ -7280,6 +7538,7 @@
     arguments
       IntegerLiteral
         literal: 0
+        parameter: root::@parameter::
         staticType: int*
     rightParenthesis: )
   staticElement: <null>
@@ -7352,6 +7611,7 @@
     arguments
       IntegerLiteral
         literal: 0
+        parameter: foo@16::@parameter::_
         staticType: int
     rightParenthesis: )
   staticInvokeType: void Function(int)
@@ -7369,6 +7629,7 @@
     arguments
       IntegerLiteral
         literal: 0
+        parameter: foo@16::@parameter::_
         staticType: int*
     rightParenthesis: )
   staticInvokeType: void Function(int*)*
@@ -7401,6 +7662,7 @@
     arguments
       IntegerLiteral
         literal: 0
+        parameter: self::@class::C::@method::call::@parameter::_
         staticType: int
     rightParenthesis: )
   staticElement: self::@class::C::@method::call
@@ -7419,6 +7681,7 @@
     arguments
       IntegerLiteral
         literal: 0
+        parameter: self::@class::C::@method::call::@parameter::_
         staticType: int*
     rightParenthesis: )
   staticElement: self::@class::C::@method::call
@@ -7451,6 +7714,7 @@
     arguments
       IntegerLiteral
         literal: 0
+        parameter: @-1
         staticType: int
     rightParenthesis: )
   staticElement: <null>
@@ -7469,6 +7733,7 @@
     arguments
       IntegerLiteral
         literal: 0
+        parameter: @-1
         staticType: int*
     rightParenthesis: )
   staticElement: <null>
@@ -7504,6 +7769,7 @@
     arguments
       IntegerLiteral
         literal: 0
+        parameter: self::@class::A::@method::foo::@parameter::_
         staticType: int
     rightParenthesis: )
   staticInvokeType: void Function(int)
@@ -7521,6 +7787,7 @@
     arguments
       IntegerLiteral
         literal: 0
+        parameter: self::@class::A::@method::foo::@parameter::_
         staticType: int*
     rightParenthesis: )
   staticInvokeType: void Function(int*)*
@@ -7553,6 +7820,7 @@
     arguments
       IntegerLiteral
         literal: 0
+        parameter: self::@class::C::@method::foo::@parameter::_
         staticType: int
     rightParenthesis: )
   staticInvokeType: void Function(int)
@@ -7570,6 +7838,7 @@
     arguments
       IntegerLiteral
         literal: 0
+        parameter: self::@class::C::@method::foo::@parameter::_
         staticType: int*
     rightParenthesis: )
   staticInvokeType: void Function(int*)*
@@ -7598,6 +7867,7 @@
     arguments
       IntegerLiteral
         literal: 0
+        parameter: root::@parameter::
         staticType: int
     rightParenthesis: )
   staticElement: <null>
@@ -7616,6 +7886,7 @@
     arguments
       IntegerLiteral
         literal: 0
+        parameter: root::@parameter::
         staticType: int*
     rightParenthesis: )
   staticElement: <null>
@@ -7653,6 +7924,7 @@
     arguments
       IntegerLiteral
         literal: 1
+        parameter: root::@parameter::
         staticType: int
     rightParenthesis: )
   staticInvokeType: double Function(int)
@@ -7675,6 +7947,7 @@
     arguments
       IntegerLiteral
         literal: 1
+        parameter: root::@parameter::
         staticType: int*
     rightParenthesis: )
   staticInvokeType: double* Function(int*)*
@@ -7750,6 +8023,7 @@
     arguments
       IntegerLiteral
         literal: 0
+        parameter: self::@function::foo::@parameter::_
         staticType: int
     rightParenthesis: )
   staticInvokeType: void Function(int)
@@ -7767,6 +8041,7 @@
     arguments
       IntegerLiteral
         literal: 0
+        parameter: self::@function::foo::@parameter::_
         staticType: int*
     rightParenthesis: )
   staticInvokeType: void Function(int*)*
@@ -7797,6 +8072,7 @@
     arguments
       IntegerLiteral
         literal: 0
+        parameter: root::@parameter::
         staticType: int
     rightParenthesis: )
   staticElement: <null>
@@ -7815,6 +8091,7 @@
     arguments
       IntegerLiteral
         literal: 0
+        parameter: root::@parameter::
         staticType: int*
     rightParenthesis: )
   staticElement: <null>
@@ -7846,6 +8123,7 @@
     arguments
       IntegerLiteral
         literal: 0
+        parameter: root::@parameter::
         staticType: int
     rightParenthesis: )
   staticElement: <null>
@@ -7864,6 +8142,7 @@
     arguments
       IntegerLiteral
         literal: 0
+        parameter: root::@parameter::
         staticType: int*
     rightParenthesis: )
   staticElement: <null>
@@ -7898,6 +8177,7 @@
     arguments
       SimpleIdentifier
         token: b
+        parameter: <null>
         staticElement: self::@function::f::@parameter::b
         staticType: int
     rightParenthesis: )
@@ -7921,6 +8201,7 @@
     arguments
       SimpleIdentifier
         token: b
+        parameter: <null>
         staticElement: self::@function::f::@parameter::b
         staticType: int*
     rightParenthesis: )
@@ -8050,6 +8331,7 @@
   argumentList: ArgumentList
     leftParenthesis: (
     rightParenthesis: )
+  parameter: dart:core::@class::num::@method::remainder::@parameter::other
   staticInvokeType: num Function()
   staticType: num
   typeArgumentTypes
@@ -8065,6 +8347,7 @@
   argumentList: ArgumentList
     leftParenthesis: (
     rightParenthesis: )
+  parameter: root::@parameter::other
   staticInvokeType: num* Function()*
   staticType: num*
   typeArgumentTypes
@@ -8093,6 +8376,7 @@
   argumentList: ArgumentList
     leftParenthesis: (
     rightParenthesis: )
+  parameter: dart:core::@class::num::@method::remainder::@parameter::other
   staticInvokeType: int Function()
   staticType: int
   typeArgumentTypes
@@ -8108,6 +8392,7 @@
   argumentList: ArgumentList
     leftParenthesis: (
     rightParenthesis: )
+  parameter: root::@parameter::other
   staticInvokeType: num* Function()*
   staticType: num*
   typeArgumentTypes
@@ -8136,6 +8421,7 @@
   argumentList: ArgumentList
     leftParenthesis: (
     rightParenthesis: )
+  parameter: dart:core::@class::num::@method::remainder::@parameter::other
   staticInvokeType: int Function()
   staticType: int
   typeArgumentTypes
@@ -8151,6 +8437,7 @@
   argumentList: ArgumentList
     leftParenthesis: (
     rightParenthesis: )
+  parameter: root::@parameter::other
   staticInvokeType: num* Function()*
   staticType: num*
   typeArgumentTypes
@@ -8184,6 +8471,7 @@
   argumentList: ArgumentList
     leftParenthesis: (
     rightParenthesis: )
+  parameter: self::@extension::E::@method::remainder::@parameter::x
   staticInvokeType: num Function()
   staticType: num
   typeArgumentTypes
@@ -8199,6 +8487,7 @@
   argumentList: ArgumentList
     leftParenthesis: (
     rightParenthesis: )
+  parameter: self::@extension::E::@method::remainder::@parameter::x
   staticInvokeType: num* Function()*
   staticType: num*
   typeArgumentTypes
@@ -8226,6 +8515,7 @@
   argumentList: ArgumentList
     leftParenthesis: (
     rightParenthesis: )
+  parameter: dart:core::@class::num::@method::remainder::@parameter::other
   staticInvokeType: num Function()
   staticType: num
   typeArgumentTypes
@@ -8241,6 +8531,7 @@
   argumentList: ArgumentList
     leftParenthesis: (
     rightParenthesis: )
+  parameter: root::@parameter::other
   staticInvokeType: num* Function()*
   staticType: num*
   typeArgumentTypes
@@ -8274,6 +8565,7 @@
     arguments
       SimpleIdentifier
         token: b
+        parameter: dart:core::@class::num::@method::remainder::@parameter::other
         staticElement: self::@function::f::@parameter::b
         staticType: double
     rightParenthesis: )
@@ -8299,6 +8591,7 @@
     arguments
       SimpleIdentifier
         token: b
+        parameter: root::@parameter::other
         staticElement: self::@function::f::@parameter::b
         staticType: double*
     rightParenthesis: )
@@ -8333,6 +8626,7 @@
     arguments
       SimpleIdentifier
         token: b
+        parameter: dart:core::@class::num::@method::remainder::@parameter::other
         staticElement: self::@function::f::@parameter::b
         staticType: int
     rightParenthesis: )
@@ -8358,6 +8652,7 @@
     arguments
       SimpleIdentifier
         token: b
+        parameter: root::@parameter::other
         staticElement: self::@function::f::@parameter::b
         staticType: int*
     rightParenthesis: )
@@ -8399,6 +8694,7 @@
     arguments
       SimpleIdentifier
         token: b
+        parameter: dart:core::@class::num::@method::remainder::@parameter::other
         staticElement: self::@function::f::@parameter::b
         staticType: int
     rightParenthesis: )
@@ -8431,6 +8727,7 @@
     arguments
       SimpleIdentifier
         token: b
+        parameter: root::@parameter::other
         staticElement: self::@function::f::@parameter::b
         staticType: int*
     rightParenthesis: )
@@ -8466,6 +8763,7 @@
   argumentList: ArgumentList
     leftParenthesis: (
     rightParenthesis: )
+  parameter: self::@extension::E::@method::remainder::@parameter::x
   staticInvokeType: num Function()
   staticType: num
   typeArgumentTypes
@@ -8481,6 +8779,7 @@
   argumentList: ArgumentList
     leftParenthesis: (
     rightParenthesis: )
+  parameter: self::@extension::E::@method::remainder::@parameter::x
   staticInvokeType: num* Function()*
   staticType: num*
   typeArgumentTypes
@@ -8515,6 +8814,7 @@
   argumentList: ArgumentList
     leftParenthesis: (
     rightParenthesis: )
+  parameter: self::@extension::E::@method::remainder::@parameter::x
   staticInvokeType: num Function()
   staticType: num
   typeArgumentTypes
@@ -8530,6 +8830,7 @@
   argumentList: ArgumentList
     leftParenthesis: (
     rightParenthesis: )
+  parameter: self::@extension::E::@method::remainder::@parameter::x
   staticInvokeType: num* Function()*
   staticType: num*
   typeArgumentTypes
@@ -8569,7 +8870,9 @@
         operator: +
         rightOperand: IntegerLiteral
           literal: 2
+          parameter: dart:core::@class::num::@method::+::@parameter::other
           staticType: int
+        parameter: <null>
         staticElement: dart:core::@class::num::@method::+
         staticInvokeType: num Function(num)
         staticType: int
@@ -8580,6 +8883,7 @@
             literal: 0
             staticType: int
         rightBracket: ]
+        parameter: <null>
         staticType: List<int>
     rightParenthesis: )
   staticInvokeType: dynamic
@@ -8602,7 +8906,9 @@
         operator: +
         rightOperand: IntegerLiteral
           literal: 2
+          parameter: root::@parameter::other
           staticType: int*
+        parameter: <null>
         staticElement: MethodMember
           base: dart:core::@class::num::@method::+
           isLegacy: true
@@ -8615,6 +8921,7 @@
             literal: 0
             staticType: int*
         rightBracket: ]
+        parameter: <null>
         staticType: List<int*>*
     rightParenthesis: )
   staticInvokeType: dynamic
@@ -8650,6 +8957,9 @@
     arguments
       IntegerLiteral
         literal: 0
+        parameter: ParameterMember
+          base: root::@parameter::a
+          substitution: {T: int, U: bool}
         staticType: int
     rightParenthesis: )
   staticInvokeType: bool Function(int)
@@ -8670,6 +8980,9 @@
     arguments
       IntegerLiteral
         literal: 0
+        parameter: ParameterMember
+          base: root::@parameter::a
+          substitution: {T: int*, U: bool*}
         staticType: int*
     rightParenthesis: )
   staticInvokeType: bool* Function(int*)*
@@ -8888,6 +9201,7 @@
     arguments
       IntegerLiteral
         literal: 0
+        parameter: self::@function::foo::@parameter::a
         staticType: int
     rightParenthesis: )
   staticInvokeType: void Function(int)
@@ -8905,6 +9219,7 @@
     arguments
       IntegerLiteral
         literal: 0
+        parameter: self::@function::foo::@parameter::a
         staticType: int*
     rightParenthesis: )
   staticInvokeType: void Function(int*)*
diff --git a/pkg/analyzer/test/src/dart/resolution/mixin_test.dart b/pkg/analyzer/test/src/dart/resolution/mixin_test.dart
index d74ef96..0820f8c 100644
--- a/pkg/analyzer/test/src/dart/resolution/mixin_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/mixin_test.dart
@@ -430,6 +430,7 @@
   operator: =
   rightHandSide: IntegerLiteral
     literal: 0
+    parameter: self::@class::A::@setter::foo::@parameter::_
     staticType: int
   readElement: <null>
   readType: null
diff --git a/pkg/analyzer/test/src/dart/resolution/postfix_expression_test.dart b/pkg/analyzer/test/src/dart/resolution/postfix_expression_test.dart
index b5bc19b..4a8fd19 100644
--- a/pkg/analyzer/test/src/dart/resolution/postfix_expression_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/postfix_expression_test.dart
@@ -189,6 +189,9 @@
       arguments
         NullLiteral
           literal: null
+          parameter: ParameterMember
+            base: root::@parameter::t
+            substitution: {T: int?}
           staticType: Null
       rightParenthesis: )
     staticInvokeType: int? Function(int?)
@@ -411,6 +414,7 @@
     leftBracket: [
     index: IntegerLiteral
       literal: 0
+      parameter: self::@class::A::@method::[]=::@parameter::index
       staticType: int
     rightBracket: ]
     staticElement: <null>
@@ -434,6 +438,7 @@
     leftBracket: [
     index: IntegerLiteral
       literal: 0
+      parameter: self::@class::A::@method::[]=::@parameter::index
       staticType: int*
     rightBracket: ]
     staticElement: <null>
@@ -476,6 +481,7 @@
     leftBracket: [
     index: IntegerLiteral
       literal: 0
+      parameter: self::@class::A::@method::[]=::@parameter::index
       staticType: int
     rightBracket: ]
     staticElement: <null>
@@ -498,6 +504,7 @@
     leftBracket: [
     index: IntegerLiteral
       literal: 0
+      parameter: self::@class::A::@method::[]=::@parameter::index
       staticType: int*
     rightBracket: ]
     staticElement: <null>
@@ -538,6 +545,7 @@
     leftBracket: [
     index: IntegerLiteral
       literal: 0
+      parameter: self::@class::A::@method::[]=::@parameter::index
       staticType: int
     rightBracket: ]
     staticElement: <null>
@@ -560,6 +568,7 @@
     leftBracket: [
     index: IntegerLiteral
       literal: 0
+      parameter: self::@class::A::@method::[]=::@parameter::index
       staticType: int*
     rightBracket: ]
     staticElement: <null>
diff --git a/pkg/analyzer/test/src/dart/resolution/prefix_expression_test.dart b/pkg/analyzer/test/src/dart/resolution/prefix_expression_test.dart
index d196a4a..dd07c0b 100644
--- a/pkg/analyzer/test/src/dart/resolution/prefix_expression_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/prefix_expression_test.dart
@@ -320,6 +320,7 @@
     leftBracket: [
     index: IntegerLiteral
       literal: 0
+      parameter: self::@class::A::@method::[]=::@parameter::index
       staticType: int
     rightBracket: ]
     staticElement: <null>
@@ -343,6 +344,7 @@
     leftBracket: [
     index: IntegerLiteral
       literal: 0
+      parameter: self::@class::A::@method::[]=::@parameter::index
       staticType: int*
     rightBracket: ]
     staticElement: <null>
@@ -385,6 +387,7 @@
     leftBracket: [
     index: IntegerLiteral
       literal: 0
+      parameter: self::@class::A::@method::[]=::@parameter::index
       staticType: int
     rightBracket: ]
     staticElement: <null>
@@ -407,6 +410,7 @@
     leftBracket: [
     index: IntegerLiteral
       literal: 0
+      parameter: self::@class::A::@method::[]=::@parameter::index
       staticType: int*
     rightBracket: ]
     staticElement: <null>
@@ -447,6 +451,7 @@
     leftBracket: [
     index: IntegerLiteral
       literal: 0
+      parameter: self::@class::A::@method::[]=::@parameter::index
       staticType: int
     rightBracket: ]
     staticElement: <null>
@@ -469,6 +474,7 @@
     leftBracket: [
     index: IntegerLiteral
       literal: 0
+      parameter: self::@class::A::@method::[]=::@parameter::index
       staticType: int*
     rightBracket: ]
     staticElement: <null>
@@ -552,6 +558,7 @@
       arguments
         SimpleIdentifier
           token: c
+          parameter: <null>
           staticElement: self::@function::f::@parameter::c
           staticType: C
       rightParenthesis: )
@@ -578,6 +585,7 @@
       arguments
         SimpleIdentifier
           token: c
+          parameter: <null>
           staticElement: self::@function::f::@parameter::c
           staticType: C*
       rightParenthesis: )
diff --git a/pkg/analyzer/test/src/dart/resolution/prefixed_identifier_test.dart b/pkg/analyzer/test/src/dart/resolution/prefixed_identifier_test.dart
index 1fd8874..828f515 100644
--- a/pkg/analyzer/test/src/dart/resolution/prefixed_identifier_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/prefixed_identifier_test.dart
@@ -107,6 +107,7 @@
   operator: =
   rightHandSide: IntegerLiteral
     literal: 1
+    parameter: self::@enum::E::@setter::foo::@parameter::_
     staticType: int
   readElement: <null>
   readType: null
@@ -363,6 +364,7 @@
   operator: +=
   rightHandSide: IntegerLiteral
     literal: 1
+    parameter: dart:core::@class::num::@method::+::@parameter::other
     staticType: int
   readElement: self::@class::A::@getter::foo
   readType: int
@@ -389,6 +391,9 @@
   operator: +=
   rightHandSide: IntegerLiteral
     literal: 1
+    parameter: ParameterMember
+      base: dart:core::@class::num::@method::+::@parameter::other
+      isLegacy: true
     staticType: int*
   readElement: self::@class::A::@getter::foo
   readType: int*
@@ -432,6 +437,7 @@
   operator: =
   rightHandSide: IntegerLiteral
     literal: 1
+    parameter: self::@class::A::@setter::foo::@parameter::_foo
     staticType: int
   readElement: <null>
   readType: null
@@ -458,6 +464,7 @@
   operator: =
   rightHandSide: IntegerLiteral
     literal: 1
+    parameter: self::@class::A::@setter::foo::@parameter::_foo
     staticType: int*
   readElement: <null>
   readType: null
diff --git a/pkg/analyzer/test/src/dart/resolution/property_access_test.dart b/pkg/analyzer/test/src/dart/resolution/property_access_test.dart
index ed2065a..9daf0fe 100644
--- a/pkg/analyzer/test/src/dart/resolution/property_access_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/property_access_test.dart
@@ -259,6 +259,7 @@
   operator: =
   rightHandSide: IntegerLiteral
     literal: 1
+    parameter: self::@enum::E::@setter::foo::@parameter::_
     staticType: int
   readElement: <null>
   readType: null
@@ -327,6 +328,7 @@
         arguments
           SimpleIdentifier
             token: a
+            parameter: <null>
             staticElement: self::@function::f::@parameter::a
             staticType: A
         rightParenthesis: )
@@ -341,6 +343,7 @@
   operator: +=
   rightHandSide: IntegerLiteral
     literal: 1
+    parameter: dart:core::@class::num::@method::+::@parameter::other
     staticType: int
   readElement: self::@extension::E::@getter::foo
   readType: int
@@ -363,6 +366,7 @@
         arguments
           SimpleIdentifier
             token: a
+            parameter: <null>
             staticElement: self::@function::f::@parameter::a
             staticType: A*
         rightParenthesis: )
@@ -377,6 +381,9 @@
   operator: +=
   rightHandSide: IntegerLiteral
     literal: 1
+    parameter: ParameterMember
+      base: dart:core::@class::num::@method::+::@parameter::other
+      isLegacy: true
     staticType: int*
   readElement: self::@extension::E::@getter::foo
   readType: int*
@@ -418,6 +425,7 @@
         arguments
           SimpleIdentifier
             token: a
+            parameter: <null>
             staticElement: self::@function::f::@parameter::a
             staticType: A
         rightParenthesis: )
@@ -432,6 +440,7 @@
   operator: =
   rightHandSide: IntegerLiteral
     literal: 1
+    parameter: self::@extension::E::@setter::foo::@parameter::_
     staticType: int
   readElement: <null>
   readType: null
@@ -454,6 +463,7 @@
         arguments
           SimpleIdentifier
             token: a
+            parameter: <null>
             staticElement: self::@function::f::@parameter::a
             staticType: A*
         rightParenthesis: )
@@ -468,6 +478,7 @@
   operator: =
   rightHandSide: IntegerLiteral
     literal: 1
+    parameter: self::@extension::E::@setter::foo::@parameter::_
     staticType: int*
   readElement: <null>
   readType: null
@@ -556,6 +567,7 @@
   operator: +=
   rightHandSide: IntegerLiteral
     literal: 1
+    parameter: dart:core::@class::num::@method::+::@parameter::other
     staticType: int
   readElement: self::@class::A::@getter::foo
   readType: int
@@ -590,6 +602,9 @@
   operator: +=
   rightHandSide: IntegerLiteral
     literal: 1
+    parameter: ParameterMember
+      base: dart:core::@class::num::@method::+::@parameter::other
+      isLegacy: true
     staticType: int*
   readElement: self::@class::A::@getter::foo
   readType: int*
@@ -641,6 +656,7 @@
   operator: =
   rightHandSide: IntegerLiteral
     literal: 1
+    parameter: self::@class::A::@setter::foo::@parameter::_foo
     staticType: int
   readElement: <null>
   readType: null
@@ -675,6 +691,7 @@
   operator: =
   rightHandSide: IntegerLiteral
     literal: 1
+    parameter: self::@class::A::@setter::foo::@parameter::_foo
     staticType: int*
   readElement: <null>
   readType: null
@@ -889,6 +906,7 @@
   operator: +=
   rightHandSide: IntegerLiteral
     literal: 1
+    parameter: dart:core::@class::num::@method::+::@parameter::other
     staticType: int
   readElement: self::@extension::E::@getter::foo
   readType: int
@@ -923,6 +941,9 @@
   operator: +=
   rightHandSide: IntegerLiteral
     literal: 1
+    parameter: ParameterMember
+      base: dart:core::@class::num::@method::+::@parameter::other
+      isLegacy: true
     staticType: int*
   readElement: self::@extension::E::@getter::foo
   readType: int*
@@ -976,6 +997,7 @@
   operator: =
   rightHandSide: IntegerLiteral
     literal: 1
+    parameter: self::@extension::E::@setter::foo::@parameter::_
     staticType: int
   readElement: <null>
   readType: null
@@ -1010,6 +1032,7 @@
   operator: =
   rightHandSide: IntegerLiteral
     literal: 1
+    parameter: self::@extension::E::@setter::foo::@parameter::_
     staticType: int*
   readElement: <null>
   readType: null
@@ -1082,6 +1105,7 @@
   operator: +=
   rightHandSide: IntegerLiteral
     literal: 1
+    parameter: dart:core::@class::num::@method::+::@parameter::other
     staticType: int
   readElement: self::@class::A::@getter::foo
   readType: int
@@ -1106,6 +1130,9 @@
   operator: +=
   rightHandSide: IntegerLiteral
     literal: 1
+    parameter: ParameterMember
+      base: dart:core::@class::num::@method::+::@parameter::other
+      isLegacy: true
     staticType: int*
   readElement: self::@class::A::@getter::foo
   readType: int*
@@ -1154,6 +1181,7 @@
   operator: =
   rightHandSide: IntegerLiteral
     literal: 1
+    parameter: self::@class::A::@setter::foo::@parameter::_foo
     staticType: int
   readElement: <null>
   readType: null
@@ -1178,6 +1206,7 @@
   operator: =
   rightHandSide: IntegerLiteral
     literal: 1
+    parameter: self::@class::A::@setter::foo::@parameter::_foo
     staticType: int*
   readElement: <null>
   readType: null
diff --git a/pkg/analyzer/test/src/dart/resolution/type_inference/extension_methods_test.dart b/pkg/analyzer/test/src/dart/resolution/type_inference/extension_methods_test.dart
index 579a3d4..a79316f 100644
--- a/pkg/analyzer/test/src/dart/resolution/type_inference/extension_methods_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/type_inference/extension_methods_test.dart
@@ -199,6 +199,9 @@
   operator: =
   rightHandSide: IntegerLiteral
     literal: 0
+    parameter: ParameterMember
+      base: self::@extension::E::@setter::foo::@parameter::value
+      substitution: {T: int}
     staticType: int
   readElement: <null>
   readType: null
@@ -227,6 +230,9 @@
   operator: =
   rightHandSide: IntegerLiteral
     literal: 0
+    parameter: ParameterMember
+      base: self::@extension::E::@setter::foo::@parameter::value
+      substitution: {T: int*}
     staticType: int*
   readElement: <null>
   readType: null
@@ -368,6 +374,9 @@
     argumentList: ArgumentList
       leftParenthesis: (
       rightParenthesis: )
+    parameter: ParameterMember
+      base: self::@extension::Test::@setter::test::@parameter::_
+      substitution: {T: S}
     staticInvokeType: S Function()
     staticType: S
     typeArgumentTypes
@@ -408,6 +417,9 @@
     argumentList: ArgumentList
       leftParenthesis: (
       rightParenthesis: )
+    parameter: ParameterMember
+      base: self::@extension::Test::@setter::test::@parameter::_
+      substitution: {T: num*}
     staticInvokeType: num* Function()*
     staticType: num*
     typeArgumentTypes
@@ -586,6 +598,7 @@
         arguments
           SimpleIdentifier
             token: a
+            parameter: <null>
             staticElement: self::@function::f::@parameter::a
             staticType: A<int>
         rightParenthesis: )
@@ -602,6 +615,9 @@
   operator: =
   rightHandSide: DoubleLiteral
     literal: 1.2
+    parameter: ParameterMember
+      base: self::@extension::E::@setter::foo::@parameter::value
+      substitution: {T: num}
     staticType: double
   readElement: <null>
   readType: null
@@ -636,6 +652,7 @@
         arguments
           SimpleIdentifier
             token: a
+            parameter: <null>
             staticElement: self::@function::f::@parameter::a
             staticType: A<int*>*
         rightParenthesis: )
@@ -652,6 +669,9 @@
   operator: =
   rightHandSide: DoubleLiteral
     literal: 1.2
+    parameter: ParameterMember
+      base: self::@extension::E::@setter::foo::@parameter::value
+      substitution: {T: num*}
     staticType: double*
   readElement: <null>
   readType: null
@@ -793,6 +813,7 @@
         arguments
           SimpleIdentifier
             token: a
+            parameter: <null>
             staticElement: self::@function::f::@parameter::a
             staticType: A<int>
         rightParenthesis: )
@@ -809,6 +830,9 @@
   operator: =
   rightHandSide: IntegerLiteral
     literal: 0
+    parameter: ParameterMember
+      base: self::@extension::E::@setter::foo::@parameter::value
+      substitution: {T: int}
     staticType: int
   readElement: <null>
   readType: null
@@ -833,6 +857,7 @@
         arguments
           SimpleIdentifier
             token: a
+            parameter: <null>
             staticElement: self::@function::f::@parameter::a
             staticType: A<int*>*
         rightParenthesis: )
@@ -849,6 +874,9 @@
   operator: =
   rightHandSide: IntegerLiteral
     literal: 0
+    parameter: ParameterMember
+      base: self::@extension::E::@setter::foo::@parameter::value
+      substitution: {T: int*}
     staticType: int*
   readElement: <null>
   readType: null
diff --git a/pkg/analyzer/test/src/dart/resolution/type_inference/list_literal_test.dart b/pkg/analyzer/test/src/dart/resolution/type_inference/list_literal_test.dart
index fd9aae8..a56ac84 100644
--- a/pkg/analyzer/test/src/dart/resolution/type_inference/list_literal_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/type_inference/list_literal_test.dart
@@ -38,6 +38,9 @@
     arguments
       NullLiteral
         literal: null
+        parameter: ParameterMember
+          base: root::@parameter::t
+          substitution: {T: Iterable<int>?}
         staticType: Null
     rightParenthesis: )
   staticInvokeType: Iterable<int>? Function(Iterable<int>?)
diff --git a/pkg/analyzer/test/src/dart/resolution/type_inference/map_literal_test.dart b/pkg/analyzer/test/src/dart/resolution/type_inference/map_literal_test.dart
index d081d5f..c304f28 100644
--- a/pkg/analyzer/test/src/dart/resolution/type_inference/map_literal_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/type_inference/map_literal_test.dart
@@ -53,6 +53,9 @@
     arguments
       NullLiteral
         literal: null
+        parameter: ParameterMember
+          base: root::@parameter::t
+          substitution: {T: Map<int, double>?}
         staticType: Null
     rightParenthesis: )
   staticInvokeType: Map<int, double>? Function(Map<int, double>?)
diff --git a/pkg/analyzer/test/src/diagnostics/abstract_super_member_reference_test.dart b/pkg/analyzer/test/src/diagnostics/abstract_super_member_reference_test.dart
index d743a92..d736578 100644
--- a/pkg/analyzer/test/src/diagnostics/abstract_super_member_reference_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/abstract_super_member_reference_test.dart
@@ -46,6 +46,7 @@
     arguments
       IntegerLiteral
         literal: 0
+        parameter: self::@class::A::@method::foo::@parameter::_
         staticType: int
     rightParenthesis: )
   staticInvokeType: void Function(int)
@@ -156,6 +157,7 @@
     arguments
       IntegerLiteral
         literal: 0
+        parameter: self::@class::A::@method::foo::@parameter::_
         staticType: int
     rightParenthesis: )
   staticInvokeType: void Function(int)
@@ -452,6 +454,7 @@
   operator: =
   rightHandSide: IntegerLiteral
     literal: 0
+    parameter: self::@class::A::@setter::foo::@parameter::_
     staticType: int
   readElement: <null>
   readType: null
@@ -494,6 +497,7 @@
   operator: =
   rightHandSide: IntegerLiteral
     literal: 0
+    parameter: self::@class::A::@setter::foo::@parameter::_
     staticType: int
   readElement: <null>
   readType: null
@@ -536,6 +540,7 @@
   operator: =
   rightHandSide: SimpleIdentifier
     token: a
+    parameter: self::@class::A::@setter::foo::@parameter::a
     staticElement: self::@class::B::@setter::foo::@parameter::a
     staticType: int
   readElement: <null>
@@ -577,6 +582,7 @@
   operator: =
   rightHandSide: SimpleIdentifier
     token: a
+    parameter: self::@class::A::@setter::foo::@parameter::a
     staticElement: self::@class::B::@setter::foo::@parameter::a
     staticType: int
   readElement: <null>
@@ -622,6 +628,7 @@
   operator: =
   rightHandSide: IntegerLiteral
     literal: 0
+    parameter: self::@class::A::@setter::foo::@parameter::_
     staticType: int
   readElement: <null>
   readType: null
diff --git a/pkg/analyzer/test/src/diagnostics/ambiguous_extension_member_access_test.dart b/pkg/analyzer/test/src/diagnostics/ambiguous_extension_member_access_test.dart
index 616f384..4838d2a 100644
--- a/pkg/analyzer/test/src/diagnostics/ambiguous_extension_member_access_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/ambiguous_extension_member_access_test.dart
@@ -358,6 +358,7 @@
   operator: =
   rightHandSide: IntegerLiteral
     literal: 3
+    parameter: <null>
     staticType: int
   readElement: <null>
   readType: null
diff --git a/pkg/analyzer/test/src/diagnostics/duplicate_import_test.dart b/pkg/analyzer/test/src/diagnostics/duplicate_import_test.dart
index a403bd1..494f159 100644
--- a/pkg/analyzer/test/src/diagnostics/duplicate_import_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/duplicate_import_test.dart
@@ -16,20 +16,48 @@
 
 @reflectiveTest
 class DuplicateImportTest extends PubPackageResolutionTest {
-  test_duplicateImport() async {
-    newFile('$testPackageLibPath/lib1.dart', r'''
-library lib1;
-class A {}''');
+  test_duplicateImport_absolute_absolute() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+class A {}
+''');
 
-    newFile('$testPackageLibPath/lib2.dart', r'''
-library L;
-import 'lib1.dart';
-import 'lib1.dart';
-A a = A();''');
+    await assertErrorsInCode(r'''
+import 'package:test/a.dart';
+import 'package:test/a.dart';
 
-    await _resolveFile('$testPackageLibPath/lib1.dart');
-    await _resolveFile('$testPackageLibPath/lib2.dart', [
-      error(HintCode.DUPLICATE_IMPORT, 38, 11),
+final a = A();
+''', [
+      error(HintCode.DUPLICATE_IMPORT, 37, 21),
+    ]);
+  }
+
+  test_duplicateImport_relative_absolute() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+class A {}
+''');
+
+    await assertErrorsInCode(r'''
+import 'a.dart';
+import 'package:test/a.dart';
+
+final a = A();
+''', [
+      error(HintCode.DUPLICATE_IMPORT, 24, 21),
+    ]);
+  }
+
+  test_duplicateImport_relative_relative() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+class A {}
+''');
+
+    await assertErrorsInCode(r'''
+import 'a.dart';
+import 'a.dart';
+
+final a = A();
+''', [
+      error(HintCode.DUPLICATE_IMPORT, 24, 8),
     ]);
   }
 
diff --git a/pkg/analyzer/test/src/diagnostics/instance_access_to_static_member_test.dart b/pkg/analyzer/test/src/diagnostics/instance_access_to_static_member_test.dart
index d06b020..a691893 100644
--- a/pkg/analyzer/test/src/diagnostics/instance_access_to_static_member_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/instance_access_to_static_member_test.dart
@@ -177,6 +177,7 @@
   operator: =
   rightHandSide: IntegerLiteral
     literal: 2
+    parameter: self::@extension::E::@setter::a::@parameter::v
     staticType: int
   readElement: <null>
   readType: null
diff --git a/pkg/analyzer/test/src/diagnostics/non_constant_default_value_test.dart b/pkg/analyzer/test/src/diagnostics/non_constant_default_value_test.dart
index 5398b86..98e12ec 100644
--- a/pkg/analyzer/test/src/diagnostics/non_constant_default_value_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/non_constant_default_value_test.dart
@@ -98,6 +98,25 @@
     ]);
   }
 
+  test_enum_issue49097() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+class A {
+  static const foo = A();
+  static const bar = A();
+  const A();
+}
+''');
+    await assertNoErrorsInCode(r'''
+import 'a.dart';
+
+enum E {
+  v(f: A.foo);
+  final A f;
+  const E({this.f = A.bar});
+}
+''');
+  }
+
   test_function_named() async {
     await assertErrorsInCode(r'''
 int y = 0;
diff --git a/pkg/analyzer/test/src/diagnostics/non_null_opt_out_test.dart b/pkg/analyzer/test/src/diagnostics/non_null_opt_out_test.dart
index ab85796..4f2c5af 100644
--- a/pkg/analyzer/test/src/diagnostics/non_null_opt_out_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/non_null_opt_out_test.dart
@@ -49,6 +49,9 @@
     leftBracket: [
     index: NullLiteral
       literal: null
+      parameter: ParameterMember
+        base: package:test/a.dart::@class::A::@method::[]=::@parameter::a
+        isLegacy: true
       staticType: Null*
     rightBracket: ]
     staticElement: <null>
@@ -56,6 +59,9 @@
   operator: =
   rightHandSide: NullLiteral
     literal: null
+    parameter: ParameterMember
+      base: package:test/a.dart::@class::A::@method::[]=::@parameter::b
+      isLegacy: true
     staticType: Null*
   readElement: <null>
   readType: null
@@ -101,6 +107,9 @@
   operator: =
   rightHandSide: IntegerLiteral
     literal: 0
+    parameter: ParameterMember
+      base: package:test/a.dart::@class::A::@setter::foo::@parameter::_foo
+      isLegacy: true
     staticType: int*
   readElement: <null>
   readType: null
@@ -147,6 +156,9 @@
   operator: =
   rightHandSide: IntegerLiteral
     literal: 0
+    parameter: ParameterMember
+      base: package:test/a.dart::@extension::E::@setter::foo::@parameter::_
+      isLegacy: true
     staticType: int*
   readElement: <null>
   readType: null
@@ -192,6 +204,9 @@
   operator: =
   rightHandSide: IntegerLiteral
     literal: 0
+    parameter: ParameterMember
+      base: package:test/a.dart::@class::A::@setter::foo::@parameter::_foo
+      isLegacy: true
     staticType: int*
   readElement: <null>
   readType: null
@@ -237,6 +252,9 @@
   operator: =
   rightHandSide: IntegerLiteral
     literal: 0
+    parameter: ParameterMember
+      base: package:test/a.dart::@extension::E::@setter::foo::@parameter::_foo
+      isLegacy: true
     staticType: int*
   readElement: <null>
   readType: null
@@ -280,6 +298,9 @@
   operator: =
   rightHandSide: IntegerLiteral
     literal: 0
+    parameter: ParameterMember
+      base: package:test/a.dart::@setter::foo::@parameter::_foo
+      isLegacy: true
     staticType: int*
   readElement: <null>
   readType: null
@@ -335,6 +356,9 @@
   operator: =
   rightHandSide: IntegerLiteral
     literal: 0
+    parameter: ParameterMember
+      base: package:test/a.dart::@class::A::@setter::foo::@parameter::_foo
+      isLegacy: true
     staticType: int*
   readElement: <null>
   readType: null
@@ -391,6 +415,9 @@
   operator: =
   rightHandSide: IntegerLiteral
     literal: 0
+    parameter: ParameterMember
+      base: package:test/a.dart::@extension::E::@setter::foo::@parameter::a
+      isLegacy: true
     staticType: int*
   readElement: <null>
   readType: null
@@ -433,6 +460,7 @@
         arguments
           SimpleIdentifier
             token: a
+            parameter: <null>
             staticElement: self::@function::main::@parameter::a
             staticType: A*
         rightParenthesis: )
@@ -447,6 +475,9 @@
   operator: =
   rightHandSide: IntegerLiteral
     literal: 0
+    parameter: ParameterMember
+      base: package:test/a.dart::@extension::E::@setter::foo::@parameter::a
+      isLegacy: true
     staticType: int*
   readElement: <null>
   readType: null
@@ -492,6 +523,9 @@
   operator: =
   rightHandSide: IntegerLiteral
     literal: 0
+    parameter: ParameterMember
+      base: package:test/a.dart::@class::A::@setter::foo::@parameter::_foo
+      isLegacy: true
     staticType: int*
   readElement: <null>
   readType: null
@@ -527,6 +561,9 @@
   operator: =
   rightHandSide: NullLiteral
     literal: null
+    parameter: ParameterMember
+      base: package:test/a.dart::@setter::foo::@parameter::_foo
+      isLegacy: true
     staticType: Null*
   readElement: <null>
   readType: null
diff --git a/pkg/analyzer/test/src/diagnostics/private_setter_test.dart b/pkg/analyzer/test/src/diagnostics/private_setter_test.dart
index e0163e8..be2b945 100644
--- a/pkg/analyzer/test/src/diagnostics/private_setter_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/private_setter_test.dart
@@ -49,6 +49,7 @@
   operator: =
   rightHandSide: IntegerLiteral
     literal: 0
+    parameter: package:test/a.dart::@class::A::@setter::_foo::@parameter::__foo
     staticType: int
   readElement: <null>
   readType: null
@@ -108,6 +109,7 @@
   operator: =
   rightHandSide: IntegerLiteral
     literal: 0
+    parameter: package:test/a.dart::@class::A::@setter::_foo::@parameter::_
     staticType: int
   readElement: <null>
   readType: null
@@ -152,6 +154,7 @@
   operator: =
   rightHandSide: IntegerLiteral
     literal: 0
+    parameter: package:test/a.dart::@class::A::@setter::_foo::@parameter::_
     staticType: int
   readElement: <null>
   readType: null
diff --git a/pkg/analyzer/test/src/diagnostics/receiver_of_type_never_test.dart b/pkg/analyzer/test/src/diagnostics/receiver_of_type_never_test.dart
index 8e202b1..2b705e8 100644
--- a/pkg/analyzer/test/src/diagnostics/receiver_of_type_never_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/receiver_of_type_never_test.dart
@@ -40,7 +40,9 @@
     operator: +
     rightOperand: IntegerLiteral
       literal: 2
+      parameter: dart:core::@class::num::@method::+::@parameter::other
       staticType: int
+    parameter: <null>
     staticElement: dart:core::@class::num::@method::+
     staticInvokeType: num Function(num)
     staticType: int
@@ -76,11 +78,13 @@
       operator: +
       rightOperand: IntegerLiteral
         literal: 2
+        parameter: dart:core::@class::num::@method::+::@parameter::other
         staticType: int
       staticElement: dart:core::@class::num::@method::+
       staticInvokeType: num Function(num)
       staticType: int
     rightParenthesis: )
+    parameter: <null>
     staticType: int
   staticElement: <null>
   staticInvokeType: null
@@ -109,7 +113,9 @@
     operator: +
     rightOperand: IntegerLiteral
       literal: 2
+      parameter: dart:core::@class::num::@method::+::@parameter::other
       staticType: int
+    parameter: dart:core::@class::Object::@method::==::@parameter::other
     staticElement: dart:core::@class::num::@method::+
     staticInvokeType: num Function(num)
     staticType: int
@@ -147,11 +153,13 @@
       operator: +
       rightOperand: IntegerLiteral
         literal: 2
+        parameter: dart:core::@class::num::@method::+::@parameter::other
         staticType: int
       staticElement: dart:core::@class::num::@method::+
       staticInvokeType: num Function(num)
       staticType: int
     rightParenthesis: )
+    parameter: <null>
     staticType: int
   staticElement: <null>
   staticInvokeType: null
@@ -215,6 +223,7 @@
   leftBracket: [
   index: IntegerLiteral
     literal: 0
+    parameter: <null>
     staticType: int
   rightBracket: ]
   staticElement: <null>
@@ -243,6 +252,7 @@
     leftBracket: [
     index: IntegerLiteral
       literal: 0
+      parameter: <null>
       staticType: int
     rightBracket: ]
     staticElement: <null>
@@ -255,7 +265,9 @@
     operator: +
     rightOperand: IntegerLiteral
       literal: 2
+      parameter: dart:core::@class::num::@method::+::@parameter::other
       staticType: int
+    parameter: <null>
     staticElement: dart:core::@class::num::@method::+
     staticInvokeType: num Function(num)
     staticType: int
@@ -288,6 +300,7 @@
     leftBracket: [
     index: IntegerLiteral
       literal: 0
+      parameter: <null>
       staticType: int
     rightBracket: ]
     staticElement: <null>
@@ -300,7 +313,9 @@
     operator: +
     rightOperand: IntegerLiteral
       literal: 2
+      parameter: dart:core::@class::num::@method::+::@parameter::other
       staticType: int
+    parameter: <null>
     staticElement: dart:core::@class::num::@method::+
     staticInvokeType: num Function(num)
     staticType: int
@@ -332,6 +347,7 @@
   leftBracket: [
   index: IntegerLiteral
     literal: 0
+    parameter: <null>
     staticType: int
   rightBracket: ]
   staticElement: <null>
@@ -360,6 +376,7 @@
     leftBracket: [
     index: IntegerLiteral
       literal: 0
+      parameter: <null>
       staticType: int
     rightBracket: ]
     staticElement: <null>
@@ -372,7 +389,9 @@
     operator: +
     rightOperand: IntegerLiteral
       literal: 2
+      parameter: dart:core::@class::num::@method::+::@parameter::other
       staticType: int
+    parameter: <null>
     staticElement: dart:core::@class::num::@method::+
     staticInvokeType: num Function(num)
     staticType: int
@@ -405,6 +424,7 @@
     leftBracket: [
     index: IntegerLiteral
       literal: 0
+      parameter: <null>
       staticType: int
     rightBracket: ]
     staticElement: <null>
@@ -417,7 +437,9 @@
     operator: +
     rightOperand: IntegerLiteral
       literal: 2
+      parameter: dart:core::@class::num::@method::+::@parameter::other
       staticType: int
+    parameter: <null>
     staticElement: dart:core::@class::num::@method::+
     staticInvokeType: num Function(num)
     staticType: int
@@ -470,7 +492,9 @@
         operator: +
         rightOperand: IntegerLiteral
           literal: 2
+          parameter: dart:core::@class::num::@method::+::@parameter::other
           staticType: int
+        parameter: <null>
         staticElement: dart:core::@class::num::@method::+
         staticInvokeType: num Function(num)
         staticType: int
@@ -512,7 +536,9 @@
         operator: +
         rightOperand: IntegerLiteral
           literal: 2
+          parameter: dart:core::@class::num::@method::+::@parameter::other
           staticType: int
+        parameter: <null>
         staticElement: dart:core::@class::num::@method::+
         staticInvokeType: num Function(num)
         staticType: int
@@ -553,7 +579,9 @@
         operator: +
         rightOperand: IntegerLiteral
           literal: 2
+          parameter: dart:core::@class::num::@method::+::@parameter::other
           staticType: int
+        parameter: <null>
         staticElement: dart:core::@class::num::@method::+
         staticInvokeType: num Function(num)
         staticType: int
@@ -721,6 +749,7 @@
   operator: +=
   rightHandSide: IntegerLiteral
     literal: 0
+    parameter: <null>
     staticType: int
   readElement: <null>
   readType: dynamic
@@ -772,6 +801,7 @@
   operator: =
   rightHandSide: IntegerLiteral
     literal: 0
+    parameter: <null>
     staticType: int
   readElement: <null>
   readType: null
@@ -857,7 +887,9 @@
     operator: +
     rightOperand: IntegerLiteral
       literal: 2
+      parameter: root::@parameter::other
       staticType: int*
+    parameter: root::@parameter::other
     staticElement: MethodMember
       base: dart:core::@class::num::@method::+
       isLegacy: true
@@ -899,6 +931,7 @@
       operator: +
       rightOperand: IntegerLiteral
         literal: 2
+        parameter: root::@parameter::other
         staticType: int*
       staticElement: MethodMember
         base: dart:core::@class::num::@method::+
@@ -906,6 +939,7 @@
       staticInvokeType: num* Function(num*)*
       staticType: int*
     rightParenthesis: )
+    parameter: <null>
     staticType: int*
   staticElement: <null>
   staticInvokeType: null
diff --git a/pkg/analyzer/test/src/diagnostics/use_of_nullable_value_test.dart b/pkg/analyzer/test/src/diagnostics/use_of_nullable_value_test.dart
index 14711e9..b6cbd94 100644
--- a/pkg/analyzer/test/src/diagnostics/use_of_nullable_value_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/use_of_nullable_value_test.dart
@@ -436,6 +436,7 @@
   operator: =
   rightHandSide: IntegerLiteral
     literal: 1
+    parameter: self::@class::A::@setter::x::@parameter::_x
     staticType: int
   readElement: <null>
   readType: null
@@ -473,6 +474,7 @@
   operator: =
   rightHandSide: IntegerLiteral
     literal: 2
+    parameter: self::@class::A::@setter::x::@parameter::_x
     staticType: int
   readElement: <null>
   readType: null
@@ -504,6 +506,7 @@
   operator: =
   rightHandSide: IntegerLiteral
     literal: 0
+    parameter: <null>
     staticType: int
   readElement: <null>
   readType: null
@@ -526,6 +529,7 @@
   operator: =
   rightHandSide: IntegerLiteral
     literal: 0
+    parameter: <null>
     staticType: int
   readElement: <null>
   readType: null
@@ -586,6 +590,7 @@
   operator: +=
   rightHandSide: IntegerLiteral
     literal: 0
+    parameter: dart:core::@class::num::@method::+::@parameter::other
     staticType: int
   readElement: self::@class::A::@getter::x
   readType: int
@@ -623,6 +628,7 @@
   operator: +=
   rightHandSide: IntegerLiteral
     literal: 0
+    parameter: dart:core::@class::num::@method::+::@parameter::other
     staticType: int
   readElement: self::@class::A::@getter::y
   readType: int?
@@ -682,6 +688,7 @@
   operator: +=
   rightHandSide: IntegerLiteral
     literal: 1
+    parameter: dart:core::@class::num::@method::+::@parameter::other
     staticType: int
   readElement: self::@class::A::@getter::x
   readType: int
@@ -715,6 +722,7 @@
   operator: +=
   rightHandSide: IntegerLiteral
     literal: 2
+    parameter: dart:core::@class::num::@method::+::@parameter::other
     staticType: int
   readElement: self::@class::A::@getter::x
   readType: int
@@ -746,6 +754,7 @@
   operator: +=
   rightHandSide: IntegerLiteral
     literal: 0
+    parameter: dart:core::@class::num::@method::+::@parameter::other
     staticType: int
   readElement: self::@function::m::@parameter::x
   readType: int
@@ -768,6 +777,7 @@
   operator: +=
   rightHandSide: IntegerLiteral
     literal: 0
+    parameter: dart:core::@class::num::@method::+::@parameter::other
     staticType: int
   readElement: self::@function::m::@parameter::y
   readType: int?
diff --git a/pkg/analyzer/test/src/summary/element_text.dart b/pkg/analyzer/test/src/summary/element_text.dart
index e162fb4..7400c6d 100644
--- a/pkg/analyzer/test/src/summary/element_text.dart
+++ b/pkg/analyzer/test/src/summary/element_text.dart
@@ -214,6 +214,8 @@
       selfUriStr: selfUriStr,
       sink: buffer,
       indent: indent,
+      // TODO(scheglov) https://github.com/dart-lang/sdk/issues/49101
+      withParameterElements: false,
       withOffsets: true,
     );
   }
diff --git a/pkg/analyzer/test/src/summary/elements_base.dart b/pkg/analyzer/test/src/summary/elements_base.dart
index 3fd14b1..87eff04 100644
--- a/pkg/analyzer/test/src/summary/elements_base.dart
+++ b/pkg/analyzer/test/src/summary/elements_base.dart
@@ -2,127 +2,20 @@
 // 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:typed_data';
-
-import 'package:_fe_analyzer_shared/src/macros/executor/multi_executor.dart'
-    as macro;
-import 'package:analyzer/dart/analysis/declared_variables.dart';
-import 'package:analyzer/dart/analysis/features.dart';
-import 'package:analyzer/dart/ast/ast.dart';
-import 'package:analyzer/file_system/file_system.dart';
-import 'package:analyzer/src/context/context.dart';
-import 'package:analyzer/src/context/packages.dart';
-import 'package:analyzer/src/dart/analysis/session.dart';
-import 'package:analyzer/src/dart/ast/ast.dart';
-import 'package:analyzer/src/dart/element/class_hierarchy.dart';
+import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/src/dart/element/element.dart';
-import 'package:analyzer/src/dart/element/inheritance_manager3.dart';
-import 'package:analyzer/src/dart/sdk/sdk.dart';
-import 'package:analyzer/src/generated/engine.dart';
-import 'package:analyzer/src/generated/source.dart';
-import 'package:analyzer/src/generated/utilities_dart.dart';
-import 'package:analyzer/src/source/package_map_resolver.dart';
-import 'package:analyzer/src/summary2/bundle_reader.dart';
-import 'package:analyzer/src/summary2/informative_data.dart';
-import 'package:analyzer/src/summary2/kernel_compilation_service.dart';
-import 'package:analyzer/src/summary2/link.dart';
-import 'package:analyzer/src/summary2/linked_element_factory.dart';
-import 'package:analyzer/src/summary2/macro.dart';
-import 'package:analyzer/src/summary2/reference.dart';
-import 'package:analyzer/src/test_utilities/mock_sdk.dart';
-import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
-import 'package:analyzer/src/util/performance/operation_performance.dart';
-import 'package:analyzer/src/util/uri.dart';
-import 'package:meta/meta.dart';
-import 'package:path/path.dart' as package_path;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
-import '../../util/feature_sets.dart';
-import 'test_strategies.dart';
+import '../dart/resolution/context_collection_resolution.dart';
 
 /// A base for testing building elements.
 @reflectiveTest
-abstract class ElementsBaseTest with ResourceProviderMixin {
-  /// The shared SDK bundle, computed once and shared among test invocations.
-  static _SdkBundle? _sdkBundle;
-
-  /// The instance of macro executor that is used for all macros.
-  final macro.MultiMacroExecutor _macroExecutor = macro.MultiMacroExecutor();
-
-  /// The set of features enabled in this test.
-  FeatureSet featureSet = FeatureSets.latestWithExperiments;
-
-  DeclaredVariables declaredVariables = DeclaredVariables();
-  late final SourceFactory sourceFactory;
-  late final FolderBasedDartSdk sdk;
-
-  ElementsBaseTest() {
-    var sdkRoot = newFolder('/sdk');
-    createMockSdk(
-      resourceProvider: resourceProvider,
-      root: sdkRoot,
-    );
-    sdk = FolderBasedDartSdk(resourceProvider, sdkRoot);
-  }
-
+abstract class ElementsBaseTest extends PubPackageResolutionTest {
   /// We need to test both cases - when we keep linking libraries (happens for
   /// new or invalidated libraries), and when we load libraries from bytes
   /// (happens internally in Blaze or when we have cached summaries).
   bool get keepLinkingLibraries;
 
-  Future<_SdkBundle> get sdkBundle async {
-    if (_sdkBundle != null) {
-      return _sdkBundle!;
-    }
-
-    var featureSet = FeatureSet.latestLanguageVersion();
-    var inputLibraries = <LinkInputLibrary>[];
-    for (var sdkLibrary in sdk.sdkLibraries) {
-      var source = sourceFactory.resolveUri(null, sdkLibrary.shortName)!;
-      var text = getFile(source.fullName).readAsStringSync();
-      var unit = parseText(source, text, featureSet);
-
-      var inputUnits = <LinkInputUnit>[];
-      _addLibraryUnits(source, unit, inputUnits, featureSet);
-      inputLibraries.add(
-        LinkInputLibrary(
-          source: source,
-          units: inputUnits,
-        ),
-      );
-    }
-
-    var elementFactory = LinkedElementFactory(
-      AnalysisContextImpl(
-        SynchronousSession(
-          AnalysisOptionsImpl(),
-          declaredVariables,
-        ),
-        sourceFactory,
-      ),
-      _AnalysisSessionForLinking(),
-      Reference.root(),
-    );
-
-    var sdkLinkResult = await link2(
-      elementFactory: elementFactory,
-      inputLibraries: inputLibraries,
-      performance: OperationPerformanceImpl('link'),
-    );
-
-    return _sdkBundle = _SdkBundle(
-      resolutionBytes: sdkLinkResult.resolutionBytes,
-    );
-  }
-
-  String get testFilePath => '$testPackageLibPath/test.dart';
-
-  String get testPackageLibPath => '$testPackageRootPath/lib';
-
-  String get testPackageRootPath => '$workspaceRootPath/test';
-
-  String get workspaceRootPath => '/home';
-
   void addSource(String path, String contents) {
     newFile(path, contents);
   }
@@ -133,404 +26,24 @@
     bool dumpSummaries = false,
     List<Set<String>>? preBuildSequence,
   }) async {
-    final performance = OperationPerformanceImpl('<root>');
-    final result = await performance.runAsync(
-      'buildLibrary',
-      (performance) async {
-        _buildSourceFactory();
+    final file = newFile(testFilePath, text);
+    final analysisContext = contextFor(file.path);
+    final analysisSession = analysisContext.currentSession;
 
-        var testFile = newFile(testFilePath, text);
-        var testUri = sourceFactory.pathToUri(testFile.path)!;
-        var testSource = sourceFactory.forUri2(testUri)!;
+    final uriStr = 'package:test/test.dart';
+    final libraryResult = await analysisSession.getLibraryByUri(uriStr);
+    libraryResult as LibraryElementResult;
 
-        var inputLibraries = <LinkInputLibrary>[];
-        _addNonDartLibraries({}, inputLibraries, testSource);
-
-        var unitsInformativeBytes = <Uri, Uint8List>{};
-        for (var inputLibrary in inputLibraries) {
-          for (var inputUnit in inputLibrary.units) {
-            var informativeBytes = writeUnitInformative(inputUnit.unit);
-            unitsInformativeBytes[inputUnit.uri] = informativeBytes;
-          }
-        }
-
-        var analysisContext = AnalysisContextImpl(
-          SynchronousSession(
-            AnalysisOptionsImpl()..contextFeatures = featureSet,
-            declaredVariables,
-          ),
-          sourceFactory,
-        );
-
-        var elementFactory = LinkedElementFactory(
-          analysisContext,
-          _AnalysisSessionForLinking(),
-          Reference.root(),
-        );
-        elementFactory.addBundle(
-          BundleReader(
-            elementFactory: elementFactory,
-            unitsInformativeBytes: {},
-            resolutionBytes: (await sdkBundle).resolutionBytes,
-          ),
-        );
-
-        await performance.runAsync(
-          'linkConfiguredLibraries',
-          (performance) async {
-            await _linkConfiguredLibraries(
-              elementFactory,
-              inputLibraries,
-              preBuildSequence,
-              performance,
-            );
-          },
-        );
-
-        var linkResult = await performance.runAsync(
-          'link',
-          (performance) async {
-            return await link2(
-              elementFactory: elementFactory,
-              inputLibraries: inputLibraries,
-              macroExecutor: _macroExecutor,
-              performance: performance,
-            );
-          },
-        );
-
-        for (var macroUnit in linkResult.macroGeneratedUnits) {
-          var informativeBytes = writeUnitInformative(macroUnit.unit);
-          unitsInformativeBytes[macroUnit.uri] = informativeBytes;
-        }
-
-        if (!keepLinkingLibraries) {
-          elementFactory.removeBundle(
-            inputLibraries.map((e) => e.uriStr).toSet(),
-          );
-          elementFactory.addBundle(
-            BundleReader(
-              elementFactory: elementFactory,
-              unitsInformativeBytes: unitsInformativeBytes,
-              resolutionBytes: linkResult.resolutionBytes,
-            ),
-          );
-        }
-
-        return elementFactory.libraryOfUri2('$testUri');
-      },
-    );
-
-    // final performanceBuffer = StringBuffer();
-    // performance.children.single.write(buffer: performanceBuffer);
-    // print(performanceBuffer);
-
-    return result;
-  }
-
-  @mustCallSuper
-  Future<void> setUp() async {}
-
-  @mustCallSuper
-  Future<void> tearDown() async {
-    await _macroExecutor.close();
-    KernelCompilationService.disposeDelayed(
-      const Duration(milliseconds: 100),
-    );
-  }
-
-  void _addLibraryUnits(
-    Source definingSource,
-    CompilationUnit definingUnit,
-    List<LinkInputUnit> units,
-    FeatureSet featureSet,
-  ) {
-    units.add(
-      LinkInputUnit(
-        partDirectiveIndex: null,
-        source: definingSource,
-        isSynthetic: false,
-        unit: definingUnit,
-      ),
-    );
-
-    var partDirectiveIndex = -1;
-    for (var directive in definingUnit.directives) {
-      if (directive is PartDirective) {
-        ++partDirectiveIndex;
-        var relativeUriStr = directive.uri.stringValue;
-
-        var partSource = sourceFactory.resolveUri(
-          definingSource,
-          relativeUriStr,
-        );
-
-        if (partSource != null) {
-          var text = _readSafely(partSource.fullName);
-          var unit = parseText(partSource, text, featureSet);
-          units.add(
-            LinkInputUnit(
-              partDirectiveIndex: partDirectiveIndex,
-              partUriStr: relativeUriStr,
-              source: partSource,
-              isSynthetic: false,
-              unit: unit,
-            ),
-          );
-        }
-      }
+    if (keepLinkingLibraries) {
+      return libraryResult.element as LibraryElementImpl;
+    } else {
+      analysisContext.changeFile(file.path);
+      await analysisContext.applyPendingFileChanges();
+      // Ask again, should be read from bytes.
+      final analysisSession = analysisContext.currentSession;
+      final libraryResult = await analysisSession.getLibraryByUri(uriStr);
+      libraryResult as LibraryElementResult;
+      return libraryResult.element as LibraryElementImpl;
     }
   }
-
-  void _addNonDartLibraries(
-    Set<Source> addedLibraries,
-    List<LinkInputLibrary> libraries,
-    Source source,
-  ) {
-    if (source.uri.isScheme('dart') || !addedLibraries.add(source)) {
-      return;
-    }
-
-    var text = _readSafely(source.fullName);
-    var unit = parseText(source, text, featureSet);
-
-    var units = <LinkInputUnit>[];
-    _addLibraryUnits(source, unit, units, featureSet);
-    libraries.add(
-      LinkInputLibrary(
-        source: source,
-        units: units,
-      ),
-    );
-
-    void addRelativeUriStr(StringLiteral uriNode) {
-      var relativeUriStr = uriNode.stringValue;
-      if (relativeUriStr == null) {
-        return;
-      }
-
-      Uri relativeUri;
-      try {
-        relativeUri = Uri.parse(relativeUriStr);
-      } on FormatException {
-        return;
-      }
-
-      var absoluteUri = resolveRelativeUri(source.uri, relativeUri);
-      var rewrittenUri = rewriteToCanonicalUri(sourceFactory, absoluteUri);
-      if (rewrittenUri == null) {
-        return;
-      }
-
-      var uriSource = sourceFactory.forUri2(rewrittenUri);
-      if (uriSource == null) {
-        return;
-      }
-
-      _addNonDartLibraries(addedLibraries, libraries, uriSource);
-    }
-
-    for (var directive in unit.directives) {
-      if (directive is NamespaceDirective) {
-        addRelativeUriStr(directive.uri);
-        for (var configuration in directive.configurations) {
-          addRelativeUriStr(configuration.uri);
-        }
-      }
-    }
-  }
-
-  /// If there are any [macroLibraries], build the kernel and prepare for
-  /// execution.
-  Future<void> _buildMacroLibraries(
-    LinkedElementFactory elementFactory,
-    List<MacroLibrary> macroLibraries,
-  ) async {
-    if (macroLibraries.isEmpty) {
-      return;
-    }
-
-    final macroKernelBuilder = const MacroKernelBuilder();
-    var macroKernelBytes = await macroKernelBuilder.build(
-      fileSystem: _MacroFileSystem(resourceProvider),
-      libraries: macroLibraries,
-    );
-
-    var bundleMacroExecutor = BundleMacroExecutor(
-      macroExecutor: _macroExecutor,
-      kernelBytes: macroKernelBytes,
-      libraries: macroLibraries.map((e) => e.uri).toSet(),
-    );
-
-    for (var macroLibrary in macroLibraries) {
-      var uriStr = macroLibrary.uriStr;
-      var element = elementFactory.libraryOfUri2(uriStr);
-      element.bundleMacroExecutor = bundleMacroExecutor;
-    }
-  }
-
-  void _buildSourceFactory() {
-    final packages = parsePackageConfigJsonFile(
-      resourceProvider,
-      getFile('$testPackageRootPath/.dart_tool/package_config.json'),
-    );
-
-    // TODO(scheglov) Can we use Packages instead?
-    final packageMap = <String, List<Folder>>{};
-    for (final package in packages.packages) {
-      packageMap[package.name] = [package.libFolder];
-    }
-
-    sourceFactory = SourceFactory([
-      DartUriResolver(sdk),
-      PackageMapUriResolver(resourceProvider, packageMap),
-      ResourceUriResolver(resourceProvider),
-    ]);
-  }
-
-  /// If there are any libraries in the [uriStrSetList], link these subsets
-  /// of [inputLibraries] (and remove from it), build macro kernels, prepare
-  /// for executing macros.
-  Future<void> _linkConfiguredLibraries(
-    LinkedElementFactory elementFactory,
-    List<LinkInputLibrary> inputLibraries,
-    List<Set<String>>? uriStrSetList,
-    OperationPerformanceImpl performance,
-  ) async {
-    if (uriStrSetList == null) {
-      return;
-    }
-
-    for (var uriStrSet in uriStrSetList) {
-      var cycleInputLibraries = <LinkInputLibrary>[];
-      var macroLibraries = <MacroLibrary>[];
-      for (var inputLibrary in inputLibraries) {
-        if (uriStrSet.contains(inputLibrary.uriStr)) {
-          cycleInputLibraries.add(inputLibrary);
-          _addMacroLibrary(macroLibraries, inputLibrary);
-        }
-      }
-
-      await performance.runAsync('link', (performance) async {
-        await link2(
-          elementFactory: elementFactory,
-          inputLibraries: cycleInputLibraries,
-          macroExecutor: _macroExecutor,
-          performance: performance,
-        );
-        performance.collapse();
-      });
-
-      await performance.runAsync('buildMacroLibraries', (_) async {
-        await _buildMacroLibraries(elementFactory, macroLibraries);
-      });
-
-      // Remove libraries that we just linked.
-      cycleInputLibraries.forEach(inputLibraries.remove);
-    }
-  }
-
-  String _readSafely(String path) {
-    try {
-      var file = resourceProvider.getFile(path);
-      return file.readAsStringSync();
-    } catch (_) {
-      return '';
-    }
-  }
-
-  /// If there are any macros in the [inputLibrary], add it.
-  static void _addMacroLibrary(
-    List<MacroLibrary> macroLibraries,
-    LinkInputLibrary inputLibrary,
-  ) {
-    var macroClasses = <MacroClass>[];
-    for (var inputUnit in inputLibrary.units) {
-      for (var declaration in inputUnit.unit.declarations) {
-        if (declaration is ClassDeclarationImpl &&
-            declaration.macroKeyword != null) {
-          var constructors =
-              declaration.members.whereType<ConstructorDeclaration>().toList();
-          if (constructors.isEmpty) {
-            macroClasses.add(
-              MacroClass(
-                name: declaration.name.name,
-                constructors: [''],
-              ),
-            );
-          } else {
-            var constructorNames = constructors
-                .map((e) => e.name?.name ?? '')
-                .where((e) => !e.startsWith('_'))
-                .toList();
-            if (constructorNames.isNotEmpty) {
-              macroClasses.add(
-                MacroClass(
-                  name: declaration.name.name,
-                  constructors: constructorNames,
-                ),
-              );
-            }
-          }
-        }
-      }
-    }
-    if (macroClasses.isNotEmpty) {
-      macroLibraries.add(
-        MacroLibrary(
-          uri: inputLibrary.uri,
-          path: inputLibrary.source.fullName,
-          classes: macroClasses,
-        ),
-      );
-    }
-  }
-}
-
-class _AnalysisSessionForLinking implements AnalysisSessionImpl {
-  @override
-  final ClassHierarchy classHierarchy = ClassHierarchy();
-
-  @override
-  InheritanceManager3 inheritanceManager = InheritanceManager3();
-
-  @override
-  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
-}
-
-/// [MacroFileEntry] adapter for [File].
-class _MacroFileEntry implements MacroFileEntry {
-  final File file;
-
-  _MacroFileEntry(this.file);
-
-  @override
-  String get content => file.readAsStringSync();
-
-  @override
-  bool get exists => file.exists;
-}
-
-/// [MacroFileSystem] adapter for [ResourceProvider].
-class _MacroFileSystem implements MacroFileSystem {
-  final ResourceProvider resourceProvider;
-
-  _MacroFileSystem(this.resourceProvider);
-
-  @override
-  package_path.Context get pathContext => resourceProvider.pathContext;
-
-  @override
-  MacroFileEntry getFile(String path) {
-    var file = resourceProvider.getFile(path);
-    return _MacroFileEntry(file);
-  }
-}
-
-class _SdkBundle {
-  final Uint8List resolutionBytes;
-
-  _SdkBundle({
-    required this.resolutionBytes,
-  });
 }
diff --git a/pkg/analyzer/test/src/summary/elements_test.dart b/pkg/analyzer/test/src/summary/elements_test.dart
index 1d82985..331a9ab 100644
--- a/pkg/analyzer/test/src/summary/elements_test.dart
+++ b/pkg/analyzer/test/src/summary/elements_test.dart
@@ -2,16 +2,13 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/dart/analysis/declared_variables.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/src/dart/element/element.dart';
-import 'package:analyzer/src/test_utilities/package_config_file_builder.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
-import '../../util/feature_sets.dart';
 import 'element_text.dart';
 import 'elements_base.dart';
 
@@ -43,15 +40,6 @@
 }
 
 abstract class ElementsTest extends ElementsBaseTest {
-  @override
-  Future<void> setUp() async {
-    await super.setUp();
-
-    _writeTestPackageConfig(
-      PackageConfigFileBuilder(),
-    );
-  }
-
   test_class_abstract() async {
     var library = await buildLibrary('abstract class C {}');
     checkElementText(library, r'''
@@ -5554,17 +5542,17 @@
   }
 
   test_class_notSimplyBounded_function_typed_bound_complex_via_parameter_type_legacy() async {
-    featureSet = FeatureSets.language_2_9;
     var library = await buildLibrary('''
+// @dart = 2.9
 class C<T extends void Function(T)> {}
 ''');
     checkElementText(library, r'''
 library
   definingUnit
     classes
-      notSimplyBounded class C @6
+      notSimplyBounded class C @21
         typeParameters
-          covariant T @8
+          covariant T @23
             bound: void Function(T*)*
             defaultType: void Function(Null*)*
         constructors
@@ -5924,8 +5912,8 @@
   }
 
   test_class_ref_nullability_star() async {
-    featureSet = FeatureSets.language_2_9;
     var library = await buildLibrary('''
+// @dart = 2.9
 class C {}
 C c;
 ''');
@@ -5933,11 +5921,11 @@
 library
   definingUnit
     classes
-      class C @6
+      class C @21
         constructors
           synthetic @-1
     topLevelVariables
-      static c @13
+      static c @28
         type: C*
     accessors
       synthetic static get c @-1
@@ -6611,8 +6599,8 @@
   }
 
   test_class_typeParameters_defaultType_functionTypeAlias_contravariant_legacy() async {
-    featureSet = FeatureSets.language_2_9;
     var library = await buildLibrary(r'''
+// @dart = 2.9
 typedef F<X> = void Function(X);
 
 class A<X extends F<X>> {}
@@ -6621,9 +6609,9 @@
 library
   definingUnit
     classes
-      notSimplyBounded class A @40
+      notSimplyBounded class A @55
         typeParameters
-          covariant X @42
+          covariant X @57
             bound: void Function(X*)*
               alias: self::@typeAlias::F
                 typeArguments
@@ -6635,9 +6623,9 @@
         constructors
           synthetic @-1
     typeAliases
-      F @8
+      F @23
         typeParameters
-          contravariant X @10
+          contravariant X @25
             defaultType: dynamic
         aliasedType: void Function(X*)*
         aliasedElement: GenericFunctionTypeElement
@@ -6794,17 +6782,17 @@
   }
 
   test_class_typeParameters_defaultType_genericFunctionType_both_legacy() async {
-    featureSet = FeatureSets.language_2_9;
     var library = await buildLibrary(r'''
+// @dart = 2.9
 class A<X extends X Function(X)> {}
 ''');
     checkElementText(library, r'''
 library
   definingUnit
     classes
-      notSimplyBounded class A @6
+      notSimplyBounded class A @21
         typeParameters
-          covariant X @8
+          covariant X @23
             bound: X* Function(X*)*
             defaultType: dynamic Function(Null*)*
         constructors
@@ -6831,17 +6819,17 @@
   }
 
   test_class_typeParameters_defaultType_genericFunctionType_contravariant_legacy() async {
-    featureSet = FeatureSets.language_2_9;
     var library = await buildLibrary(r'''
+// @dart = 2.9
 class A<X extends void Function(X)> {}
 ''');
     checkElementText(library, r'''
 library
   definingUnit
     classes
-      notSimplyBounded class A @6
+      notSimplyBounded class A @21
         typeParameters
-          covariant X @8
+          covariant X @23
             bound: void Function(X*)*
             defaultType: void Function(Null*)*
         constructors
@@ -9915,17 +9903,11 @@
 
   test_compilationUnit_nnbd_disabled_via_dart_directive() async {
     var library = await buildLibrary('''
-// @dart=2.2
+// @dart = 2.9
 ''');
     expect(library.isNonNullableByDefault, isFalse);
   }
 
-  test_compilationUnit_nnbd_disabled_via_feature_set() async {
-    featureSet = FeatureSets.language_2_9;
-    var library = await buildLibrary('');
-    expect(library.isNonNullableByDefault, isFalse);
-  }
-
   test_compilationUnit_nnbd_enabled() async {
     var library = await buildLibrary('');
     expect(library.isNonNullableByDefault, isTrue);
@@ -15280,21 +15262,21 @@
   }
 
   test_const_topLevel_throw_legacy() async {
-    featureSet = FeatureSets.language_2_9;
     var library = await buildLibrary(r'''
+// @dart = 2.9
 const c = throw 42;
 ''');
     checkElementText(library, r'''
 library
   definingUnit
     topLevelVariables
-      static const c @6
+      static const c @21
         type: dynamic
         constantInitializer
           ThrowExpression
-            throwKeyword: throw @10
+            throwKeyword: throw @25
             expression: IntegerLiteral
-              literal: 42 @16
+              literal: 42 @31
               staticType: int*
             staticType: Never*
     accessors
@@ -16248,8 +16230,8 @@
   }
 
   test_defaultValue_eliminateTypeParameters_legacy() async {
-    featureSet = FeatureSets.language_2_9;
     var library = await buildLibrary('''
+// @dart = 2.9
 class A<T> {
   const X({List<T> a = const []});
 }
@@ -16258,22 +16240,22 @@
 library
   definingUnit
     classes
-      class A @6
+      class A @21
         typeParameters
-          covariant T @8
+          covariant T @23
             defaultType: dynamic
         constructors
           synthetic @-1
         methods
-          abstract X @21
+          abstract X @36
             parameters
-              optionalNamed a @32
+              optionalNamed a @47
                 type: List<T*>*
                 constantInitializer
                   ListLiteral
-                    constKeyword: const @36
-                    leftBracket: [ @42
-                    rightBracket: ] @43
+                    constKeyword: const @51
+                    leftBracket: [ @57
+                    rightBracket: ] @58
                     staticType: List<Null*>*
             returnType: dynamic
 ''');
@@ -16442,17 +16424,17 @@
   }
 
   test_defaultValue_methodMember_legacy() async {
-    featureSet = FeatureSets.language_2_9;
     var library = await buildLibrary('''
+// @dart = 2.9
 void f([Comparator<T> compare = Comparable.compare]) {}
 ''');
     checkElementText(library, r'''
 library
   definingUnit
     functions
-      f @5
+      f @20
         parameters
-          optionalPositional compare @22
+          optionalPositional compare @37
             type: int* Function(dynamic, dynamic)*
               alias: dart:core::@typeAlias::Comparator
                 typeArguments
@@ -16460,12 +16442,12 @@
             constantInitializer
               PrefixedIdentifier
                 prefix: SimpleIdentifier
-                  token: Comparable @32
+                  token: Comparable @47
                   staticElement: dart:core::@class::Comparable
                   staticType: null
-                period: . @42
+                period: . @57
                 identifier: SimpleIdentifier
-                  token: compare @43
+                  token: compare @58
                   staticElement: MethodMember
                     base: dart:core::@class::Comparable::@method::compare
                     isLegacy: true
@@ -16670,8 +16652,8 @@
   }
 
   test_defaultValue_refersToGenericClass_constructor2_legacy() async {
-    featureSet = FeatureSets.language_2_9;
     var library = await buildLibrary('''
+// @dart = 2.9
 abstract class A<T> {}
 class B<T> implements A<T> {
   const B();
@@ -16684,38 +16666,38 @@
 library
   definingUnit
     classes
-      abstract class A @15
+      abstract class A @30
         typeParameters
-          covariant T @17
+          covariant T @32
             defaultType: dynamic
         constructors
           synthetic @-1
-      class B @29
+      class B @44
         typeParameters
-          covariant T @31
+          covariant T @46
             defaultType: dynamic
         interfaces
           A<T*>*
         constructors
-          const @60
-      class C @73
+          const @75
+      class C @88
         typeParameters
-          covariant T @75
+          covariant T @90
             defaultType: dynamic
         interfaces
           A<Iterable<T*>*>*
         constructors
-          const @114
+          const @129
             parameters
-              optionalPositional a @122
+              optionalPositional a @137
                 type: A<T*>*
                 constantInitializer
                   InstanceCreationExpression
-                    keyword: const @126
+                    keyword: const @141
                     constructorName: ConstructorName
                       type: NamedType
                         name: SimpleIdentifier
-                          token: B @132
+                          token: B @147
                           staticElement: self::@class::B
                           staticType: null
                         type: B<Null*>*
@@ -16723,15 +16705,15 @@
                         base: self::@class::B::@constructor::•
                         substitution: {T: Null*}
                     argumentList: ArgumentList
-                      leftParenthesis: ( @133
-                      rightParenthesis: ) @134
+                      leftParenthesis: ( @148
+                      rightParenthesis: ) @149
                     staticType: B<Null*>*
 ''');
   }
 
   test_defaultValue_refersToGenericClass_constructor_legacy() async {
-    featureSet = FeatureSets.language_2_9;
     var library = await buildLibrary('''
+// @dart = 2.9
 class B<T> {
   const B();
 }
@@ -16743,28 +16725,28 @@
 library
   definingUnit
     classes
-      class B @6
+      class B @21
         typeParameters
-          covariant T @8
+          covariant T @23
             defaultType: dynamic
         constructors
-          const @21
-      class C @34
+          const @36
+      class C @49
         typeParameters
-          covariant T @36
+          covariant T @51
             defaultType: dynamic
         constructors
-          const @49
+          const @64
             parameters
-              optionalPositional b @57
+              optionalPositional b @72
                 type: B<T*>*
                 constantInitializer
                   InstanceCreationExpression
-                    keyword: const @61
+                    keyword: const @76
                     constructorName: ConstructorName
                       type: NamedType
                         name: SimpleIdentifier
-                          token: B @67
+                          token: B @82
                           staticElement: self::@class::B
                           staticType: null
                         type: B<Null*>*
@@ -16772,8 +16754,8 @@
                         base: self::@class::B::@constructor::•
                         substitution: {T: Null*}
                     argumentList: ArgumentList
-                      leftParenthesis: ( @68
-                      rightParenthesis: ) @69
+                      leftParenthesis: ( @83
+                      rightParenthesis: ) @84
                     staticType: B<Null*>*
 ''');
   }
@@ -18004,6 +17986,79 @@
 ''');
   }
 
+  test_enum_constructor_fieldFormal_optionalNamed_defaultValue() async {
+    var library = await buildLibrary(r'''
+enum E {
+  v;
+  final int x;
+  const E({this.x = 1 + 2});
+}
+''');
+    checkElementText(library, r'''
+library
+  definingUnit
+    enums
+      enum E @5
+        supertype: Enum
+        fields
+          static const enumConstant v @11
+            type: E
+            constantInitializer
+              InstanceCreationExpression
+                constructorName: ConstructorName
+                  type: NamedType
+                    name: SimpleIdentifier
+                      token: E @-1
+                      staticElement: self::@enum::E
+                      staticType: null
+                    type: E
+                  staticElement: self::@enum::E::@constructor::•
+                argumentList: ArgumentList
+                  leftParenthesis: ( @0
+                  rightParenthesis: ) @0
+                staticType: E
+          synthetic static const values @-1
+            type: List<E>
+            constantInitializer
+              ListLiteral
+                leftBracket: [ @0
+                elements
+                  SimpleIdentifier
+                    token: v @-1
+                    staticElement: self::@enum::E::@getter::v
+                    staticType: E
+                rightBracket: ] @0
+                staticType: List<E>
+          final x @26
+            type: int
+        constructors
+          const @37
+            parameters
+              optionalNamed final this.x @45
+                type: int
+                constantInitializer
+                  BinaryExpression
+                    leftOperand: IntegerLiteral
+                      literal: 1 @49
+                      staticType: int
+                    operator: + @51
+                    rightOperand: IntegerLiteral
+                      literal: 2 @53
+                      staticType: int
+                    staticElement: dart:core::@class::num::@method::+
+                    staticInvokeType: num Function(num)
+                    staticType: int
+                field: self::@enum::E::@field::x
+        accessors
+          synthetic static get v @-1
+            returnType: E
+          synthetic static get values @-1
+            returnType: List<E>
+          synthetic get x @-1
+            returnType: int
+''');
+  }
+
   test_enum_constructor_fieldFormal_typed_typed() async {
     var library = await buildLibrary('''
 enum E {
@@ -19955,9 +20010,9 @@
   }
 
   test_export_configurations_useDefault() async {
-    declaredVariables = DeclaredVariables.fromMap({
+    declaredVariables = {
       'dart.library.io': 'false',
-    });
+    };
     addSource('$testPackageLibPath/foo.dart', 'class A {}');
     addSource('$testPackageLibPath/foo_io.dart', 'class A {}');
     addSource('$testPackageLibPath/foo_html.dart', 'class A {}');
@@ -19981,10 +20036,10 @@
   }
 
   test_export_configurations_useFirst() async {
-    declaredVariables = DeclaredVariables.fromMap({
+    declaredVariables = {
       'dart.library.io': 'true',
       'dart.library.html': 'true',
-    });
+    };
     addSource('$testPackageLibPath/foo.dart', 'class A {}');
     addSource('$testPackageLibPath/foo_io.dart', 'class A {}');
     addSource('$testPackageLibPath/foo_html.dart', 'class A {}');
@@ -20008,10 +20063,10 @@
   }
 
   test_export_configurations_useSecond() async {
-    declaredVariables = DeclaredVariables.fromMap({
+    declaredVariables = {
       'dart.library.io': 'false',
       'dart.library.html': 'true',
-    });
+    };
     addSource('$testPackageLibPath/foo.dart', 'class A {}');
     addSource('$testPackageLibPath/foo_io.dart', 'class A {}');
     addSource('$testPackageLibPath/foo_html.dart', 'class A {}');
@@ -20251,9 +20306,9 @@
   }
 
   test_exportImport_configurations_useDefault() async {
-    declaredVariables = DeclaredVariables.fromMap({
+    declaredVariables = {
       'dart.library.io': 'false',
-    });
+    };
     addSource('$testPackageLibPath/foo.dart', 'class A {}');
     addSource('$testPackageLibPath/foo_io.dart', 'class A {}');
     addSource('$testPackageLibPath/foo_html.dart', 'class A {}');
@@ -20283,10 +20338,10 @@
   }
 
   test_exportImport_configurations_useFirst() async {
-    declaredVariables = DeclaredVariables.fromMap({
+    declaredVariables = {
       'dart.library.io': 'true',
       'dart.library.html': 'false',
-    });
+    };
     addSource('$testPackageLibPath/foo.dart', 'class A {}');
     addSource('$testPackageLibPath/foo_io.dart', 'class A {}');
     addSource('$testPackageLibPath/foo_html.dart', 'class A {}');
@@ -20316,10 +20371,10 @@
   }
 
   test_exportImport_configurations_useSecond() async {
-    declaredVariables = DeclaredVariables.fromMap({
+    declaredVariables = {
       'dart.library.io': 'false',
       'dart.library.html': 'true',
-    });
+    };
     addSource('$testPackageLibPath/foo.dart', 'class A {}');
     addSource('$testPackageLibPath/foo_io.dart', 'class A {}');
     addSource('$testPackageLibPath/foo_html.dart', 'class A {}');
@@ -21287,15 +21342,15 @@
   }
 
   test_generic_function_type_nullability_star() async {
-    featureSet = FeatureSets.language_2_9;
     var library = await buildLibrary('''
+// @dart = 2.9
 void Function() f;
 ''');
     checkElementText(library, r'''
 library
   definingUnit
     topLevelVariables
-      static f @16
+      static f @31
         type: void Function()*
     accessors
       synthetic static get f @-1
@@ -22365,9 +22420,9 @@
   }
 
   test_import_configurations_useDefault() async {
-    declaredVariables = DeclaredVariables.fromMap({
+    declaredVariables = {
       'dart.library.io': 'false',
-    });
+    };
     addSource('$testPackageLibPath/foo.dart', 'class A {}');
     addSource('$testPackageLibPath/foo_io.dart', 'class A {}');
     addSource('$testPackageLibPath/foo_html.dart', 'class A {}');
@@ -22395,10 +22450,10 @@
   }
 
   test_import_configurations_useFirst() async {
-    declaredVariables = DeclaredVariables.fromMap({
+    declaredVariables = {
       'dart.library.io': 'true',
       'dart.library.html': 'true',
-    });
+    };
     addSource('$testPackageLibPath/foo.dart', 'class A {}');
     addSource('$testPackageLibPath/foo_io.dart', 'class A {}');
     addSource('$testPackageLibPath/foo_html.dart', 'class A {}');
@@ -22426,10 +22481,10 @@
   }
 
   test_import_configurations_useFirst_eqTrue() async {
-    declaredVariables = DeclaredVariables.fromMap({
+    declaredVariables = {
       'dart.library.io': 'true',
       'dart.library.html': 'true',
-    });
+    };
     addSource('$testPackageLibPath/foo.dart', 'class A {}');
     addSource('$testPackageLibPath/foo_io.dart', 'class A {}');
     addSource('$testPackageLibPath/foo_html.dart', 'class A {}');
@@ -22457,10 +22512,10 @@
   }
 
   test_import_configurations_useSecond() async {
-    declaredVariables = DeclaredVariables.fromMap({
+    declaredVariables = {
       'dart.library.io': 'false',
       'dart.library.html': 'true',
-    });
+    };
     addSource('$testPackageLibPath/foo.dart', 'class A {}');
     addSource('$testPackageLibPath/foo_io.dart', 'class A {}');
     addSource('$testPackageLibPath/foo_html.dart', 'class A {}');
@@ -22488,10 +22543,10 @@
   }
 
   test_import_configurations_useSecond_eqTrue() async {
-    declaredVariables = DeclaredVariables.fromMap({
+    declaredVariables = {
       'dart.library.io': 'false',
       'dart.library.html': 'true',
-    });
+    };
     addSource('$testPackageLibPath/foo.dart', 'class A {}');
     addSource('$testPackageLibPath/foo_io.dart', 'class A {}');
     addSource('$testPackageLibPath/foo_html.dart', 'class A {}');
@@ -24284,9 +24339,8 @@
   }
 
   test_instanceInference_operator_equal_legacy_from_legacy() async {
-    featureSet = FeatureSets.language_2_9;
     addSource('$testPackageLibPath/legacy.dart', r'''
-// @dart = 2.7
+// @dart = 2.9
 class LegacyDefault {
   bool operator==(other) => false;
 }
@@ -24298,6 +24352,7 @@
 }
 ''');
     var library = await buildLibrary(r'''
+// @dart = 2.9
 import 'legacy.dart';
 class X1 extends LegacyDefault  {
   bool operator==(other) => false;
@@ -24315,37 +24370,37 @@
     package:test/legacy.dart
   definingUnit
     classes
-      class X1 @28
+      class X1 @43
         supertype: LegacyDefault*
         constructors
           synthetic @-1
             superConstructor: package:test/legacy.dart::@class::LegacyDefault::@constructor::•
         methods
-          == @71
+          == @86
             parameters
-              requiredPositional other @74
+              requiredPositional other @89
                 type: dynamic
             returnType: bool*
-      class X2 @99
+      class X2 @114
         supertype: LegacyObject*
         constructors
           synthetic @-1
             superConstructor: package:test/legacy.dart::@class::LegacyObject::@constructor::•
         methods
-          == @140
+          == @155
             parameters
-              requiredPositional other @143
+              requiredPositional other @158
                 type: Object*
             returnType: bool*
-      class X3 @168
+      class X3 @183
         supertype: LegacyInt*
         constructors
           synthetic @-1
             superConstructor: package:test/legacy.dart::@class::LegacyInt::@constructor::•
         methods
-          == @206
+          == @221
             parameters
-              requiredPositional other @209
+              requiredPositional other @224
                 type: int*
             returnType: bool*
 ''');
@@ -24595,8 +24650,8 @@
   }
 
   test_instantiateToBounds_boundRefersToItself_legacy() async {
-    featureSet = FeatureSets.language_2_9;
     var library = await buildLibrary('''
+// @dart = 2.9
 class C<T extends C<T>> {}
 C c;
 var c2 = new C();
@@ -24608,16 +24663,16 @@
 library
   definingUnit
     classes
-      notSimplyBounded class C @6
+      notSimplyBounded class C @21
         typeParameters
-          covariant T @8
+          covariant T @23
             bound: C<T*>*
             defaultType: C<dynamic>*
         constructors
           synthetic @-1
-      class B @56
+      class B @71
         fields
-          c3 @66
+          c3 @81
             type: C<C<dynamic>*>*
         constructors
           synthetic @-1
@@ -24630,9 +24685,9 @@
                 type: C<C<dynamic>*>*
             returnType: void
     topLevelVariables
-      static c @29
+      static c @44
         type: C<C<dynamic>*>*
-      static c2 @36
+      static c2 @51
         type: C<C<dynamic>*>*
     accessors
       synthetic static get c @-1
@@ -25212,7 +25267,7 @@
     <unresolved>
   definingUnit
   parts
-    a3.dart
+    :[invaliduri]
 ''');
   }
 
@@ -30517,8 +30572,8 @@
   }
 
   test_mixin_inference_legacy() async {
-    featureSet = FeatureSets.language_2_9;
     var library = await buildLibrary(r'''
+// @dart = 2.9
 class A<T> {}
 mixin M<U> on A<U> {}
 class B extends A<int> with M {}
@@ -30527,13 +30582,13 @@
 library
   definingUnit
     classes
-      class A @6
+      class A @21
         typeParameters
-          covariant T @8
+          covariant T @23
             defaultType: dynamic
         constructors
           synthetic @-1
-      class B @42
+      class B @57
         supertype: A<int*>*
         mixins
           M<int*>*
@@ -30543,9 +30598,9 @@
               base: self::@class::A::@constructor::•
               substitution: {T: int*}
     mixins
-      mixin M @20
+      mixin M @35
         typeParameters
-          covariant U @22
+          covariant U @37
             defaultType: dynamic
         superclassConstraints
           A<U*>*
@@ -32350,12 +32405,6 @@
       class B @15
         constructors
           synthetic @-1
-  parts
-
-      classes
-        class B @15
-          constructors
-            synthetic @-1
 ''');
   }
 
@@ -33467,13 +33516,15 @@
   }
 
   test_type_never_disableNnbd() async {
-    featureSet = FeatureSets.language_2_9;
-    var library = await buildLibrary('Never d;');
+    var library = await buildLibrary('''
+// @dart = 2.9
+Never d;
+''');
     checkElementText(library, r'''
 library
   definingUnit
     topLevelVariables
-      static d @6
+      static d @21
         type: Null*
     accessors
       synthetic static get d @-1
@@ -33566,8 +33617,8 @@
   }
 
   test_type_param_ref_nullability_star() async {
-    featureSet = FeatureSets.language_2_9;
     var library = await buildLibrary('''
+// @dart = 2.9
 class C<T> {
   T t;
 }
@@ -33576,12 +33627,12 @@
 library
   definingUnit
     classes
-      class C @6
+      class C @21
         typeParameters
-          covariant T @8
+          covariant T @23
             defaultType: dynamic
         fields
-          t @17
+          t @32
             type: T*
         constructors
           synthetic @-1
@@ -35327,24 +35378,25 @@
   }
 
   test_typedef_function_typeParameters_f_bound_simple_legacy() async {
-    featureSet = FeatureSets.language_2_9;
-    var library =
-        await buildLibrary('typedef F<T extends U, U> = U Function(T t);');
+    var library = await buildLibrary('''
+// @dart = 2.9
+typedef F<T extends U, U> = U Function(T t);
+''');
     checkElementText(library, r'''
 library
   definingUnit
     typeAliases
-      notSimplyBounded F @8
+      notSimplyBounded F @23
         typeParameters
-          contravariant T @10
+          contravariant T @25
             bound: U*
             defaultType: Null*
-          covariant U @23
+          covariant U @38
             defaultType: dynamic
         aliasedType: U* Function(T*)*
         aliasedElement: GenericFunctionTypeElement
           parameters
-            requiredPositional t @41
+            requiredPositional t @56
               type: T*
           returnType: U*
 ''');
@@ -35784,23 +35836,25 @@
   }
 
   test_typedef_legacy_typeParameters_f_bound_complex_legacy() async {
-    featureSet = FeatureSets.language_2_9;
-    var library = await buildLibrary('typedef U F<T extends List<U>, U>(T t);');
+    var library = await buildLibrary('''
+// @dart = 2.9
+typedef U F<T extends List<U>, U>(T t);
+''');
     checkElementText(library, r'''
 library
   definingUnit
     typeAliases
-      functionTypeAliasBased notSimplyBounded F @10
+      functionTypeAliasBased notSimplyBounded F @25
         typeParameters
-          contravariant T @12
+          contravariant T @27
             bound: List<U*>*
             defaultType: List<Null*>*
-          covariant U @31
+          covariant U @46
             defaultType: dynamic
         aliasedType: U* Function(T*)*
         aliasedElement: GenericFunctionTypeElement
           parameters
-            requiredPositional t @36
+            requiredPositional t @51
               type: T*
           returnType: U*
 ''');
@@ -35829,23 +35883,25 @@
   }
 
   test_typedef_legacy_typeParameters_f_bound_simple_legacy() async {
-    featureSet = FeatureSets.language_2_9;
-    var library = await buildLibrary('typedef U F<T extends U, U>(T t);');
+    var library = await buildLibrary('''
+// @dart = 2.9
+typedef U F<T extends U, U>(T t);
+''');
     checkElementText(library, r'''
 library
   definingUnit
     typeAliases
-      functionTypeAliasBased notSimplyBounded F @10
+      functionTypeAliasBased notSimplyBounded F @25
         typeParameters
-          contravariant T @12
+          contravariant T @27
             bound: U*
             defaultType: Null*
-          covariant U @25
+          covariant U @40
             defaultType: dynamic
         aliasedType: U* Function(T*)*
         aliasedElement: GenericFunctionTypeElement
           parameters
-            requiredPositional t @30
+            requiredPositional t @45
               type: T*
           returnType: U*
 ''');
@@ -36550,8 +36606,8 @@
   }
 
   test_typedef_nonFunction_using_interface_disabled() async {
-    featureSet = FeatureSets.language_2_12;
     var library = await buildLibrary(r'''
+// @dart = 2.12
 typedef A = int;
 void f(A a) {}
 ''');
@@ -36563,12 +36619,12 @@
 library
   definingUnit
     typeAliases
-      A @8
+      A @24
         aliasedType: dynamic Function()
     functions
-      f @22
+      f @38
         parameters
-          requiredPositional a @26
+          requiredPositional a @42
             type: dynamic Function()
               alias: self::@typeAlias::A
         returnType: void
@@ -38107,20 +38163,4 @@
     var elementFactory = library.linkedData!.elementFactory;
     return elementFactory.elementOfReference(reference)!;
   }
-
-  void _writeTestPackageConfig(PackageConfigFileBuilder config) {
-    config = config.copy();
-
-    config.add(
-      name: 'test',
-      rootPath: testPackageRootPath,
-    );
-
-    newPackageConfigJsonFile(
-      testPackageRootPath,
-      config.toContent(
-        toUriStr: toUriStr,
-      ),
-    );
-  }
 }
diff --git a/pkg/analyzer/test/src/summary/macro_test.dart b/pkg/analyzer/test/src/summary/macro_test.dart
index e883e47..0d65812 100644
--- a/pkg/analyzer/test/src/summary/macro_test.dart
+++ b/pkg/analyzer/test/src/summary/macro_test.dart
@@ -45,9 +45,6 @@
   @override
   bool get keepLinkingLibraries => false;
 
-  /// The path for external packages.
-  String get packagesRootPath => '/packages';
-
   /// Return the code for `DeclarationTextMacro`.
   String get _declarationTextCode {
     var code = MacrosEnvironment.instance.packageAnalyzerFolder
@@ -79,7 +76,8 @@
 
   @override
   Future<void> setUp() async {
-    await super.setUp();
+    super.setUp();
+
     writeTestPackageConfig(
       PackageConfigFileBuilder(),
       macrosEnvironment: MacrosEnvironment.instance,
@@ -92,6 +90,8 @@
 import 'package:_fe_analyzer_shared/src/macros/api.dart';
 
 macro class MyMacro implements ClassTypesMacro {
+  const MyMacro();
+
   FutureOr<void> buildTypesForClass(clazz, builder) {
     builder.declareType(
       'MyClass',
@@ -135,7 +135,7 @@
   parts
     package:test/_macro_types.dart
       classes
-        class MyClass @6
+        class MyClass @-1
           constructors
             synthetic @-1
   exportScope
@@ -196,7 +196,7 @@
   parts
     package:test/_macro_types.dart
       classes
-        class MyClass @6
+        class MyClass @-1
           constructors
             synthetic @-1
   exportScope
@@ -212,6 +212,8 @@
 import 'package:_fe_analyzer_shared/src/macros/api.dart';
 
 macro class MyMacro implements ClassTypesMacro {
+  const MyMacro();
+
   FutureOr<void> buildTypesForClass(clazz, builder) {
     builder.declareType(
       'MyClass',
@@ -263,7 +265,7 @@
   parts
     package:test/_macro_types.dart
       classes
-        class MyClass @6
+        class MyClass @-1
           constructors
             synthetic @-1
   exportScope
@@ -332,7 +334,7 @@
   parts
     package:test/_macro_types.dart
       classes
-        class MyClass @6
+        class MyClass @-1
           constructors
             synthetic @-1
   exportScope
@@ -348,6 +350,8 @@
 import 'package:_fe_analyzer_shared/src/macros/api.dart';
 
 macro class MyMacro implements ClassTypesMacro {
+  const MyMacro();
+
   FutureOr<void> buildTypesForClass(clazz, builder) {
     builder.declareType(
       'MyClass',
@@ -392,7 +396,7 @@
   parts
     package:test/_macro_types.dart
       classes
-        class MyClass @6
+        class MyClass @-1
           constructors
             synthetic @-1
   exportScope
@@ -462,7 +466,7 @@
   parts
     package:test/_macro_types.dart
       classes
-        class MyClass @6
+        class MyClass @-1
           constructors
             synthetic @-1
   exportScope
@@ -477,6 +481,8 @@
 import 'package:_fe_analyzer_shared/src/macros/api.dart';
 
 macro class MyMacro implements ClassTypesMacro {
+  const MyMacro();
+
   buildTypesForClass(clazz, builder) {
     builder.declareType(
       'MyClass',
@@ -529,7 +535,7 @@
   parts
     package:test/_macro_types.dart
       classes
-        class MyClass @6
+        class MyClass @-1
           constructors
             synthetic @-1
   exportScope
@@ -603,7 +609,7 @@
   parts
     package:test/_macro_types.dart
       classes
-        class MyClass @6
+        class MyClass @-1
           constructors
             synthetic @-1
   exportScope
@@ -1612,6 +1618,8 @@
 import 'package:_fe_analyzer_shared/src/macros/api.dart';
 
 macro class MyMacro implements ClassTypesMacro {
+  const MyMacro();
+
   buildTypesForClass(clazz, builder) {
     unresolved;
   }
@@ -1642,6 +1650,8 @@
 import 'package:_fe_analyzer_shared/src/macros/api.dart';
 
 macro class MyMacro implements ClassTypesMacro {
+  const MyMacro();
+
   buildTypesForClass(clazz, builder) {
     throw 'foo bar';
   }
@@ -1710,34 +1720,6 @@
 ''');
   }
 
-  void writeTestPackageConfig(
-    PackageConfigFileBuilder config, {
-    MacrosEnvironment? macrosEnvironment,
-  }) {
-    config = config.copy();
-
-    config.add(
-      name: 'test',
-      rootPath: testPackageRootPath,
-    );
-
-    if (macrosEnvironment != null) {
-      var packagesRootFolder = getFolder(packagesRootPath);
-      macrosEnvironment.packageSharedFolder.copyTo(packagesRootFolder);
-      config.add(
-        name: '_fe_analyzer_shared',
-        rootPath: getFolder('$packagesRootPath/_fe_analyzer_shared').path,
-      );
-    }
-
-    newPackageConfigJsonFile(
-      testPackageRootPath,
-      config.toContent(
-        toUriStr: toUriStr,
-      ),
-    );
-  }
-
   /// Assert that the textual dump of the introspection information for
   /// annotated declarations is the same as [expected].
   Future<void> _assertIntrospectDeclarationsText(
diff --git a/pkg/analyzer/test/src/summary/resolved_ast_printer.dart b/pkg/analyzer/test/src/summary/resolved_ast_printer.dart
index 638d321..39f28cb 100644
--- a/pkg/analyzer/test/src/summary/resolved_ast_printer.dart
+++ b/pkg/analyzer/test/src/summary/resolved_ast_printer.dart
@@ -29,6 +29,9 @@
   /// TODO(scheglov) Remove after https://github.com/dart-lang/sdk/issues/48380
   final bool withCheckingLinking;
 
+  /// If `true`, [Expression.staticParameterElement] should be printed.
+  final bool withParameterElements;
+
   /// If `true`, selected tokens and nodes should be printed with offsets.
   final bool _withOffsets;
 
@@ -43,6 +46,7 @@
     required String indent,
     this.skipArgumentList = false,
     this.withCheckingLinking = false,
+    this.withParameterElements = true,
     bool withOffsets = false,
     bool withResolution = true,
   })  : _selfUriStr = selfUriStr,
@@ -56,6 +60,7 @@
     _writeln('AdjacentStrings');
     _withIndent(() {
       _writeNamedChildEntities(node);
+      _writeParameterElement(node);
       _writeType('staticType', node.staticType);
       _writeRaw('stringValue', node.stringValue);
     });
@@ -83,6 +88,7 @@
     _writeln('AsExpression');
     _withIndent(() {
       _writeNamedChildEntities(node);
+      _writeParameterElement(node);
       _writeType('staticType', node.staticType);
     });
   }
@@ -108,6 +114,7 @@
     _writeln('AssignmentExpression');
     _withIndent(() {
       _writeNamedChildEntities(node);
+      _writeParameterElement(node);
       _writeElement('readElement', node.readElement);
       _writeType('readType', node.readType);
       _writeElement('writeElement', node.writeElement);
@@ -122,6 +129,7 @@
     _writeln('AwaitExpression');
     _withIndent(() {
       _writeNamedChildEntities(node);
+      _writeParameterElement(node);
       _writeType('staticType', node.staticType);
     });
   }
@@ -131,6 +139,7 @@
     _writeln('BinaryExpression');
     _withIndent(() {
       _writeNamedChildEntities(node);
+      _writeParameterElement(node);
       _writeElement('staticElement', node.staticElement);
       _writeType('staticInvokeType', node.staticInvokeType);
       _writeType('staticType', node.staticType);
@@ -158,6 +167,7 @@
     _writeln('BooleanLiteral');
     _withIndent(() {
       _writeNamedChildEntities(node);
+      _writeParameterElement(node);
       _writeType('staticType', node.staticType);
     });
   }
@@ -175,6 +185,7 @@
     _writeln('CascadeExpression');
     _withIndent(() {
       _writeNamedChildEntities(node);
+      _writeParameterElement(node);
       _writeType('staticType', node.staticType);
     });
   }
@@ -238,6 +249,7 @@
     _writeln('ConditionalExpression');
     _withIndent(() {
       _writeNamedChildEntities(node);
+      _writeParameterElement(node);
       _writeType('staticType', node.staticType);
     });
   }
@@ -275,6 +287,7 @@
     _writeln('ConstructorReference');
     _withIndent(() {
       _writeNamedChildEntities(node);
+      _writeParameterElement(node);
       _writeType('staticType', node.staticType);
     });
   }
@@ -332,6 +345,7 @@
     _writeln('DoubleLiteral');
     _withIndent(() {
       _writeNamedChildEntities(node);
+      _writeParameterElement(node);
       _writeType('staticType', node.staticType);
     });
   }
@@ -526,6 +540,7 @@
       if (_withResolution) {
         _writeElement('declaredElement', node.declaredElement);
       }
+      _writeParameterElement(node);
       _writeType('staticType', node.staticType);
     });
   }
@@ -547,6 +562,7 @@
     _writeln('FunctionReference');
     _withIndent(() {
       _writeNamedChildEntities(node);
+      _writeParameterElement(node);
       _writeType('staticType', node.staticType);
       _writeTypeList('typeArgumentTypes', node.typeArgumentTypes);
     });
@@ -638,6 +654,7 @@
     _writeln('ImplicitCallReference');
     _withIndent(() {
       _writeNamedChildEntities(node);
+      _writeParameterElement(node);
       _writeElement('staticElement', node.staticElement);
       _writeType('staticType', node.staticType);
       _writeTypeList('typeArgumentTypes', node.typeArgumentTypes);
@@ -663,6 +680,7 @@
     _writeln('IndexExpression');
     _withIndent(() {
       _writeNamedChildEntities(node);
+      _writeParameterElement(node);
       _writeElement('staticElement', node.staticElement);
       _writeType('staticType', node.staticType);
     });
@@ -673,6 +691,7 @@
     _writeln('InstanceCreationExpression');
     _withIndent(() {
       _writeNamedChildEntities(node);
+      _writeParameterElement(node);
       _writeType('staticType', node.staticType);
     });
   }
@@ -682,6 +701,7 @@
     _writeln('IntegerLiteral');
     _withIndent(() {
       _writeNamedChildEntities(node);
+      _writeParameterElement(node);
       _writeType('staticType', node.staticType);
     });
   }
@@ -707,6 +727,7 @@
     _writeln('IsExpression');
     _withIndent(() {
       _writeNamedChildEntities(node);
+      _writeParameterElement(node);
       _writeType('staticType', node.staticType);
     });
   }
@@ -756,6 +777,7 @@
     _writeln('ListLiteral');
     _withIndent(() {
       _writeNamedChildEntities(node);
+      _writeParameterElement(node);
       _writeType('staticType', node.staticType);
     });
   }
@@ -785,6 +807,7 @@
     _writeln('MethodInvocation');
     _withIndent(() {
       _writeNamedChildEntities(node);
+      _writeParameterElement(node);
       _writeType('staticInvokeType', node.staticInvokeType);
       _writeType('staticType', node.staticType);
       _writeTypeList('typeArgumentTypes', node.typeArgumentTypes);
@@ -824,6 +847,7 @@
     _writeln('NullLiteral');
     _withIndent(() {
       _writeNamedChildEntities(node);
+      _writeParameterElement(node);
       _writeType('staticType', node.staticType);
     });
   }
@@ -841,6 +865,7 @@
     _writeln('ParenthesizedExpression');
     _withIndent(() {
       _writeNamedChildEntities(node);
+      _writeParameterElement(node);
       _writeType('staticType', node.staticType);
     });
   }
@@ -871,6 +896,7 @@
     _writeln('PostfixExpression');
     _withIndent(() {
       _writeNamedChildEntities(node);
+      _writeParameterElement(node);
       if (node.operator.type.isIncrementOperator) {
         _writeElement('readElement', node.readElement);
         _writeType('readType', node.readType);
@@ -887,6 +913,7 @@
     _writeln('PrefixedIdentifier');
     _withIndent(() {
       _writeNamedChildEntities(node);
+      _writeParameterElement(node);
       _writeElement('staticElement', node.staticElement);
       _writeType('staticType', node.staticType);
     });
@@ -897,6 +924,7 @@
     _writeln('PrefixExpression');
     _withIndent(() {
       _writeNamedChildEntities(node);
+      _writeParameterElement(node);
       if (node.operator.type.isIncrementOperator) {
         _writeElement('readElement', node.readElement);
         _writeType('readType', node.readType);
@@ -913,6 +941,7 @@
     _writeln('PropertyAccess');
     _withIndent(() {
       _writeNamedChildEntities(node);
+      _writeParameterElement(node);
       _writeType('staticType', node.staticType);
     });
   }
@@ -942,6 +971,7 @@
     _withIndent(() {
       _writeNamedChildEntities(node);
       _writeRaw('isMap', node.isMap);
+      _writeParameterElement(node);
       _writeType('staticType', node.staticType);
     });
   }
@@ -971,6 +1001,7 @@
     _writeln('SimpleIdentifier');
     _withIndent(() {
       _writeNamedChildEntities(node);
+      _writeParameterElement(node);
       _writeElement('staticElement', node.staticElement);
       _writeType('staticType', node.staticType);
       _writeTypeList(
@@ -1001,6 +1032,7 @@
     _writeln('StringInterpolation');
     _withIndent(() {
       _writeNamedChildEntities(node);
+      _writeParameterElement(node);
       _writeType('staticType', node.staticType);
       _writeRaw('stringValue', node.stringValue);
     });
@@ -1068,6 +1100,7 @@
     _writeln('SymbolLiteral');
     _withIndent(() {
       _writeNamedChildEntities(node);
+      _writeParameterElement(node);
     });
   }
 
@@ -1076,6 +1109,7 @@
     _writeln('ThisExpression');
     _withIndent(() {
       _writeNamedChildEntities(node);
+      _writeParameterElement(node);
       _writeType('staticType', node.staticType);
     });
   }
@@ -1085,6 +1119,7 @@
     _writeln('ThrowExpression');
     _withIndent(() {
       _writeNamedChildEntities(node);
+      _writeParameterElement(node);
       _writeType('staticType', node.staticType);
     });
   }
@@ -1121,6 +1156,7 @@
     _writeln('TypeLiteral');
     _withIndent(() {
       _writeNamedChildEntities(node);
+      _writeParameterElement(node);
       _writeType('staticType', node.staticType);
     });
   }
@@ -1417,6 +1453,21 @@
     _writelnWithIndent('$name: $offset');
   }
 
+  /// If [node] is at a position where it is an argument for an invocation,
+  /// writes the corresponding parameter element.
+  void _writeParameterElement(Expression node) {
+    if (withParameterElements) {
+      final parent = node.parent;
+      if (parent is ArgumentList ||
+          parent is AssignmentExpression && parent.rightHandSide == node ||
+          parent is BinaryExpression && parent.rightOperand == node ||
+          parent is IndexExpression && parent.index == node ||
+          parent is NamedExpression && parent.expression == node) {
+        _writeElement('parameter', node.staticParameterElement);
+      }
+    }
+  }
+
   void _writeParameterElements(List<ParameterElement> parameters) {
     _writelnWithIndent('parameters');
     _withIndent(() {
diff --git a/pkg/analyzer_cli/pubspec.yaml b/pkg/analyzer_cli/pubspec.yaml
index 6007114..2eb61ca 100644
--- a/pkg/analyzer_cli/pubspec.yaml
+++ b/pkg/analyzer_cli/pubspec.yaml
@@ -7,6 +7,7 @@
 environment:
   sdk: "^2.14.0"
 
+# Use 'any' constraints here; we get our versions from the DEPS file.
 dependencies:
   analyzer: any
   args: any
@@ -16,6 +17,7 @@
   pub_semver: any
   yaml: any
 
+# Use 'any' constraints here; we get our versions from the DEPS file.
 dev_dependencies:
   lints: any
   test_reflective_loader: any
diff --git a/pkg/analyzer_plugin/doc/api.html b/pkg/analyzer_plugin/doc/api.html
index 442a175..859796d 100644
--- a/pkg/analyzer_plugin/doc/api.html
+++ b/pkg/analyzer_plugin/doc/api.html
@@ -2003,6 +2003,12 @@
           The position that should be selected after the edits have been
           applied.
         </p>
+      </dd><dt class="field"><b>selectionLength: int<span style="color:#999999"> (optional)</span></b></dt><dd>
+        
+        <p>
+          The length of the selection (starting at Position) that should be selected after
+          the edits have been applied.
+        </p>
       </dd><dt class="field"><b>id: String<span style="color:#999999"> (optional)</span></b></dt><dd>
         
         <p>
diff --git a/pkg/analyzer_plugin/lib/protocol/protocol_common.dart b/pkg/analyzer_plugin/lib/protocol/protocol_common.dart
index 2192ee4..80f2449 100644
--- a/pkg/analyzer_plugin/lib/protocol/protocol_common.dart
+++ b/pkg/analyzer_plugin/lib/protocol/protocol_common.dart
@@ -4276,6 +4276,7 @@
 ///   "edits": List<SourceFileEdit>
 ///   "linkedEditGroups": List<LinkedEditGroup>
 ///   "selection": optional Position
+///   "selectionLength": optional int
 ///   "id": optional String
 /// }
 ///
@@ -4294,6 +4295,10 @@
   /// The position that should be selected after the edits have been applied.
   Position? selection;
 
+  /// The length of the selection (starting at Position) that should be
+  /// selected after the edits have been applied.
+  int? selectionLength;
+
   /// The optional identifier of the change kind. The identifier remains stable
   /// even if the message changes, or is parameterized.
   String? id;
@@ -4302,6 +4307,7 @@
       {List<SourceFileEdit>? edits,
       List<LinkedEditGroup>? linkedEditGroups,
       this.selection,
+      this.selectionLength,
       this.id})
       : edits = edits ?? <SourceFileEdit>[],
         linkedEditGroups = linkedEditGroups ?? <LinkedEditGroup>[];
@@ -4342,6 +4348,11 @@
         selection = Position.fromJson(
             jsonDecoder, jsonPath + '.selection', json['selection']);
       }
+      int? selectionLength;
+      if (json.containsKey('selectionLength')) {
+        selectionLength = jsonDecoder.decodeInt(
+            jsonPath + '.selectionLength', json['selectionLength']);
+      }
       String? id;
       if (json.containsKey('id')) {
         id = jsonDecoder.decodeString(jsonPath + '.id', json['id']);
@@ -4350,6 +4361,7 @@
           edits: edits,
           linkedEditGroups: linkedEditGroups,
           selection: selection,
+          selectionLength: selectionLength,
           id: id);
     } else {
       throw jsonDecoder.mismatch(jsonPath, 'SourceChange', json);
@@ -4369,6 +4381,10 @@
     if (selection != null) {
       result['selection'] = selection.toJson();
     }
+    var selectionLength = this.selectionLength;
+    if (selectionLength != null) {
+      result['selectionLength'] = selectionLength;
+    }
     var id = this.id;
     if (id != null) {
       result['id'] = id;
@@ -4411,6 +4427,7 @@
           listEqual(linkedEditGroups, other.linkedEditGroups,
               (LinkedEditGroup a, LinkedEditGroup b) => a == b) &&
           selection == other.selection &&
+          selectionLength == other.selectionLength &&
           id == other.id;
     }
     return false;
@@ -4422,6 +4439,7 @@
         edits,
         linkedEditGroups,
         selection,
+        selectionLength,
         id,
       );
 }
diff --git a/pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_core.dart b/pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_core.dart
index dca43e9..0f6f1db 100644
--- a/pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_core.dart
+++ b/pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_core.dart
@@ -109,6 +109,10 @@
     var selection = _selection;
     if (selection != null) {
       change.selection = selection;
+      var selectionRange = _selectionRange;
+      if (selectionRange != null) {
+        change.selectionLength = selectionRange.length;
+      }
     }
     return change;
   }
diff --git a/pkg/analyzer_plugin/lib/utilities/navigation/navigation_dart.dart b/pkg/analyzer_plugin/lib/utilities/navigation/navigation_dart.dart
index 38053a2..38b8304 100644
--- a/pkg/analyzer_plugin/lib/utilities/navigation/navigation_dart.dart
+++ b/pkg/analyzer_plugin/lib/utilities/navigation/navigation_dart.dart
@@ -386,7 +386,7 @@
 
   @override
   void visitPartOfDirective(PartOfDirective node) {
-    computer._addRegionForNode(node.libraryName, node.element);
+    computer._addRegionForNode(node.libraryName ?? node.uri, node.element);
     super.visitPartOfDirective(node);
   }
 
diff --git a/pkg/analyzer_plugin/pubspec.yaml b/pkg/analyzer_plugin/pubspec.yaml
index 946fd7e..0115b6f 100644
--- a/pkg/analyzer_plugin/pubspec.yaml
+++ b/pkg/analyzer_plugin/pubspec.yaml
@@ -13,10 +13,13 @@
   pub_semver: ^2.0.0
   yaml: ^3.1.0
 
+# We use 'any' version constraints here as we get our package versions from
+# the dart-lang/sdk repo's DEPS file. Note that this is a special case; the
+# best practice for packages is to specify their compatible version ranges.
+# See also https://dart.dev/tools/pub/dependencies.
 dev_dependencies:
-  analyzer_utilities:
-    path: ../analyzer_utilities
-  html: ^0.15.0
-  path: ^1.8.0
-  test_reflective_loader: ^0.2.0
-  test: ^1.16.6
+  analyzer_utilities: any
+  html: any
+  path: any
+  test_reflective_loader: any
+  test: any
diff --git a/pkg/analyzer_plugin/test/integration/support/protocol_matchers.dart b/pkg/analyzer_plugin/test/integration/support/protocol_matchers.dart
index 04226f7..1e5770b 100644
--- a/pkg/analyzer_plugin/test/integration/support/protocol_matchers.dart
+++ b/pkg/analyzer_plugin/test/integration/support/protocol_matchers.dart
@@ -867,6 +867,7 @@
 ///   "edits": List<SourceFileEdit>
 ///   "linkedEditGroups": List<LinkedEditGroup>
 ///   "selection": optional Position
+///   "selectionLength": optional int
 ///   "id": optional String
 /// }
 final Matcher isSourceChange =
@@ -876,6 +877,7 @@
           'linkedEditGroups': isListOf(isLinkedEditGroup)
         }, optionalFields: {
           'selection': isPosition,
+          'selectionLength': isInt,
           'id': isString
         }));
 
diff --git a/pkg/analyzer_plugin/tool/spec/common_types_spec.html b/pkg/analyzer_plugin/tool/spec/common_types_spec.html
index ca100b9..96bdae9 100644
--- a/pkg/analyzer_plugin/tool/spec/common_types_spec.html
+++ b/pkg/analyzer_plugin/tool/spec/common_types_spec.html
@@ -6,7 +6,7 @@
 </head>
 <body>
 <h1>Common Types</h1>
-<version>1.4.4</version>
+<version>1.4.5</version>
 <p>
   This document contains a specification of the types that are common between
   the analysis server wire protocol and the analysis server plugin wire
@@ -1566,6 +1566,13 @@
           applied.
         </p>
       </field>
+      <field name="selectionLength" optional="true">
+        <ref>int</ref>
+        <p>
+          The length of the selection (starting at Position) that should be selected after
+          the edits have been applied.
+        </p>
+      </field>
       <field name="id" optional="true">
         <ref>String</ref>
         <p>
diff --git a/pkg/analyzer_utilities/pubspec.yaml b/pkg/analyzer_utilities/pubspec.yaml
index e974be1..a7c634c 100644
--- a/pkg/analyzer_utilities/pubspec.yaml
+++ b/pkg/analyzer_utilities/pubspec.yaml
@@ -5,6 +5,7 @@
 environment:
   sdk: '>=2.12.0 <3.0.0'
 
+# Use 'any' constraints here; we get our versions from the DEPS file.
 dependencies:
   analyzer: any
   html: any
@@ -12,5 +13,6 @@
   path: any
   test: any
 
+# Use 'any' constraints here; we get our versions from the DEPS file.
 dev_dependencies:
   lints: any
diff --git a/pkg/async_helper/pubspec.yaml b/pkg/async_helper/pubspec.yaml
index 55bc80d..dc909f9 100644
--- a/pkg/async_helper/pubspec.yaml
+++ b/pkg/async_helper/pubspec.yaml
@@ -3,14 +3,14 @@
 publish_to: none
 
 description: >-
- Async_helper is used for asynchronous tests that do not want to
- make use of the Dart unittest library - for example, the core
- language tests.
- Third parties are discouraged from using this, and should use
- the facilities provided in package:test.
+ Async_helper is used for asynchronous tests that do not want to make use of
+ the Dart unittest library - for example, the core language tests. Third
+ parties are discouraged from using this, and should use the facilities
+ provided in package:test.
 
 environment:
   sdk: '>=2.12.0 <3.0.0'
 
+# Use 'any' constraints here; we get our versions from the DEPS file.
 dependencies:
   expect: any
diff --git a/pkg/build_integration/pubspec.yaml b/pkg/build_integration/pubspec.yaml
index 2286f3e..fbb8715 100644
--- a/pkg/build_integration/pubspec.yaml
+++ b/pkg/build_integration/pubspec.yaml
@@ -8,8 +8,10 @@
 environment:
   sdk: '>=2.12.0 <3.0.0'
 
+# Use 'any' constraints here; we get our versions from the DEPS file.
 dependencies:
   front_end: any
 
+# Use 'any' constraints here; we get our versions from the DEPS file.
 dev_dependencies:
   test: any
diff --git a/pkg/compiler/lib/src/common/ram_usage.dart b/pkg/compiler/lib/src/common/ram_usage.dart
index 76c5c2d..ade3c7b 100644
--- a/pkg/compiler/lib/src/common/ram_usage.dart
+++ b/pkg/compiler/lib/src/common/ram_usage.dart
@@ -18,10 +18,11 @@
 import 'dart:developer';
 import 'package:vm_service/vm_service_io.dart' as vm_service_io;
 
-Future<int> _currentHeapCapacity() async {
+Future<int?> _currentHeapCapacity() async {
   final info =
       await Service.controlWebServer(enable: true, silenceOutput: true);
-  final observatoryUri = info.serverUri!;
+  final observatoryUri = info.serverUri;
+  if (observatoryUri == null) return null;
   final wsUri = 'ws://${observatoryUri.authority}${observatoryUri.path}ws';
   final vmService = await vm_service_io.vmServiceConnectUri(wsUri);
   int sum = 0;
@@ -35,5 +36,6 @@
 
 Future<String> currentHeapCapacityInMb() async {
   final capacity = await _currentHeapCapacity();
+  if (capacity == null) return "N/A MB";
   return "${(capacity / (1024 * 1024)).toStringAsFixed(3)} MB";
 }
diff --git a/pkg/compiler/lib/src/common/tasks.dart b/pkg/compiler/lib/src/common/tasks.dart
index 52f6a99..19b6749 100644
--- a/pkg/compiler/lib/src/common/tasks.dart
+++ b/pkg/compiler/lib/src/common/tasks.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.
 
-// @dart = 2.10
-
 library dart2js.common.tasks;
 
 import 'dart:async'
@@ -19,15 +17,15 @@
 // TODO(sigmund): rename to MeasurableTask
 abstract class CompilerTask {
   final Measurer _measurer;
-  final Stopwatch _watch;
+  final Stopwatch? _watch;
   final Map<String, GenericTask> _subtasks = {};
 
   int _asyncCount = 0;
 
   // Each task has a fixed, lazily computed, ZoneSpecification and zoneValues
   // for [_measureZoned].
-  ZoneSpecification _zoneSpecification;
-  Map _zoneValues;
+  ZoneSpecification? _zoneSpecification;
+  Map? _zoneValues;
 
   CompilerTask(this._measurer)
       : _watch = _measurer.enableTaskMeasurements ? Stopwatch() : null;
@@ -46,7 +44,7 @@
 
   int get timing {
     if (_isDisabled) return 0;
-    int total = _watch.elapsedMilliseconds;
+    int total = _watch!.elapsedMilliseconds;
     for (GenericTask subtask in _subtasks.values) {
       total += subtask.timing;
     }
@@ -55,7 +53,7 @@
 
   Duration get duration {
     if (_isDisabled) return Duration.zero;
-    Duration total = _watch.elapsed;
+    Duration total = _watch!.elapsed;
     for (GenericTask subtask in _subtasks.values) {
       total += subtask.duration;
     }
@@ -69,25 +67,25 @@
 
   /// Helper method that starts measuring with this [CompilerTask], that is,
   /// make this task the currently measured task.
-  CompilerTask _start() {
+  CompilerTask? _start() {
     if (_isDisabled) return null;
-    CompilerTask previous = _measurer._currentTask;
+    CompilerTask? previous = _measurer._currentTask;
     _measurer._currentTask = this;
-    if (previous != null) previous._watch.stop();
+    if (previous != null) previous._watch!.stop();
     // Regardless of whether [previous] is `null` we've returned from the
     // eventloop.
     _measurer.stopAsyncWallClock();
-    _watch.start();
+    _watch!.start();
     return previous;
   }
 
   /// Helper method that stops measuring with this [CompilerTask], that is,
   /// make [previous] the currently measured task.
-  void _stop(CompilerTask previous) {
+  void _stop(CompilerTask? previous) {
     if (_isDisabled) return;
-    _watch.stop();
+    _watch!.stop();
     if (previous != null) {
-      previous._watch.start();
+      previous._watch!.start();
     } else {
       // If there's no previous task, we're about to return control to the
       // event loop. Start counting that as waiting asynchronous I/O.
@@ -122,7 +120,7 @@
   /// we should measure or not when delegating.
   R _run<R>(Zone self, ZoneDelegate parent, Zone zone, R f()) {
     if (zone[_measurer] != this) return parent.run(zone, f);
-    CompilerTask previous = _start();
+    CompilerTask? previous = _start();
     try {
       return parent.run(zone, f);
     } finally {
@@ -134,7 +132,7 @@
   R _runUnary<R, T>(
       Zone self, ZoneDelegate parent, Zone zone, R f(T arg), T arg) {
     if (zone[_measurer] != this) return parent.runUnary(zone, f, arg);
-    CompilerTask previous = _start();
+    CompilerTask? previous = _start();
     try {
       return parent.runUnary(zone, f, arg);
     } finally {
@@ -146,7 +144,7 @@
   R _runBinary<R, T1, T2>(Zone self, ZoneDelegate parent, Zone zone,
       R f(T1 a1, T2 a2), T1 a1, T2 a2) {
     if (zone[_measurer] != this) return parent.runBinary(zone, f, a1, a2);
-    CompilerTask previous = _start();
+    CompilerTask? previous = _start();
     try {
       return parent.runBinary(zone, f, a1, a2);
     } finally {
@@ -168,7 +166,7 @@
       _measurer._currentAsyncTask = this;
     } else if (_measurer._currentAsyncTask != this) {
       throw "Cannot track async task '$name' because"
-          " '${_measurer._currentAsyncTask.name}' is already being tracked.";
+          " '${_measurer._currentAsyncTask?.name}' is already being tracked.";
     }
     _asyncCount++;
     return measure(action).whenComplete(() {
@@ -208,9 +206,9 @@
 
   Iterable<String> get subtasks => _subtasks.keys;
 
-  int getSubtaskTime(String subtask) => _subtasks[subtask].timing;
+  int getSubtaskTime(String subtask) => _subtasks[subtask]!.timing;
 
-  bool getSubtaskIsRunning(String subtask) => _subtasks[subtask].isRunning;
+  bool getSubtaskIsRunning(String subtask) => _subtasks[subtask]!.isRunning;
 
   /// Returns the metrics for this task.
   Metrics get metrics => Metrics.none();
@@ -247,10 +245,10 @@
 
   /// The currently running task, that is, the task whose [Stopwatch] is
   /// currently running.
-  CompilerTask _currentTask;
+  CompilerTask? _currentTask;
 
   /// The current task which should be charged for asynchronous gaps.
-  CompilerTask _currentAsyncTask;
+  CompilerTask? _currentAsyncTask;
 
   /// Start counting the total elapsed time since the compiler started.
   void startWallClock() {
@@ -265,7 +263,7 @@
   /// Call this before returning to the eventloop.
   void startAsyncWallClock() {
     if (_currentAsyncTask != null) {
-      _currentAsyncTask._watch.start();
+      _currentAsyncTask!._watch?.start();
     } else {
       _asyncWallClock.start();
     }
@@ -274,7 +272,7 @@
   /// Call this when the eventloop returns control to us.
   void stopAsyncWallClock() {
     if (_currentAsyncTask != null) {
-      _currentAsyncTask._watch.stop();
+      _currentAsyncTask!._watch?.stop();
     }
     _asyncWallClock.stop();
   }
diff --git a/pkg/compiler/lib/src/constants/values.dart b/pkg/compiler/lib/src/constants/values.dart
index 07fc1d5..4018c93 100644
--- a/pkg/compiler/lib/src/constants/values.dart
+++ b/pkg/compiler/lib/src/constants/values.dart
@@ -1041,7 +1041,7 @@
   DeferredGlobalConstantValue(this.referenced, this.unit);
 
   final ConstantValue referenced;
-  final OutputUnit? unit;
+  final OutputUnit unit;
 
   bool get isReference => true;
 
diff --git a/pkg/compiler/lib/src/deferred_load/entity_data.dart b/pkg/compiler/lib/src/deferred_load/entity_data.dart
index 0751f58..bfb81f2 100644
--- a/pkg/compiler/lib/src/deferred_load/entity_data.dart
+++ b/pkg/compiler/lib/src/deferred_load/entity_data.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.
 
-// @dart = 2.10
-
 import '../constants/values.dart' show ConstantValue;
 import '../elements/entities.dart';
 
diff --git a/pkg/compiler/lib/src/io/source_map_builder.dart b/pkg/compiler/lib/src/io/source_map_builder.dart
index fd0a930..2fc0f46 100644
--- a/pkg/compiler/lib/src/io/source_map_builder.dart
+++ b/pkg/compiler/lib/src/io/source_map_builder.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.
 
-// @dart = 2.10
-
 library dart2js.source_map_builder;
 
 import 'package:front_end/src/api_unstable/dart2js.dart' as fe;
@@ -19,10 +17,10 @@
   final String version;
 
   /// The URI of the source map file.
-  final Uri sourceMapUri;
+  final Uri? sourceMapUri;
 
   /// The URI of the target language file.
-  final Uri targetFileUri;
+  final Uri? targetFileUri;
 
   final LocationProvider locationProvider;
   final List<SourceMapEntry> entries = [];
@@ -70,12 +68,12 @@
       int column = kernelLocation.column - 1;
       lineColumnMap.add(line, column, sourceMapEntry);
 
-      SourceLocation location = sourceMapEntry.sourceLocation;
+      SourceLocation? location = sourceMapEntry.sourceLocation;
       if (location != null) {
         if (location.sourceUri != null) {
           LineColumnMap<SourceMapEntry> sourceLineColumnMap =
               sourceLocationMap.putIfAbsent(
-                  location.sourceUri, () => LineColumnMap<SourceMapEntry>());
+                  location.sourceUri!, () => LineColumnMap<SourceMapEntry>());
           sourceLineColumnMap.add(
               location.line - 1, location.column - 1, sourceMapEntry);
         }
@@ -89,12 +87,12 @@
     IndexMap<Uri> uriMap = IndexMap<Uri>();
     IndexMap<String> nameMap = IndexMap<String>();
 
-    void registerLocation(SourceLocation sourceLocation) {
+    void registerLocation(SourceLocation? sourceLocation) {
       if (sourceLocation != null) {
         if (sourceLocation.sourceUri != null) {
-          uriMap.register(sourceLocation.sourceUri);
+          uriMap.register(sourceLocation.sourceUri!);
           if (sourceLocation.sourceName != null) {
-            nameMap.register(sourceLocation.sourceName);
+            nameMap.register(sourceLocation.sourceName!);
           }
         }
       }
@@ -110,7 +108,7 @@
       for (var frame in entries) {
         registerLocation(frame.pushLocation);
         if (frame.inlinedMethodName != null) {
-          nameMap.register(frame.inlinedMethodName);
+          nameMap.register(frame.inlinedMethodName!);
         }
       }
     }
@@ -124,14 +122,14 @@
     buffer.write('  "engine": "$version",\n');
     if (sourceMapUri != null && targetFileUri != null) {
       buffer.write('  "file": '
-          '"${fe.relativizeUri(sourceMapUri, targetFileUri, false)}",\n');
+          '"${fe.relativizeUri(sourceMapUri!, targetFileUri!, false)}",\n');
     }
     buffer.write('  "sourceRoot": "",\n');
     buffer.write('  "sources": ');
     Iterable<String> relativeSourceUriList = const <String>[];
     if (sourceMapUri != null) {
       relativeSourceUriList =
-          uriMap.elements.map((u) => fe.relativizeUri(sourceMapUri, u, false));
+          uriMap.elements.map((u) => fe.relativizeUri(sourceMapUri!, u, false));
     }
     printStringListOn(relativeSourceUriList, buffer);
     buffer.write(',\n');
@@ -157,7 +155,7 @@
 
   void writeEntries(LineColumnMap<SourceMapEntry> entries, IndexMap<Uri> uriMap,
       IndexMap<String> nameMap, StringBuffer output) {
-    SourceLocation previousSourceLocation;
+    SourceLocation? previousSourceLocation;
     int previousTargetLine = 0;
     DeltaEncoder targetColumnEncoder = DeltaEncoder();
     bool firstEntryInLine = true;
@@ -167,7 +165,7 @@
     DeltaEncoder sourceNameIndexEncoder = DeltaEncoder();
 
     entries.forEach((int targetLine, int targetColumn, SourceMapEntry entry) {
-      SourceLocation sourceLocation = entry.sourceLocation;
+      SourceLocation? sourceLocation = entry.sourceLocation;
       if (sourceLocation == previousSourceLocation) {
         return;
       }
@@ -193,16 +191,16 @@
         return;
       }
 
-      Uri sourceUri = sourceLocation.sourceUri;
+      Uri? sourceUri = sourceLocation.sourceUri;
       if (sourceUri != null) {
-        sourceUriIndexEncoder.encode(output, uriMap[sourceUri]);
+        sourceUriIndexEncoder.encode(output, uriMap[sourceUri]!);
         sourceLineEncoder.encode(output, sourceLocation.line - 1);
         sourceColumnEncoder.encode(output, sourceLocation.column - 1);
       }
 
-      String sourceName = sourceLocation.sourceName;
+      String? sourceName = sourceLocation.sourceName;
       if (sourceName != null) {
-        sourceNameIndexEncoder.encode(output, nameMap[sourceName]);
+        sourceNameIndexEncoder.encode(output, nameMap[sourceName]!);
       }
 
       previousSourceLocation = sourceLocation;
@@ -236,11 +234,11 @@
       for (var entry in entries) {
         offsetEncoder.encode(buffer, offset);
         if (entry.isPush) {
-          SourceLocation location = entry.pushLocation;
-          uriEncoder.encode(buffer, uriMap[location.sourceUri]);
+          SourceLocation location = entry.pushLocation!;
+          uriEncoder.encode(buffer, uriMap[location.sourceUri!]!);
           lineEncoder.encode(buffer, location.line - 1);
           columnEncoder.encode(buffer, location.column - 1);
-          nameEncoder.encode(buffer, nameMap[entry.inlinedMethodName]);
+          nameEncoder.encode(buffer, nameMap[entry.inlinedMethodName!]!);
         } else {
           // ; and , are not used by VLQ so we can distinguish them in the
           // encoding, this is the same reason they are used in the mappings
@@ -254,7 +252,7 @@
 
   /// Returns the source map tag to put at the end a .js file in [fileUri] to
   /// make it point to the source map file in [sourceMapUri].
-  static String generateSourceMapTag(Uri sourceMapUri, Uri fileUri) {
+  static String generateSourceMapTag(Uri? sourceMapUri, Uri? fileUri) {
     if (sourceMapUri != null && fileUri != null) {
       String sourceMapFileName = fe.relativizeUri(fileUri, sourceMapUri, false);
       return '''
@@ -277,7 +275,7 @@
       Map<String, String> minifiedInstanceNames,
       String name,
       Uri sourceMapUri,
-      Uri fileUri,
+      Uri? fileUri,
       api.CompilerOutput compilerOutput) {
     // Create a source file for the compilation output. This allows using
     // [:getLine:] to transform offsets to line numbers in [SourceMapBuilder].
@@ -357,7 +355,7 @@
 }
 
 class SourceMapEntry {
-  SourceLocation sourceLocation;
+  SourceLocation? sourceLocation;
   int targetOffset;
 
   SourceMapEntry(this.sourceLocation, this.targetOffset);
@@ -395,8 +393,8 @@
 
   /// Returns the elements for the first the column in [line] that has
   /// associated elements.
-  List<T> getFirstElementsInLine(int line) {
-    Map<int, List<T>> lineMap = _map[line];
+  List<T>? getFirstElementsInLine(int line) {
+    Map<int, List<T>>? lineMap = _map[line];
     if (lineMap == null) return null;
     List<int> columns = lineMap.keys.toList()..sort();
     return lineMap[columns.first];
@@ -406,11 +404,11 @@
   ///
   /// [f] is called in increasing column order.
   void forEachColumn(int line, f(int column, List<T> elements)) {
-    Map<int, List<T>> lineMap = _map[line];
+    Map<int, List<T>>? lineMap = _map[line];
     if (lineMap != null) {
       List<int> columns = lineMap.keys.toList()..sort();
       columns.forEach((int column) {
-        f(column, lineMap[column]);
+        f(column, lineMap[column]!);
       });
     }
   }
@@ -421,10 +419,10 @@
   void forEach(f(int line, int column, T element)) {
     List<int> lines = _map.keys.toList()..sort();
     for (int line in lines) {
-      Map<int, List<T>> lineMap = _map[line];
+      Map<int, List<T>> lineMap = _map[line]!;
       List<int> columns = lineMap.keys.toList()..sort();
       for (int column in columns) {
-        lineMap[column].forEach((e) => f(line, column, e));
+        lineMap[column]!.forEach((e) => f(line, column, e));
       }
     }
   }
@@ -447,7 +445,7 @@
   }
 
   /// Returns the index of [element].
-  int operator [](T element) => map[element];
+  int? operator [](T element) => map[element];
 
   /// Returns the indexed elements.
   Iterable<T> get elements => map.keys;
diff --git a/pkg/compiler/lib/src/ir/runtime_type_analysis.dart b/pkg/compiler/lib/src/ir/runtime_type_analysis.dart
index 06ffbfb..b6ba6c1 100644
--- a/pkg/compiler/lib/src/ir/runtime_type_analysis.dart
+++ b/pkg/compiler/lib/src/ir/runtime_type_analysis.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.
 
-// @dart = 2.10
-
 import 'package:kernel/ast.dart' as ir;
 
 import '../common/names.dart';
@@ -40,20 +38,20 @@
 
   /// The static type of the receiver expression. This is set in the static type
   /// visitor.
-  ir.DartType receiverType;
+  ir.DartType? receiverType;
 
   /// The property get for the right occurrence of `.runtimeType` when [kind]
   /// is `RuntimeTypeUseKind.equals`.
   // TODO(johnniwinther): Change this to `InstanceGet` when the old method
   // invocation encoding is no longer used.
-  final ir.Expression rightRuntimeTypeExpression;
+  final ir.Expression? rightRuntimeTypeExpression;
 
   /// The argument expression if [kind] is `RuntimeTypeUseKind.equals`.
-  final ir.Expression argument;
+  final ir.Expression? argument;
 
   /// The static type of the argument expression. This is set in the static type
   /// visitor.
-  ir.DartType argumentType;
+  ir.DartType? argumentType;
 
   RuntimeTypeUseData(this.kind, this.leftRuntimeTypeExpression, this.receiver,
       this.rightRuntimeTypeExpression, this.argument);
@@ -66,7 +64,6 @@
       case RuntimeTypeUseKind.equals:
         return receiverType != null && argumentType != null;
     }
-    throw UnsupportedError("Unexpected RuntimeTypeUseKind $kind.");
   }
 
   @override
@@ -87,7 +84,7 @@
 // old method invocation encoding is no longer used.
 RuntimeTypeUseData computeRuntimeTypeUse(
     Map<ir.Expression, RuntimeTypeUseData> cache, ir.Expression node) {
-  RuntimeTypeUseData receiverData = cache[node];
+  RuntimeTypeUseData? receiverData = cache[node];
   if (receiverData != null) return receiverData;
 
   /// Returns `true` if [node] is of the form `e.runtimeType`.
@@ -98,29 +95,30 @@
   }
 
   /// Returns `true` if [node] is of the form `e.toString()`.
-  bool isInvokeToString(ir.TreeNode node) {
+  bool isInvokeToString(ir.TreeNode? node) {
     return node is ir.InstanceInvocation && node.name.text == 'toString';
   }
 
   assert(isGetRuntimeType(node));
   // TODO(johnniwinther): Replace this with `node.receiver` when the old method
   // invocation encoding is no longer used.
-  _RuntimeTypeAccess runtimeTypeAccess = _getRuntimeTypeAccess(node);
-  assert(runtimeTypeAccess != null);
+  _RuntimeTypeAccess runtimeTypeAccess = _getRuntimeTypeAccess(node)!;
 
   // TODO(johnniwinther): Change [receiverGet] and [argumentGet] to
   // `InstanceGet` when the old method invocation encoding is no longer used.
   // TODO(johnniwinther): Special-case `this.runtimeType`.
-  ir.Expression receiverGet;
-  ir.Expression receiver;
-  ir.Expression argumentGet;
-  ir.Expression argument;
-  RuntimeTypeUseKind kind;
+  late final ir.Expression receiverGet;
+  late final ir.Expression receiver;
+  ir.Expression? argumentGet;
+  ir.Expression? argument;
+  RuntimeTypeUseKind? kind;
 
+  final nodeParent = node.parent;
+  final nodeParentParent = nodeParent?.parent;
   if (runtimeTypeAccess.receiver is ir.VariableGet &&
-      node.parent is ir.ConditionalExpression &&
-      node.parent.parent is ir.Let) {
-    NullAwareExpression nullAware = getNullAwareExpression(node.parent.parent);
+      nodeParent is ir.ConditionalExpression &&
+      nodeParentParent is ir.Let) {
+    NullAwareExpression? nullAware = getNullAwareExpression(nodeParentParent);
     if (nullAware != null) {
       // The node is of the form:
       //
@@ -129,8 +127,8 @@
 
       if (nullAware.parent is ir.VariableDeclaration &&
           nullAware.parent.parent is ir.Let) {
-        NullAwareExpression outer =
-            getNullAwareExpression(nullAware.parent.parent);
+        NullAwareExpression? outer =
+            getNullAwareExpression(nullAware.parent.parent!);
         if (outer != null &&
             outer.receiver == nullAware.let &&
             isInvokeToString(outer.expression)) {
@@ -149,14 +147,14 @@
           receiverGet = node;
         }
       } else if (_isObjectMethodInvocation(nullAware.parent)) {
-        _EqualsInvocation equalsInvocation =
+        _EqualsInvocation? equalsInvocation =
             _getEqualsInvocation(nullAware.parent);
         if (equalsInvocation != null &&
             equalsInvocation.left == nullAware.let) {
           // Detected
           //
           //  e0?.runtimeType == other
-          _RuntimeTypeAccess otherGetRuntimeType =
+          _RuntimeTypeAccess? otherGetRuntimeType =
               _getRuntimeTypeAccess(equalsInvocation.right);
           if (otherGetRuntimeType != null) {
             // Detected
@@ -175,7 +173,7 @@
             argumentGet = otherGetRuntimeType.node;
           }
 
-          NullAwareExpression otherNullAware =
+          NullAwareExpression? otherNullAware =
               getNullAwareExpression(equalsInvocation.right);
           if (otherNullAware != null &&
               isGetRuntimeType(otherNullAware.expression)) {
@@ -212,15 +210,15 @@
         }
       } else if (nullAware.parent is ir.Arguments &&
           _isObjectMethodInvocation(nullAware.parent.parent)) {
-        _EqualsInvocation equalsInvocation =
+        _EqualsInvocation? equalsInvocation =
             _getEqualsInvocation(nullAware.parent.parent);
         if (equalsInvocation != null &&
             equalsInvocation.right == nullAware.let) {
           // [nullAware] is the right hand side of ==.
 
-          _RuntimeTypeAccess otherGetRuntimeType =
+          _RuntimeTypeAccess? otherGetRuntimeType =
               _getRuntimeTypeAccess(equalsInvocation.left);
-          NullAwareExpression otherNullAware =
+          NullAwareExpression? otherNullAware =
               getNullAwareExpression(equalsInvocation.left);
 
           if (otherGetRuntimeType != null) {
@@ -284,9 +282,9 @@
         receiverGet = node;
       }
     }
-  } else if (node.parent is ir.VariableDeclaration &&
-      node.parent.parent is ir.Let) {
-    NullAwareExpression nullAware = getNullAwareExpression(node.parent.parent);
+  } else if (nodeParent is ir.VariableDeclaration &&
+      nodeParentParent is ir.Let) {
+    NullAwareExpression? nullAware = getNullAwareExpression(nodeParentParent);
     if (nullAware != null && isInvokeToString(nullAware.expression)) {
       // Detected
       //
@@ -300,14 +298,14 @@
       receiver = runtimeTypeAccess.receiver;
       receiverGet = node;
     }
-  } else if (_isObjectMethodInvocation(node.parent)) {
-    _EqualsInvocation equalsInvocation = _getEqualsInvocation(node.parent);
+  } else if (_isObjectMethodInvocation(nodeParent)) {
+    _EqualsInvocation? equalsInvocation = _getEqualsInvocation(nodeParent);
     if (equalsInvocation != null && equalsInvocation.left == node) {
       // [node] is the left hand side of ==.
 
-      _RuntimeTypeAccess otherGetRuntimeType =
+      _RuntimeTypeAccess? otherGetRuntimeType =
           _getRuntimeTypeAccess(equalsInvocation.right);
-      NullAwareExpression nullAware =
+      NullAwareExpression? nullAware =
           getNullAwareExpression(equalsInvocation.right);
       if (otherGetRuntimeType != null) {
         // Detected
@@ -339,7 +337,7 @@
         argument = nullAware.receiver;
         argumentGet = nullAware.expression;
       }
-    } else if (isInvokeToString(node.parent)) {
+    } else if (isInvokeToString(nodeParent)) {
       // Detected
       //
       //     e.runtimeType.toString()
@@ -348,15 +346,15 @@
       receiver = runtimeTypeAccess.receiver;
       receiverGet = node;
     }
-  } else if (node.parent is ir.Arguments &&
-      _isObjectMethodInvocation(node.parent.parent)) {
-    _EqualsInvocation _equalsInvocation =
-        _getEqualsInvocation(node.parent.parent);
+  } else if (nodeParent is ir.Arguments &&
+      _isObjectMethodInvocation(nodeParentParent)) {
+    _EqualsInvocation? _equalsInvocation =
+        _getEqualsInvocation(nodeParentParent);
     if (_equalsInvocation != null && _equalsInvocation.right == node) {
       // [node] is the right hand side of ==.
-      _RuntimeTypeAccess otherGetRuntimeType =
+      _RuntimeTypeAccess? otherGetRuntimeType =
           _getRuntimeTypeAccess(_equalsInvocation.left);
-      NullAwareExpression nullAware =
+      NullAwareExpression? nullAware =
           getNullAwareExpression(_equalsInvocation.left);
 
       if (otherGetRuntimeType != null) {
@@ -390,7 +388,7 @@
         argumentGet = node;
       }
     }
-  } else if (node.parent is ir.StringConcatenation) {
+  } else if (nodeParent is ir.StringConcatenation) {
     // Detected
     //
     //     '${e.runtimeType}'
@@ -417,7 +415,6 @@
     cache[argumentGet] = data;
   }
 
-  assert(receiverGet != null, "Missing receiverGet in $data for $node.");
   assert(!(argument != null && argumentGet == null),
       "Missing argumentGet in $data for $node.");
   assert(
@@ -426,13 +423,13 @@
 }
 
 /// Returns `true` if [node] is a potential invocation of an Object method.
-bool _isObjectMethodInvocation(ir.TreeNode node) {
+bool _isObjectMethodInvocation(ir.TreeNode? node) {
   return node is ir.InstanceInvocation || node is ir.EqualsCall;
 }
 
 /// Returns the [_RuntimeTypeAccess] corresponding to [node] if it is an access
 /// of `.runtimeType`, and `null` otherwise.
-_RuntimeTypeAccess _getRuntimeTypeAccess(ir.TreeNode node) {
+_RuntimeTypeAccess? _getRuntimeTypeAccess(ir.TreeNode node) {
   if (node is ir.InstanceGet && node.name.text == 'runtimeType') {
     return _RuntimeTypeAccess(node, node.receiver);
   } else if (node is ir.DynamicGet && node.name.text == 'runtimeType') {
@@ -450,7 +447,7 @@
 
 /// Returns the [_EqualsInvocation] corresponding to [node] if it is a call to
 /// of `==`, and `null` otherwise.
-_EqualsInvocation _getEqualsInvocation(ir.TreeNode node) {
+_EqualsInvocation? _getEqualsInvocation(ir.TreeNode? node) {
   if (node is ir.EqualsCall) {
     return _EqualsInvocation(node, node.left, node.right);
   }
diff --git a/pkg/compiler/lib/src/ir/static_type_base.dart b/pkg/compiler/lib/src/ir/static_type_base.dart
index f32ff54..79ed5f4 100644
--- a/pkg/compiler/lib/src/ir/static_type_base.dart
+++ b/pkg/compiler/lib/src/ir/static_type_base.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.
 
-// @dart = 2.10
-
 import 'package:kernel/ast.dart' as ir;
 import 'package:kernel/type_environment.dart' as ir;
 
@@ -21,10 +19,10 @@
 /// has precision of a this-expression.
 class ThisInterfaceType extends ir.InterfaceType {
   ThisInterfaceType(ir.Class classNode, ir.Nullability nullability,
-      [List<ir.DartType> typeArguments])
+      [List<ir.DartType>? typeArguments])
       : super(classNode, nullability, typeArguments);
 
-  factory ThisInterfaceType.from(ir.InterfaceType type) => type != null
+  static from(ir.InterfaceType? type) => type != null
       ? ThisInterfaceType(type.classNode, type.nullability, type.typeArguments)
       : null;
 
@@ -36,10 +34,10 @@
 /// is exact, i.e. the runtime type is not a subtype or subclass of the type.
 class ExactInterfaceType extends ir.InterfaceType {
   ExactInterfaceType(ir.Class classNode, ir.Nullability nullability,
-      [List<ir.DartType> typeArguments])
+      [List<ir.DartType>? typeArguments])
       : super(classNode, nullability, typeArguments);
 
-  factory ExactInterfaceType.from(ir.InterfaceType type) => type != null
+  static from(ir.InterfaceType? type) => type != null
       ? ExactInterfaceType(type.classNode, type.nullability, type.typeArguments)
       : null;
 
@@ -57,7 +55,7 @@
 /// expression kind. For instance method invocations whose static type depend
 /// on the static types of the receiver and type arguments and the signature
 /// of the targeted procedure.
-abstract class StaticTypeBase extends ir.Visitor<ir.DartType>
+abstract class StaticTypeBase extends ir.Visitor<ir.DartType?>
     with ir.VisitorNullMixin<ir.DartType> {
   final ir.TypeEnvironment _typeEnvironment;
 
@@ -72,11 +70,11 @@
   ThisInterfaceType get thisType;
 
   @override
-  ir.DartType defaultNode(ir.Node node) {
+  ir.DartType? defaultNode(ir.Node node) {
     return null;
   }
 
-  ir.DartType visitNode(ir.Node node) {
+  ir.DartType? visitNode(ir.Node? node) {
     return node?.accept(this);
   }
 
@@ -98,7 +96,7 @@
 
   @override
   ir.DartType visitAwaitExpression(ir.AwaitExpression node) {
-    return typeEnvironment.flatten(visitNode(node.operand));
+    return typeEnvironment.flatten(visitNode(node.operand)!);
   }
 
   @override
@@ -152,7 +150,7 @@
   }
 
   @override
-  ir.DartType visitVariableSet(ir.VariableSet node) {
+  ir.DartType? visitVariableSet(ir.VariableSet node) {
     return visitNode(node.value);
   }
 
@@ -163,12 +161,12 @@
   ir.DartType visitStaticGet(ir.StaticGet node) => node.target.getterType;
 
   @override
-  ir.DartType visitStaticSet(ir.StaticSet node) {
+  ir.DartType? visitStaticSet(ir.StaticSet node) {
     return visitNode(node.value);
   }
 
   @override
-  ir.DartType visitSuperPropertySet(ir.SuperPropertySet node) {
+  ir.DartType? visitSuperPropertySet(ir.SuperPropertySet node) {
     return visitNode(node.value);
   }
 
@@ -207,12 +205,12 @@
   }
 
   @override
-  ir.DartType visitLet(ir.Let node) {
+  ir.DartType? visitLet(ir.Let node) {
     return visitNode(node.body);
   }
 
   @override
-  ir.DartType visitBlockExpression(ir.BlockExpression node) {
+  ir.DartType? visitBlockExpression(ir.BlockExpression node) {
     return visitNode(node.value);
   }
 
diff --git a/pkg/compiler/lib/src/js/rewrite_async.dart b/pkg/compiler/lib/src/js/rewrite_async.dart
index ecc0cd2..a1b5bb2 100644
--- a/pkg/compiler/lib/src/js/rewrite_async.dart
+++ b/pkg/compiler/lib/src/js/rewrite_async.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.
 
-// @dart = 2.10
-
 library rewrite_async;
 
 import 'dart:collection';
@@ -12,7 +10,6 @@
 import 'package:js_runtime/synced/async_await_error_codes.dart' as error_codes;
 
 import '../common.dart';
-import '../io/source_information.dart' show SourceInformation;
 import '../util/util.dart' show Pair;
 import 'js.dart' as js;
 
@@ -49,8 +46,8 @@
   ///   catch-handler.
   Map<js.Node, int> handlerLabels = {};
 
-  int exitLabel;
-  int rethrowLabel;
+  int? exitLabel;
+  late int rethrowLabel;
 
   /// A stack of all (surrounding) jump targets.
   ///
@@ -68,15 +65,11 @@
   /// are on the way to target (i.e. more nested than the jump target).
   List<js.Node> jumpTargets = [];
 
-  List<int> continueStack = [];
-  List<int> breakStack = [];
-  List<int> returnStack = [];
-
   List<Pair<String, String>> variableRenamings = [];
 
-  PreTranslationAnalysis analysis;
+  late final PreTranslationAnalysis analysis;
 
-  final Function safeVariableName;
+  final String Function(String) safeVariableName;
 
   // All the <x>Name variables are names of Javascript variables used in the
   // transformed code.
@@ -97,6 +90,7 @@
   ///     case thenLabel:
   ///       result = [[a]];
   ///       goto = joinLabel;
+  ///       break;
   ///     case elseLabel:
   ///       result = [[b]];
   ///     case joinLabel:
@@ -108,26 +102,26 @@
   /// It is a parameter to the [body] function, so that [awaitStatement] can
   /// call [body] with the result of an awaited Future.
   js.VariableUse get result => js.VariableUse(resultName);
-  String resultName;
+  late final String resultName;
 
   /// A parameter to the [bodyName] function. Indicating if we are in success
   /// or error case.
-  String errorCodeName;
+  late final String errorCodeName;
 
   /// The inner function that is scheduled to do each await/yield,
   /// and called to do a new iteration for sync*.
-  js.Name bodyName;
+  final js.Name bodyName;
 
   /// Used to simulate a goto.
   ///
   /// To "goto" a label, the label is assigned to this variable, and break out
   /// of the switch to take another iteration in the while loop. See [addGoto]
   js.VariableUse get goto => js.VariableUse(gotoName);
-  String gotoName;
+  late final String gotoName;
 
   /// Variable containing the label of the current error handler.
   js.VariableUse get handler => js.VariableUse(handlerName);
-  String handlerName;
+  late final String handlerName;
 
   /// Set to `true` if any of the switch statement labels is a handler. At the
   /// end of rewriting this is used to see if a shorter form of error handling
@@ -140,35 +134,34 @@
   /// A stack of labels of finally blocks to visit, and the label to go to after
   /// the last.
   js.VariableUse get next => js.VariableUse(nextName);
-  String nextName;
+  late final String nextName;
 
   /// The current returned value (a finally block may overwrite it).
   js.VariableUse get returnValue => js.VariableUse(returnValueName);
-  String returnValueName;
+  late final String returnValueName;
 
   /// Stores the current error when we are in the process of handling an error.
   js.VariableUse get currentError => js.VariableUse(currentErrorName);
-  String currentErrorName;
+  late final String currentErrorName;
 
   /// The label of the outer loop.
   ///
   /// Used if there are untransformed loops containing break or continues to
   /// targets outside the loop.
-  String outerLabelName;
+  late final String outerLabelName;
 
   /// If javascript `this` is used, it is accessed via this variable, in the
   /// [bodyName] function.
   js.VariableUse get self => js.VariableUse(selfName);
-  String selfName;
+  late final String selfName;
 
   /// The rewritten code can take type arguments. These are added if needed.
-  List<String> typeArgumentNames = [];
+  final List<String> typeArgumentNames = [];
 
   final DiagnosticReporter reporter;
   // For error reporting only.
   Spannable get spannable => _spannable ?? NO_LOCATION_SPANNABLE;
-
-  Spannable _spannable;
+  final Spannable? _spannable;
 
   int _currentLabel = 0;
 
@@ -176,7 +169,7 @@
   int currentTempVarIndex = 0;
   // The highest temporary variable index ever in use in this function.
   int tempVarHighWaterMark = 0;
-  Map<int, js.Expression> tempVarNames = {};
+  Map<int, js.VariableUse> tempVarNames = {};
 
   bool get isAsync => false;
   bool get isSyncStar => false;
@@ -192,11 +185,10 @@
   /// Rewrites a sync*/async/async* function to an equivalent normal function.
   ///
   /// [spannable] can be passed to have a location for error messages.
-  js.Fun rewrite(js.Fun node, SourceInformation bodySourceInformation,
-      SourceInformation exitSourceInformation,
-      [Spannable spannable]) {
-    _spannable = spannable;
-
+  js.Fun rewrite(
+      js.Fun node,
+      js.JavaScriptNodeSourceInformation? bodySourceInformation,
+      js.JavaScriptNodeSourceInformation? exitSourceInformation) {
     analysis = PreTranslationAnalysis(unsupported);
     analysis.analyze(node);
 
@@ -219,7 +211,7 @@
 
   js.Expression get currentErrorHandler {
     return js.number(handlerLabels[
-        jumpTargets.lastWhere((node) => handlerLabels[node] != null)]);
+        jumpTargets.lastWhere((node) => handlerLabels[node] != null)]!);
   }
 
   int allocateTempVar() {
@@ -230,8 +222,7 @@
   }
 
   js.VariableUse useTempVar(int i) {
-    return tempVarNames.putIfAbsent(
-        i, () => js.VariableUse(freshName("temp$i")));
+    return tempVarNames[i] ??= js.VariableUse(freshName("temp$i"));
   }
 
   /// Generates a variable name with [safeVariableName] based on [originalName]
@@ -248,7 +239,7 @@
     return result;
   }
 
-  List<js.Expression> processTypeArguments(List<js.Expression> types) {
+  List<js.Expression> processTypeArguments(List<js.Expression>? types) {
     if (types == null) {
       String name = freshName('type');
       typeArgumentNames.add(name);
@@ -260,9 +251,9 @@
   /// All the pieces are collected in this map, to create a switch with a case
   /// for each label.
   ///
-  /// The order is important, therefore the type is explicitly LinkedHashMap.
-  LinkedHashMap<int, List<js.Statement>> labelledParts =
-      LinkedHashMap<int, List<js.Statement>>();
+  /// The order is important due to fall-through control flow, therefore the
+  /// type is explicitly LinkedHashMap.
+  Map<int, List<js.Statement>> labelledParts = LinkedHashMap();
 
   /// Description of each label for readability of the non-minified output.
   Map<int, String> labelComments = {};
@@ -283,18 +274,15 @@
 
   /// Buffer for collecting translated statements belonging to the same switch
   /// case.
-  List<js.Statement> currentStatementBuffer;
+  List<js.Statement> currentStatementBuffer = [];
 
   // Labels will become cases in the big switch expression, and `goto label`
   // is expressed by assigning to the switch key [gotoName] and breaking out of
   // the switch.
 
-  int newLabel([String comment]) {
-    int result = _currentLabel;
-    _currentLabel++;
-    if (comment != null) {
-      labelComments[result] = comment;
-    }
+  int newLabel(String comment) {
+    int result = _currentLabel++;
+    labelComments[result] = comment;
     return result;
   }
 
@@ -305,13 +293,14 @@
     assert(!labelledParts.containsKey(label));
     currentStatementBuffer = [];
     labelledParts[label] = currentStatementBuffer;
-    addStatement(js.Comment(labelComments[label]));
+    addStatement(js.Comment(labelComments[label]!));
   }
 
   /// Returns a statement assigning to the variable named [gotoName].
   /// This should be followed by a break for the goto to be executed. Use
   /// [gotoWithBreak] or [addGoto] for this.
-  js.Statement setGotoVariable(int label, SourceInformation sourceInformation) {
+  js.Statement setGotoVariable(
+      int label, js.JavaScriptNodeSourceInformation? sourceInformation) {
     return js.ExpressionStatement(js.js('# = #',
         [goto, js.number(label)]).withSourceInformation(sourceInformation));
   }
@@ -319,7 +308,8 @@
   /// Returns a block that has a goto to [label] including the break.
   ///
   /// Also inserts a comment describing the label if available.
-  js.Block gotoAndBreak(int label, SourceInformation sourceInformation) {
+  js.Block gotoAndBreak(
+      int label, js.JavaScriptNodeSourceInformation? sourceInformation) {
     List<js.Statement> statements = [];
     if (labelComments.containsKey(label)) {
       statements.add(js.Comment("goto ${labelComments[label]}"));
@@ -338,7 +328,8 @@
   /// Adds a goto to [label] including the break.
   ///
   /// Also inserts a comment describing the label if available.
-  void addGoto(int label, SourceInformation sourceInformation) {
+  void addGoto(
+      int label, js.JavaScriptNodeSourceInformation? sourceInformation) {
     if (labelComments.containsKey(label)) {
       addStatement(js.Comment("goto ${labelComments[label]}"));
     }
@@ -356,11 +347,11 @@
   }
 
   /// True if there is an await or yield in [node] or some subexpression.
-  bool shouldTransform(js.Node node) {
+  bool shouldTransform(js.Node? node) {
     return analysis.hasAwaitOrYield.contains(node);
   }
 
-  void unsupported(js.Node node) {
+  Never unsupported(js.Node node) {
     throw UnsupportedError(
         "Node $node cannot be transformed by the await-sync transformer");
   }
@@ -380,7 +371,7 @@
   /// no side effect, it is dropped.
   void visitExpressionIgnoreResult(js.Expression node) {
     // TODO(28763): Remove `<dynamic>` when issue 28763 is fixed.
-    js.Expression result = node.accept<dynamic>(this);
+    js.Expression result = node.accept<dynamic>(this)!;
     if (!(result is js.Literal || result is js.VariableUse)) {
       addExpressionStatement(result);
     }
@@ -423,9 +414,10 @@
     return tempVar;
   }
 
-  // TODO(sigurdm): This is obsolete - all calls use store: false. Replace with
-  // visitExpression(node);
-  withExpression(js.Expression node, fn(js.Expression result), {bool store}) {
+  // TODO(sra): Many calls to this method use `store: false`, and could be
+  // replaced with calls to `visitExpression`.
+  withExpression(js.Expression node, fn(js.Expression result),
+      {required bool store}) {
     int oldTempVarIndex = currentTempVarIndex;
     js.Expression visited = visitExpression(node);
     if (store) {
@@ -450,10 +442,10 @@
   ///     temp = <receiver>;
   ///     temp.m();
   withCallTargetExpression(js.Expression node, fn(js.Expression result),
-      {bool store}) {
+      {required bool store}) {
     int oldTempVarIndex = currentTempVarIndex;
     js.Expression visited = visitExpression(node);
-    js.Expression selector;
+    js.Expression? selector;
     js.Expression storedIfNeeded;
     if (store) {
       if (visited is js.PropertyAccess) {
@@ -484,8 +476,8 @@
   /// because the evaluation of an await or yield cannot be expressed as
   /// an expression, visiting node2 it will output statements that
   /// might have an influence on the value of node1.
-  withExpression2(js.Expression node1, js.Expression node2,
-      fn(js.Expression result1, js.Expression result2)) {
+  js.Expression withExpression2(js.Expression node1, js.Expression node2,
+      js.Expression fn(js.Expression result1, js.Expression result2)) {
     int oldTempVarIndex = currentTempVarIndex;
     js.Expression r1 = visitExpression(node1);
     if (shouldTransform(node2)) {
@@ -503,11 +495,30 @@
   /// in temporary variables.
   ///
   /// See more explanation on [withExpression2].
-  ///
-  /// If any of the nodes are null, they are ignored, and a null is passed to
-  /// [fn] in that place.
-  withExpressions(List<js.Expression> nodes, fn(List<js.Expression> results)) {
+  T withExpressions<T>(
+      List<js.Expression> nodes, T fn(List<js.Expression> results)) {
     int oldTempVarIndex = currentTempVarIndex;
+    List<js.Expression> visited = [];
+    _collectVisited(nodes, visited);
+    final result = fn(visited);
+    currentTempVarIndex = oldTempVarIndex;
+    return result;
+  }
+
+  /// Like [withExpressions], but permitting `null` nodes. If any of the nodes
+  /// are null, they are ignored, and a null is passed to [fn] in that place.
+  T withNullableExpressions<T>(
+      List<js.Expression?> nodes, T fn(List<js.Expression?> results)) {
+    int oldTempVarIndex = currentTempVarIndex;
+    List<js.Expression?> visited = [];
+    _collectVisited(nodes, visited);
+    final result = fn(visited);
+    currentTempVarIndex = oldTempVarIndex;
+    return result;
+  }
+
+  void _collectVisited(
+      List<js.Expression?> nodes, List<js.Expression?> visited) {
     // Find last occurrence of a 'transform' expression in [nodes].
     // All expressions before that must be stored in temp-vars.
     int lastTransformIndex = 0;
@@ -518,28 +529,28 @@
         break;
       }
     }
-    List<js.Node> visited = nodes.take(lastTransformIndex).map((js.Node node) {
-      return (node == null) ? null : _storeIfNecessary(visitExpression(node));
-    }).toList();
-    visited.addAll(
-        nodes.skip(lastTransformIndex).map<js.Expression>((js.Node node) {
-      return (node == null) ? null : visitExpression(node);
-    }));
-    var result = fn(visited);
-    currentTempVarIndex = oldTempVarIndex;
-    return result;
+    for (int i = 0; i < nodes.length; i++) {
+      js.Expression? node = nodes[i];
+      if (node != null) {
+        node = visitExpression(node);
+        if (i < lastTransformIndex) {
+          node = _storeIfNecessary(node);
+        }
+      }
+      visited.add(node);
+    }
   }
 
   /// Emits the return block that all returns jump to (after going
   /// through all the enclosing finally blocks). The jump to here is made in
   /// [visitReturn].
-  void addSuccessExit(SourceInformation sourceInformation);
+  void addSuccessExit(js.JavaScriptNodeSourceInformation? sourceInformation);
 
   /// Emits the block that control flows to if an error has been thrown
   /// but not caught. (after going through all the enclosing finally blocks).
-  void addErrorExit(SourceInformation sourceInformation);
+  void addErrorExit(js.JavaScriptNodeSourceInformation? sourceInformation);
 
-  void addFunctionExits(SourceInformation sourceInformation) {
+  void addFunctionExits(js.JavaScriptNodeSourceInformation? sourceInformation) {
     addSuccessExit(sourceInformation);
     addErrorExit(sourceInformation);
   }
@@ -550,11 +561,11 @@
       List<js.Parameter> typeParameters,
       js.Statement rewrittenBody,
       js.VariableDeclarationList variableDeclarations,
-      SourceInformation functionSourceInformation,
-      SourceInformation bodySourceInformation);
+      js.JavaScriptNodeSourceInformation? functionSourceInformation,
+      js.JavaScriptNodeSourceInformation? bodySourceInformation);
 
   Iterable<js.VariableInitialization> variableInitializations(
-      SourceInformation sourceInformation);
+      js.JavaScriptNodeSourceInformation? sourceInformation);
 
   /// Rewrites an async/sync*/async* function to a normal Javascript function.
   ///
@@ -694,27 +705,27 @@
   /// [bodySourceInformation] is used on code generated to execute the function
   /// body and [exitSourceInformation] is used on code generated to exit the
   /// function.
-  js.Expression rewriteFunction(
+  js.Fun rewriteFunction(
       js.Fun node,
-      SourceInformation bodySourceInformation,
-      SourceInformation exitSourceInformation) {
+      js.JavaScriptNodeSourceInformation? bodySourceInformation,
+      js.JavaScriptNodeSourceInformation? exitSourceInformation) {
     beginLabel(newLabel("Function start"));
     // AsyncStar needs a return label for its handling of cancellation. See
     // [visitDartYield].
     exitLabel = (analysis.hasExplicitReturns || isAsyncStar)
         ? newLabel("return")
         : null;
-    rethrowLabel = newLabel("rethrow");
-    handlerLabels[node] = rethrowLabel;
+    handlerLabels[node] = rethrowLabel = newLabel("rethrow");
     js.Statement body = node.body;
     jumpTargets.add(node);
     visitStatement(body);
     jumpTargets.removeLast();
     addFunctionExits(exitSourceInformation);
 
-    List<js.SwitchClause> clauses = labelledParts.keys.map((label) {
-      return js.Case(js.number(label), js.Block(labelledParts[label]));
-    }).toList();
+    List<js.SwitchClause> clauses = [
+      for (final entry in labelledParts.entries)
+        js.Case(js.number(entry.key), js.Block(entry.value))
+    ];
     js.Statement rewrittenBody =
         js.Switch(goto, clauses).withSourceInformation(bodySourceInformation);
     if (hasJumpThoughOuterLabel) {
@@ -829,8 +840,8 @@
     }
   }
 
-  js.Statement awaitStatement(
-      js.Expression value, SourceInformation sourceInformation);
+  js.Statement awaitStatement(js.Expression value,
+      js.JavaScriptNodeSourceInformation? sourceInformation);
 
   /// An await is translated to an [awaitStatement].
   ///
@@ -907,7 +918,7 @@
 
   @override
   void visitBreak(js.Break node) {
-    js.Node target = analysis.targets[node];
+    js.Node target = analysis.targets[node]!;
     if (!shouldTransform(target)) {
       addStatement(node);
       return;
@@ -977,16 +988,16 @@
 
   @override
   void visitContinue(js.Continue node) {
-    js.Node target = analysis.targets[node];
+    js.Node? target = analysis.targets[node];
     if (!shouldTransform(target)) {
       addStatement(node);
       return;
     }
-    translateJump(target, continueLabels[target], node.sourceInformation);
+    translateJump(target, continueLabels[target!], node.sourceInformation);
   }
 
   /// Emits a break statement that exits the big switch statement.
-  void addBreak(SourceInformation sourceInformation) {
+  void addBreak(js.JavaScriptNodeSourceInformation? sourceInformation) {
     if (insideUntranslatedBreakable) {
       hasJumpThoughOuterLabel = true;
       addStatement(
@@ -1002,17 +1013,17 @@
   /// the target. For that [next] is used as a stack of places to go.
   ///
   /// See also [rewriteFunction].
-  void translateJump(
-      js.Node target, int targetLabel, SourceInformation sourceInformation) {
+  void translateJump(js.Node? target, int? targetLabel,
+      js.JavaScriptNodeSourceInformation? sourceInformation) {
     // Compute a stack of all the 'finally' nodes that must be visited before
     // the jump.
     // The bottom of the stack is the label where the jump goes to.
     List<int> jumpStack = [];
     for (js.Node node in jumpTargets.reversed) {
       if (finallyLabels[node] != null) {
-        jumpStack.add(finallyLabels[node]);
+        jumpStack.add(finallyLabels[node]!);
       } else if (node == target) {
-        jumpStack.add(targetLabel);
+        jumpStack.add(targetLabel!);
         break;
       }
       // Ignore other nodes.
@@ -1081,9 +1092,9 @@
       bool oldInsideUntranslated = insideUntranslatedBreakable;
       insideUntranslatedBreakable = true;
       // Note that node.init, node.condition, node.update all can be null, but
-      // withExpressions handles that.
-      withExpressions([node.init, node.condition, node.update],
-          (List<js.Expression> transformed) {
+      // withNullableExpressions handles that.
+      withNullableExpressions([node.init, node.condition, node.update],
+          (List<js.Expression?> transformed) {
         addStatement(js.For(transformed[0], transformed[1], transformed[2],
             translateToStatement(node.body)));
       });
@@ -1092,7 +1103,7 @@
     }
 
     if (node.init != null) {
-      visitExpressionIgnoreResult(node.init);
+      visitExpressionIgnoreResult(node.init!);
     }
     int startLabel = newLabel("for condition");
     // If there is no update, continuing the loop is the same as going to the
@@ -1103,7 +1114,7 @@
     int afterLabel = newLabel("after for");
     breakLabels[node] = afterLabel;
     beginLabel(startLabel);
-    js.Expression condition = node.condition;
+    js.Expression? condition = node.condition;
     if (condition == null ||
         (condition is js.LiteralBool && condition.value == true)) {
       addStatement(js.Comment("trivial condition"));
@@ -1118,7 +1129,7 @@
     jumpTargets.removeLast();
     if (node.update != null) {
       beginLabel(continueLabel);
-      visitExpressionIgnoreResult(node.update);
+      visitExpressionIgnoreResult(node.update!);
     }
     addGoto(startLabel, node.sourceInformation);
     beginLabel(afterLabel);
@@ -1189,30 +1200,32 @@
 
   @override
   visitInterpolatedExpression(js.InterpolatedExpression node) {
-    return unsupported(node);
+    unsupported(node);
   }
 
   @override
   visitInterpolatedDeclaration(js.InterpolatedDeclaration node) {
-    return unsupported(node);
+    unsupported(node);
   }
 
   @override
-  visitInterpolatedLiteral(js.InterpolatedLiteral node) => unsupported(node);
+  visitInterpolatedLiteral(js.InterpolatedLiteral node) {
+    unsupported(node);
+  }
 
   @override
   visitInterpolatedParameter(js.InterpolatedParameter node) {
-    return unsupported(node);
+    unsupported(node);
   }
 
   @override
   visitInterpolatedSelector(js.InterpolatedSelector node) {
-    return unsupported(node);
+    unsupported(node);
   }
 
   @override
   visitInterpolatedStatement(js.InterpolatedStatement node) {
-    return unsupported(node);
+    unsupported(node);
   }
 
   @override
@@ -1261,7 +1274,6 @@
   @override
   js.Parentheses visitParentheses(js.Parentheses node) {
     unsupported(node);
-    return null;
   }
 
   @override
@@ -1293,13 +1305,13 @@
 
   @override
   js.Expression visitObjectInitializer(js.ObjectInitializer node) {
-    // throw Exception("NOOOOOOOOOOOOOOOO");
     return withExpressions(
         node.properties.map((js.Property property) => property.value).toList(),
-        (List<js.Node> values) {
+        (List<js.Expression> values) {
       List<js.Property> properties = List.generate(values.length, (int i) {
         if (node.properties[i] is js.MethodDefinition) {
-          return js.MethodDefinition(node.properties[i].name, values[i]);
+          return js.MethodDefinition(
+              node.properties[i].name, values[i] as js.Fun);
         }
         return js.Property(node.properties[i].name, values[i]);
       });
@@ -1365,8 +1377,10 @@
 
   @override
   js.MethodDefinition visitMethodDefinition(js.MethodDefinition node) {
-    return withExpression(node.function,
-        (js.Expression value) => js.MethodDefinition(node.name, value),
+    return withExpression(
+        node.function,
+        (js.Expression value) =>
+            js.MethodDefinition(node.name, value as js.Fun),
         store: false);
   }
 
@@ -1375,17 +1389,18 @@
 
   @override
   void visitReturn(js.Return node) {
-    js.Node target = analysis.targets[node];
-    if (node.value != null) {
+    js.Node? target = analysis.targets[node];
+    final expression = node.value;
+    if (expression != null) {
       if (isSyncStar || isAsyncStar) {
         // Even though `return expr;` is not allowed in the dart sync* and
         // async*  code, the backend sometimes generates code like this, but
         // only when it is known that the 'expr' throws, and the return is just
         // to tell the JavaScript VM that the code won't continue here.
         // It is therefore interpreted as `expr; return;`
-        visitExpressionIgnoreResult(node.value);
+        visitExpressionIgnoreResult(expression);
       } else {
-        withExpression(node.value, (js.Expression value) {
+        withExpression(expression, (js.Expression value) {
           addStatement(js.js
               .statement("# = #;", [returnValue, value]).withSourceInformation(
                   node.sourceInformation));
@@ -1419,12 +1434,12 @@
     breakLabels[node] = after;
 
     beginLabel(before);
-    List<int> labels = List<int>.filled(node.cases.length, null);
+    List<int> labels = List<int>.filled(node.cases.length, -1);
 
     bool anyCaseExpressionTransformed = node.cases.any(
         (js.SwitchClause x) => x is js.Case && shouldTransform(x.expression));
     if (anyCaseExpressionTransformed) {
-      int defaultIndex = null; // Null means no default was found.
+      int? defaultIndex = null; // Null means no default was found.
       // If there is an await in one of the keys, a chain of ifs has to be used.
 
       withExpression(node.key, (js.Expression key) {
@@ -1450,7 +1465,7 @@
       if (defaultIndex == null) {
         addGoto(after, node.sourceInformation);
       } else {
-        addGoto(labels[defaultIndex], node.sourceInformation);
+        addGoto(labels[defaultIndex!], node.sourceInformation);
       }
     } else {
       bool hasDefault = false;
@@ -1503,7 +1518,7 @@
     }, store: false);
   }
 
-  setErrorHandler([int errorHandler]) {
+  setErrorHandler([int? errorHandler]) {
     hasHandlerLabels = true; // TODO(sra): Add short form error handler.
     js.Expression label =
         (errorHandler == null) ? currentErrorHandler : js.number(errorHandler);
@@ -1514,12 +1529,12 @@
     List<int> result = [];
     for (int i = jumpTargets.length - 1; i >= 0; i--) {
       js.Node node = jumpTargets[i];
-      int handlerLabel = handlerLabels[node];
+      int? handlerLabel = handlerLabels[node];
       if (handlerLabel != null) {
         result.add(handlerLabel);
         break;
       }
-      int finallyLabel = finallyLabels[node];
+      int? finallyLabel = finallyLabels[node];
       if (finallyLabel != null) {
         result.add(finallyLabel);
       }
@@ -1530,29 +1545,29 @@
   /// See the comments of [rewriteFunction] for more explanation.
   @override
   void visitTry(js.Try node) {
+    final catchPart = node.catchPart;
+    final finallyPart = node.finallyPart;
+
     if (!shouldTransform(node)) {
       js.Block body = translateToBlock(node.body);
-      js.Catch catchPart = (node.catchPart == null)
+      js.Catch? translatedCatchPart = (catchPart == null)
           ? null
-          : js.Catch(node.catchPart.declaration,
-              translateToBlock(node.catchPart.body));
-      js.Block finallyPart = (node.finallyPart == null)
-          ? null
-          : translateToBlock(node.finallyPart);
-      addStatement(js.Try(body, catchPart, finallyPart));
+          : js.Catch(catchPart.declaration, translateToBlock(catchPart.body));
+      js.Block? translatedFinallyPart =
+          (finallyPart == null) ? null : translateToBlock(finallyPart);
+      addStatement(js.Try(body, translatedCatchPart, translatedFinallyPart));
       return;
     }
 
     hasTryBlocks = true;
     int uncaughtLabel = newLabel("uncaught");
-    int handlerLabel =
-        (node.catchPart == null) ? uncaughtLabel : newLabel("catch");
+    int handlerLabel = (catchPart == null) ? uncaughtLabel : newLabel("catch");
 
     int finallyLabel = newLabel("finally");
     int afterFinallyLabel = newLabel("after finally");
-    if (node.finallyPart != null) {
-      finallyLabels[node.finallyPart] = finallyLabel;
-      jumpTargets.add(node.finallyPart);
+    if (finallyPart != null) {
+      finallyLabels[finallyPart] = finallyLabel;
+      jumpTargets.add(finallyPart);
     }
 
     handlerLabels[node] = handlerLabel;
@@ -1567,7 +1582,7 @@
     js.Node last = jumpTargets.removeLast();
     assert(last == node);
 
-    if (node.finallyPart == null) {
+    if (finallyPart == null) {
       setErrorHandler();
       addGoto(afterFinallyLabel, node.sourceInformation);
     } else {
@@ -1577,23 +1592,23 @@
       addGoto(finallyLabel, node.sourceInformation);
     }
 
-    if (node.catchPart != null) {
+    if (catchPart != null) {
       beginLabel(handlerLabel);
       // [uncaughtLabel] is the handler for the code in the catch-part.
       // It ensures that [nextName] is set up to run the right finally blocks.
-      handlerLabels[node.catchPart] = uncaughtLabel;
-      jumpTargets.add(node.catchPart);
+      handlerLabels[catchPart] = uncaughtLabel;
+      jumpTargets.add(catchPart);
       setErrorHandler();
       // The catch declaration name can shadow outer variables, so a fresh name
       // is needed to avoid collisions.  See Ecma 262, 3rd edition,
       // section 12.14.
-      String errorRename = freshName(node.catchPart.declaration.name);
+      String errorRename = freshName(catchPart.declaration.name);
       localVariables.add(js.VariableDeclaration(errorRename));
-      variableRenamings.add(Pair(node.catchPart.declaration.name, errorRename));
+      variableRenamings.add(Pair(catchPart.declaration.name, errorRename));
       addStatement(js.js.statement("# = #;", [errorRename, currentError]));
-      visitStatement(node.catchPart.body);
+      visitStatement(catchPart.body);
       variableRenamings.removeLast();
-      if (node.finallyPart != null) {
+      if (finallyPart != null) {
         // The error has been caught, so after the finally, continue after the
         // try.
         addStatement(js.js
@@ -1603,7 +1618,7 @@
         addGoto(afterFinallyLabel, node.sourceInformation);
       }
       js.Node last = jumpTargets.removeLast();
-      assert(last == node.catchPart);
+      assert(last == catchPart);
     }
 
     // The "uncaught"-handler tells the finally-block to continue with
@@ -1621,18 +1636,18 @@
         js.ArrayInitializer(enclosingFinallies.map(js.number).toList())
       ]));
     }
-    if (node.finallyPart == null) {
+    if (finallyPart == null) {
       // The finally-block belonging to [node] will be visited because of
       // fallthrough. If it does not exist, add an explicit goto.
       addGoto(nextLabel, node.sourceInformation);
     }
-    if (node.finallyPart != null) {
+    if (finallyPart != null) {
       js.Node last = jumpTargets.removeLast();
-      assert(last == node.finallyPart);
+      assert(last == finallyPart);
 
       beginLabel(finallyLabel);
       setErrorHandler();
-      visitStatement(node.finallyPart);
+      visitStatement(finallyPart);
       addStatement(js.Comment("// goto the next finally handler"));
       addStatement(js.js.statement("# = #.pop();", [goto, next]));
       addBreak(node.sourceInformation);
@@ -1648,10 +1663,11 @@
   @override
   js.Expression visitVariableDeclarationList(js.VariableDeclarationList node) {
     for (js.VariableInitialization initialization in node.declarations) {
-      js.VariableDeclaration declaration = initialization.declaration;
+      js.VariableDeclaration declaration =
+          initialization.declaration as js.VariableDeclaration;
       localVariables.add(declaration);
       if (initialization.value != null) {
-        withExpression(initialization.value, (js.Expression value) {
+        withExpression(initialization.value!, (js.Expression value) {
           addExpressionStatement(
               js.Assignment(js.VariableUse(declaration.name), value));
         }, store: false);
@@ -1667,11 +1683,10 @@
 
   @override
   js.Expression visitVariableUse(js.VariableUse node) {
-    Pair<String, String> renaming = variableRenamings.lastWhere(
-        (Pair renaming) => renaming.a == node.name,
-        orElse: () => null);
-    if (renaming == null) return node;
-    return js.VariableUse(renaming.b);
+    for (final renaming in variableRenamings.reversed) {
+      if (renaming.a == node.name) return js.VariableUse(renaming.b);
+    }
+    return node;
   }
 
   @override
@@ -1707,7 +1722,7 @@
   }
 
   addYield(js.DartYield node, js.Expression expression,
-      SourceInformation sourceInformation);
+      js.JavaScriptNodeSourceInformation? sourceInformation);
 
   @override
   void visitDartYield(js.DartYield node) {
@@ -1723,8 +1738,10 @@
   }
 }
 
-js.VariableInitialization _makeVariableInitializer(dynamic variable,
-    js.Expression initValue, SourceInformation sourceInformation) {
+js.VariableInitialization _makeVariableInitializer(
+    dynamic variable,
+    js.Expression? initValue,
+    js.JavaScriptNodeSourceInformation? sourceInformation) {
   js.VariableDeclaration declaration;
   if (variable is js.VariableUse) {
     declaration = js.VariableDeclaration(variable.name);
@@ -1735,7 +1752,7 @@
     declaration = variable;
   }
   return js.VariableInitialization(declaration, initValue)
-      .withSourceInformation(sourceInformation);
+      .withSourceInformation(sourceInformation) as js.VariableInitialization;
 }
 
 class AsyncRewriter extends AsyncRewriterBase {
@@ -1745,7 +1762,7 @@
   /// The Completer that will finish an async function.
   ///
   /// Not used for sync* or async* functions.
-  String completerName;
+  late final String completerName;
   js.VariableUse get completer => js.VariableUse(completerName);
 
   /// The function called by an async function to initiate asynchronous
@@ -1784,30 +1801,30 @@
   ///
   /// Specific to async methods.
   final js.Expression completerFactory;
-  List<js.Expression> completerFactoryTypeArguments;
+  List<js.Expression>? completerFactoryTypeArguments;
 
   final js.Expression wrapBody;
 
   AsyncRewriter(DiagnosticReporter reporter, Spannable spannable,
-      {this.asyncStart,
-      this.asyncAwait,
-      this.asyncReturn,
-      this.asyncRethrow,
-      this.completerFactory,
-      this.completerFactoryTypeArguments,
-      this.wrapBody,
-      String safeVariableName(String proposedName),
-      js.Name bodyName})
+      {required this.asyncStart,
+      required this.asyncAwait,
+      required this.asyncReturn,
+      required this.asyncRethrow,
+      required this.completerFactory,
+      required this.completerFactoryTypeArguments,
+      required this.wrapBody,
+      required String safeVariableName(String proposedName),
+      required js.Name bodyName})
       : super(reporter, spannable, safeVariableName, bodyName);
 
   @override
   void addYield(js.DartYield node, js.Expression expression,
-      SourceInformation sourceInformation) {
+      js.JavaScriptNodeSourceInformation? sourceInformation) {
     reporter.internalError(spannable, "Yield in non-generating async function");
   }
 
   @override
-  void addErrorExit(SourceInformation sourceInformation) {
+  void addErrorExit(js.JavaScriptNodeSourceInformation? sourceInformation) {
     if (!hasHandlerLabels) return; // rethrow handled in method boilerplate.
     beginLabel(rethrowLabel);
     js.Expression thenHelperCall = js.js(
@@ -1824,9 +1841,9 @@
   /// (the result might have been stored in [returnValue] by some finally
   /// block).
   @override
-  void addSuccessExit(SourceInformation sourceInformation) {
+  void addSuccessExit(js.JavaScriptNodeSourceInformation? sourceInformation) {
     if (analysis.hasExplicitReturns) {
-      beginLabel(exitLabel);
+      beginLabel(exitLabel!);
     } else {
       addStatement(js.Comment("implicit return"));
     }
@@ -1844,7 +1861,7 @@
 
   @override
   Iterable<js.VariableInitialization> variableInitializations(
-      SourceInformation sourceInformation) {
+      js.JavaScriptNodeSourceInformation? sourceInformation) {
     List<js.VariableInitialization> variables = [];
     variables.add(_makeVariableInitializer(
         completer,
@@ -1868,8 +1885,8 @@
   }
 
   @override
-  js.Statement awaitStatement(
-      js.Expression value, SourceInformation sourceInformation) {
+  js.Statement awaitStatement(js.Expression value,
+      js.JavaScriptNodeSourceInformation? sourceInformation) {
     js.Expression asyncHelperCall = js.js("#asyncHelper(#value, #bodyName)", {
       "asyncHelper": asyncAwait,
       "value": value,
@@ -1884,15 +1901,15 @@
       List<js.Parameter> typeParameters,
       js.Statement rewrittenBody,
       js.VariableDeclarationList variableDeclarations,
-      SourceInformation functionSourceInformation,
-      SourceInformation bodySourceInformation) {
+      js.JavaScriptNodeSourceInformation? functionSourceInformation,
+      js.JavaScriptNodeSourceInformation? bodySourceInformation) {
     js.Expression asyncRethrowCall =
         js.js("#asyncRethrow(#result, #completer)", {
       "result": resultName,
       "asyncRethrow": asyncRethrow,
       "completer": completer,
     }).withSourceInformation(bodySourceInformation);
-    js.Return returnAsyncRethrow = js.Return(asyncRethrowCall)
+    js.Statement returnAsyncRethrow = js.Return(asyncRethrowCall)
         .withSourceInformation(bodySourceInformation);
     js.Statement errorCheck = js.js.statement("""
       if (#errorCode === #ERROR) {
@@ -1911,7 +1928,7 @@
       "handler": handler,
       "returnAsyncRethrow": returnAsyncRethrow,
     }).withSourceInformation(bodySourceInformation);
-    js.Fun innerFunction = js.js("""
+    js.Expression innerFunction = js.js("""
       function (#errorCode, #result) {
         #errorCheck;
         #rewrittenBody;
@@ -1926,7 +1943,7 @@
       "bodyName": bodyName,
       "completer": completer,
     }).withSourceInformation(bodySourceInformation);
-    js.Return returnAsyncStart =
+    js.Statement returnAsyncStart =
         js.Return(asyncStartCall).withSourceInformation(bodySourceInformation);
     js.Expression wrapBodyCall = js.js("#wrapBody(#innerFunction)", {
       "wrapBody": wrapBody,
@@ -1944,7 +1961,7 @@
       "bodyName": bodyName,
       "wrapBodyCall": wrapBodyCall,
       "returnAsyncStart": returnAsyncStart,
-    }).withSourceInformation(functionSourceInformation);
+    }).withSourceInformation(functionSourceInformation) as js.Fun;
   }
 }
 
@@ -1955,7 +1972,7 @@
   /// Constructor creating the Iterable for a sync* method. Called with
   /// [bodyName].
   final js.Expression iterableFactory;
-  List<js.Expression> iterableFactoryTypeArguments;
+  List<js.Expression>? iterableFactoryTypeArguments;
 
   /// A JS Expression that creates a marker showing that iteration is over.
   ///
@@ -1971,13 +1988,13 @@
   final js.Expression uncaughtErrorExpression;
 
   SyncStarRewriter(DiagnosticReporter diagnosticListener, spannable,
-      {this.endOfIteration,
-      this.iterableFactory,
-      this.iterableFactoryTypeArguments,
-      this.yieldStarExpression,
-      this.uncaughtErrorExpression,
-      String safeVariableName(String proposedName),
-      js.Name bodyName})
+      {required this.endOfIteration,
+      required this.iterableFactory,
+      required this.iterableFactoryTypeArguments,
+      required this.yieldStarExpression,
+      required this.uncaughtErrorExpression,
+      required String safeVariableName(String proposedName),
+      required js.Name bodyName})
       : super(diagnosticListener, spannable, safeVariableName, bodyName);
 
   /// Translates a yield/yield* in an sync*.
@@ -1986,7 +2003,7 @@
   /// `yield*` wraps [value] in a [yieldStarExpression] and returns it.
   @override
   void addYield(js.DartYield node, js.Expression expression,
-      SourceInformation sourceInformation) {
+      js.JavaScriptNodeSourceInformation? sourceInformation) {
     if (node.hasStar) {
       addStatement(js.Return(js.Call(yieldStarExpression, [expression])
               .withSourceInformation(sourceInformation))
@@ -2003,8 +2020,8 @@
       List<js.Parameter> typeParameters,
       js.Statement rewrittenBody,
       js.VariableDeclarationList variableDeclarations,
-      SourceInformation functionSourceInformation,
-      SourceInformation bodySourceInformation) {
+      js.JavaScriptNodeSourceInformation? functionSourceInformation,
+      js.JavaScriptNodeSourceInformation? bodySourceInformation) {
     // Each iterator invocation on the iterable should work on its own copy of
     // the parameters.
     // TODO(sigurdm): We only need to do this copying for parameters that are
@@ -2039,7 +2056,7 @@
       "setCurrentError": setCurrentError,
       "setGoto": setGoto,
     }).withSourceInformation(bodySourceInformation);
-    js.NamedFunction innerInnerFunction = js.js("""
+    js.Expression innerInnerFunction = js.js("""
           function #body(#errorCode, #result) {
             #checkErrorCode;
             #helperBody;
@@ -2050,9 +2067,9 @@
       "result": resultName,
       "checkErrorCode": checkErrorCode,
     }).withSourceInformation(functionSourceInformation);
-    js.Return returnInnerInnerFunction = js.Return(innerInnerFunction)
+    js.Statement returnInnerInnerFunction = js.Return(innerInnerFunction)
         .withSourceInformation(bodySourceInformation);
-    js.Fun innerFunction = js.js("""
+    js.Expression innerFunction = js.js("""
           function () {
             if (#hasParameters) {
               #copyParameters;
@@ -2085,11 +2102,11 @@
       "needsThis": analysis.hasThis,
       "self": selfName,
       "returnCallIterableFactory": returnCallIterableFactory,
-    }).withSourceInformation(functionSourceInformation);
+    }).withSourceInformation(functionSourceInformation) as js.Fun;
   }
 
   @override
-  void addErrorExit(SourceInformation sourceInformation) {
+  void addErrorExit(js.JavaScriptNodeSourceInformation? sourceInformation) {
     hasHandlerLabels = true; // TODO(sra): Add short form error handler.
     beginLabel(rethrowLabel);
     js.Expression uncaughtErrorExpressionCall = js.js('#(#)', [
@@ -2102,9 +2119,9 @@
 
   /// Returning from a sync* function returns an [endOfIteration] marker.
   @override
-  void addSuccessExit(SourceInformation sourceInformation) {
+  void addSuccessExit(js.JavaScriptNodeSourceInformation? sourceInformation) {
     if (analysis.hasExplicitReturns) {
-      beginLabel(exitLabel);
+      beginLabel(exitLabel!);
     } else {
       addStatement(js.Comment("implicit return"));
     }
@@ -2116,14 +2133,14 @@
 
   @override
   Iterable<js.VariableInitialization> variableInitializations(
-      SourceInformation sourceInformation) {
+      js.JavaScriptNodeSourceInformation? sourceInformation) {
     List<js.VariableInitialization> variables = [];
     return variables;
   }
 
   @override
-  js.Statement awaitStatement(
-      js.Expression value, SourceInformation sourceInformation) {
+  js.Statement awaitStatement(js.Expression value,
+      js.JavaScriptNodeSourceInformation? sourceInformation) {
     throw reporter.internalError(
         spannable, "Sync* functions cannot contain await statements.");
   }
@@ -2145,10 +2162,10 @@
     return js.VariableUse(nextWhenCanceledName);
   }
 
-  String nextWhenCanceledName;
+  late final String nextWhenCanceledName;
 
   /// The StreamController that controls an async* function.
-  String controllerName;
+  late final String controllerName;
   js.VariableUse get controller => js.VariableUse(controllerName);
 
   /// The function called by an async* function to simulate an await, yield or
@@ -2173,7 +2190,7 @@
   ///
   /// Specific to async* methods.
   final js.Expression newController;
-  List<js.Expression> newControllerTypeArguments;
+  List<js.Expression>? newControllerTypeArguments;
 
   /// Used to get the `Stream` out of the [controllerName] variable.
   final js.Expression streamOfController;
@@ -2191,15 +2208,15 @@
   final js.Expression wrapBody;
 
   AsyncStarRewriter(DiagnosticReporter reporter, Spannable spannable,
-      {this.asyncStarHelper,
-      this.streamOfController,
-      this.newController,
-      this.newControllerTypeArguments,
-      this.yieldExpression,
-      this.yieldStarExpression,
-      this.wrapBody,
-      String safeVariableName(String proposedName),
-      js.Name bodyName})
+      {required this.asyncStarHelper,
+      required this.streamOfController,
+      required this.newController,
+      required this.newControllerTypeArguments,
+      required this.yieldExpression,
+      required this.yieldStarExpression,
+      required this.wrapBody,
+      required String safeVariableName(String proposedName),
+      required js.Name bodyName})
       : super(reporter, spannable, safeVariableName, bodyName);
 
   /// Translates a yield/yield* in an async* function.
@@ -2212,14 +2229,16 @@
   /// must be run in case the stream was canceled.
   @override
   void addYield(js.DartYield node, js.Expression expression,
-      SourceInformation sourceInformation) {
+      js.JavaScriptNodeSourceInformation? sourceInformation) {
     // Find all the finally blocks that should be performed if the stream is
     // canceled during the yield.
-    // At the bottom of the stack is the return label.
-    List<int> enclosingFinallyLabels = [exitLabel];
-    enclosingFinallyLabels.addAll(jumpTargets
-        .where((js.Node node) => finallyLabels[node] != null)
-        .map((js.Node node) => finallyLabels[node]));
+    List<int> enclosingFinallyLabels = [
+      // At the bottom of the stack is the return label.
+      exitLabel!,
+      for (final node in jumpTargets)
+        if (finallyLabels[node] != null) finallyLabels[node]!
+    ];
+
     addStatement(js.js.statement("# = #;", [
       nextWhenCanceled,
       js.ArrayInitializer(enclosingFinallyLabels.map(js.number).toList())
@@ -2245,8 +2264,8 @@
       List<js.Parameter> typeParameters,
       js.Statement rewrittenBody,
       js.VariableDeclarationList variableDeclarations,
-      SourceInformation functionSourceInformation,
-      SourceInformation bodySourceInformation) {
+      js.JavaScriptNodeSourceInformation? functionSourceInformation,
+      js.JavaScriptNodeSourceInformation? bodySourceInformation) {
     js.Expression updateNext = js.js("#next = #nextWhenCanceled", {
       "next": next,
       "nextWhenCanceled": nextWhenCanceled,
@@ -2308,7 +2327,7 @@
       "switchCase": switchCase,
       "ifError": ifError,
     }).withSourceInformation(bodySourceInformation);
-    js.Fun innerFunction = js.js("""
+    js.Expression innerFunction = js.js("""
         function (#errorCode, #result) {
           #ifHasYield;
           #rewrittenBody;
@@ -2332,8 +2351,9 @@
       "streamOfController": streamOfController,
       "controller": controllerName,
     }).withSourceInformation(bodySourceInformation);
-    js.Return returnStreamOfControllerCall = js.Return(streamOfControllerCall)
-        .withSourceInformation(bodySourceInformation);
+    js.Statement returnStreamOfControllerCall =
+        js.Return(streamOfControllerCall)
+            .withSourceInformation(bodySourceInformation);
     return js.js("""
         function (#parameters, #typeParameters) {
           #declareBodyName;
@@ -2345,11 +2365,11 @@
       "declareBodyName": declareBodyName,
       "variableDeclarations": variableDeclarations,
       "returnStreamOfControllerCall": returnStreamOfControllerCall,
-    }).withSourceInformation(functionSourceInformation);
+    }).withSourceInformation(functionSourceInformation) as js.Fun;
   }
 
   @override
-  void addErrorExit(SourceInformation sourceInformation) {
+  void addErrorExit(js.JavaScriptNodeSourceInformation? sourceInformation) {
     hasHandlerLabels = true;
     beginLabel(rethrowLabel);
     js.Expression asyncHelperCall =
@@ -2366,8 +2386,8 @@
   /// Returning from an async* function calls the [streamHelper] with an
   /// [endOfIteration] marker.
   @override
-  void addSuccessExit(SourceInformation sourceInformation) {
-    beginLabel(exitLabel);
+  void addSuccessExit(js.JavaScriptNodeSourceInformation? sourceInformation) {
+    beginLabel(exitLabel!);
 
     js.Expression streamHelperCall =
         js.js("#streamHelper(null, #successCode, #controller)", {
@@ -2381,7 +2401,7 @@
 
   @override
   Iterable<js.VariableInitialization> variableInitializations(
-      SourceInformation sourceInformation) {
+      js.JavaScriptNodeSourceInformation? sourceInformation) {
     List<js.VariableInitialization> variables = [];
     variables.add(_makeVariableInitializer(
         controller,
@@ -2407,8 +2427,8 @@
   }
 
   @override
-  js.Statement awaitStatement(
-      js.Expression value, SourceInformation sourceInformation) {
+  js.Statement awaitStatement(js.Expression value,
+      js.JavaScriptNodeSourceInformation? sourceInformation) {
     js.Expression asyncHelperCall =
         js.js("#asyncHelper(#value, #bodyName, #controller)", {
       "asyncHelper": asyncStarHelper,
@@ -2443,12 +2463,12 @@
   bool hasFinally = false;
 
   // The function currently being analyzed.
-  js.Fun currentFunction;
+  late final js.Fun currentFunction;
 
   // For error messages.
-  final Function unsupported;
+  final Never Function(js.Node) unsupported;
 
-  PreTranslationAnalysis(void this.unsupported(js.Node node));
+  PreTranslationAnalysis(this.unsupported);
 
   bool visit(js.Node node) {
     bool containsAwait = node.accept(this);
@@ -2573,14 +2593,13 @@
     if (node.targetLabel != null) {
       js.LabeledStatement targetLabel = labelledStatements.lastWhere(
           (js.LabeledStatement stm) => stm.label == node.targetLabel);
-      js.Loop targetStatement = targetLabel.body;
-      targets[node] = targetStatement;
+      targets[node] = targetLabel.body;
     } else {
       targets[node] =
           loopsAndSwitches.lastWhere((js.Node node) => node is! js.Switch);
     }
     assert(() {
-      js.Node target = targets[node];
+      js.Node? target = targets[node];
       return target is js.Loop ||
           (target is js.LabeledStatement && target.body is js.Loop);
     }());
@@ -2613,9 +2632,9 @@
 
   @override
   bool visitFor(js.For node) {
-    bool init = (node.init == null) ? false : visit(node.init);
-    bool condition = (node.condition == null) ? false : visit(node.condition);
-    bool update = (node.update == null) ? false : visit(node.update);
+    bool init = (node.init == null) ? false : visit(node.init!);
+    bool condition = (node.condition == null) ? false : visit(node.condition!);
+    bool update = (node.update == null) ? false : visit(node.update!);
     loopsAndSwitches.add(node);
     bool body = visit(node.body);
     loopsAndSwitches.removeLast();
@@ -2661,32 +2680,32 @@
 
   @override
   bool visitInterpolatedExpression(js.InterpolatedExpression node) {
-    return unsupported(node);
+    unsupported(node);
   }
 
   @override
   bool visitInterpolatedDeclaration(js.InterpolatedDeclaration node) {
-    return unsupported(node);
+    unsupported(node);
   }
 
   @override
   bool visitInterpolatedLiteral(js.InterpolatedLiteral node) {
-    return unsupported(node);
+    unsupported(node);
   }
 
   @override
   bool visitInterpolatedParameter(js.InterpolatedParameter node) {
-    return unsupported(node);
+    unsupported(node);
   }
 
   @override
   bool visitInterpolatedSelector(js.InterpolatedSelector node) {
-    return unsupported(node);
+    unsupported(node);
   }
 
   @override
   bool visitInterpolatedStatement(js.InterpolatedStatement node) {
-    return unsupported(node);
+    unsupported(node);
   }
 
   @override
@@ -2705,7 +2724,7 @@
 
   @override
   bool visitDeferredStatement(js.DeferredStatement node) {
-    return unsupported(node);
+    unsupported(node);
   }
 
   @override
@@ -2725,7 +2744,7 @@
 
   @override
   bool visitLiteralExpression(js.LiteralExpression node) {
-    return unsupported(node);
+    unsupported(node);
   }
 
   @override
@@ -2740,7 +2759,7 @@
 
   @override
   bool visitLiteralStatement(js.LiteralStatement node) {
-    return unsupported(node);
+    unsupported(node);
   }
 
   @override
@@ -2823,7 +2842,7 @@
     hasExplicitReturns = true;
     targets[node] = currentFunction;
     if (node.value == null) return false;
-    return visit(node.value);
+    return visit(node.value!);
   }
 
   @override
@@ -2854,9 +2873,9 @@
   bool visitTry(js.Try node) {
     if (node.finallyPart != null) hasFinally = true;
     bool body = visit(node.body);
-    bool catchPart = (node.catchPart == null) ? false : visit(node.catchPart);
+    bool catchPart = (node.catchPart == null) ? false : visit(node.catchPart!);
     bool finallyPart =
-        (node.finallyPart == null) ? false : visit(node.finallyPart);
+        (node.finallyPart == null) ? false : visit(node.finallyPart!);
     return body || catchPart || finallyPart;
   }
 
@@ -2878,7 +2897,7 @@
   @override
   bool visitVariableInitialization(js.VariableInitialization node) {
     bool leftHandSide = visit(node.declaration);
-    bool value = (node.value == null) ? false : visit(node.value);
+    bool value = (node.value == null) ? false : visit(node.value!);
     return leftHandSide || value;
   }
 
diff --git a/pkg/compiler/lib/src/js_backend/runtime_types_codegen.dart b/pkg/compiler/lib/src/js_backend/runtime_types_codegen.dart
index 260e94b..6c462aa 100644
--- a/pkg/compiler/lib/src/js_backend/runtime_types_codegen.dart
+++ b/pkg/compiler/lib/src/js_backend/runtime_types_codegen.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.
 
-// @dart = 2.10
-
 library js_backend.runtime_types_codegen;
 
 import '../elements/entities.dart';
@@ -47,7 +45,7 @@
 class ClassChecks {
   final Map<ClassEntity, TypeCheck> _map;
 
-  final ClassFunctionType functionType;
+  final ClassFunctionType? functionType;
 
   ClassChecks(this.functionType) : _map = {};
 
@@ -63,7 +61,7 @@
     checks.forEach(add);
   }
 
-  TypeCheck operator [](ClassEntity cls) => _map[cls];
+  TypeCheck? operator [](ClassEntity cls) => _map[cls];
 
   Iterable<TypeCheck> get checks => _map.values;
 
@@ -94,7 +92,7 @@
   final bool isFunction;
   final List<DartType> arguments;
   final List<DartType> parameters;
-  final int length;
+  final int? length;
 
   const Substitution.trivial()
       : isTrivial = true,
diff --git a/pkg/compiler/lib/src/js_emitter/constant_ordering.dart b/pkg/compiler/lib/src/js_emitter/constant_ordering.dart
index 3103cb2..e6ad47a 100644
--- a/pkg/compiler/lib/src/js_emitter/constant_ordering.dart
+++ b/pkg/compiler/lib/src/js_emitter/constant_ordering.dart
@@ -182,8 +182,7 @@
       DeferredGlobalConstantValue a, DeferredGlobalConstantValue b) {
     int r = compareValues(a.referenced, b.referenced);
     if (r != 0) return r;
-    // TODO(48820): Should unit be non-nullable?
-    return a.unit!.compareTo(b.unit!);
+    return a.unit.compareTo(b.unit);
   }
 
   @override
diff --git a/pkg/compiler/lib/src/js_model/type_recipe.dart b/pkg/compiler/lib/src/js_model/type_recipe.dart
index f503312..5a31add 100644
--- a/pkg/compiler/lib/src/js_model/type_recipe.dart
+++ b/pkg/compiler/lib/src/js_model/type_recipe.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.
 
-// @dart = 2.10
-
 library dart2js.js_model.type_recipe;
 
 import '../elements/entities.dart' show ClassEntity;
@@ -39,7 +37,7 @@
   /// having structure [environmentStructure].
   ///
   /// May return `null` if the evaluation is too complex.
-  TypeRecipe foldLoadEval(TypeRecipe environmentRecipe,
+  TypeRecipe? foldLoadEval(TypeRecipe environmentRecipe,
       TypeEnvironmentStructure environmentStructure, TypeRecipe recipe);
 
   /// Partial constant folding of a type expression when the environment is
@@ -53,7 +51,7 @@
   /// evaluates against that structure to produce the same result.
   ///
   /// [bindArgument] must be a ground term, i.e. have no type variables.
-  TypeRecipeAndEnvironmentStructure foldBindLoadEval(
+  TypeRecipeAndEnvironmentStructure? foldBindLoadEval(
     TypeRecipe bindArgument,
     TypeEnvironmentStructure environmentStructure,
     TypeRecipe recipe,
@@ -63,7 +61,7 @@
   /// evaluated against [environmentStructure1]. ([recipe1] produces an
   /// intermediate type or environment value that conforms to the layout
   /// described by [environmentStructure2].)
-  TypeRecipeAndEnvironmentStructure foldEvalEval(
+  TypeRecipeAndEnvironmentStructure? foldEvalEval(
     TypeEnvironmentStructure environmentStructure1,
     TypeRecipe recipe1,
     TypeEnvironmentStructure environmentStructure2,
@@ -95,7 +93,8 @@
       }
       return false;
     }
-    return _sameFullStructure(a, b);
+    return _sameFullStructure(
+        a as FullTypeEnvironmentStructure, b as FullTypeEnvironmentStructure);
   }
 
   static bool _sameFullStructure(
@@ -124,7 +123,7 @@
 /// A type environment containing an interface type and/or a tuple of function
 /// type parameters.
 class FullTypeEnvironmentStructure extends TypeEnvironmentStructure {
-  final InterfaceType classType;
+  final InterfaceType? classType;
   final List<TypeVariableType> bindings;
 
   FullTypeEnvironmentStructure({this.classType, this.bindings = const []});
@@ -140,12 +139,10 @@
   /// data stream.
   static const String tag = 'type-recipe';
 
-  int /*?*/ _hashCode;
-
   TypeRecipe();
 
   @override
-  int get hashCode => _hashCode ??= _computeHashCode();
+  late final hashCode = _computeHashCode();
 
   int _computeHashCode();
 
@@ -273,7 +270,7 @@
   /// environments outside a class scope or a class scope where no supertype is
   /// generic, or where optimization has determined that no use of the
   /// environment requires any of the class type variables.
-  final InterfaceType classType;
+  final InterfaceType? classType;
 
   // Type expressions for the tuple of function type arguments.
   final List<DartType> types;
@@ -282,8 +279,7 @@
 
   static FullTypeEnvironmentRecipe _readFromDataSource(
       DataSourceReader source) {
-    InterfaceType /*?*/ classType =
-        source.readDartTypeOrNull() as InterfaceType /*?*/;
+    final classType = source.readDartTypeOrNull() as InterfaceType?;
     List<DartType> types = source.readDartTypes();
     return FullTypeEnvironmentRecipe(classType: classType, types: types);
   }
@@ -341,7 +337,7 @@
       TypeEnvironmentStructure environmentStructure, TypeRecipe recipe) {
     if (environmentStructure is FullTypeEnvironmentStructure &&
         environmentStructure.bindings.isEmpty) {
-      InterfaceType classType = environmentStructure.classType;
+      InterfaceType classType = environmentStructure.classType!;
       if (classType.element == classEntity) {
         if (recipe is TypeExpressionRecipe && recipe.type == classType) {
           return true;
@@ -352,7 +348,7 @@
   }
 
   @override
-  TypeRecipe foldLoadEval(TypeRecipe environmentRecipe,
+  TypeRecipe? foldLoadEval(TypeRecipe environmentRecipe,
       TypeEnvironmentStructure environmentStructure, TypeRecipe recipe) {
     if (environmentStructure is SingletonTypeEnvironmentStructure) {
       if (environmentRecipe is TypeExpressionRecipe) {
@@ -371,7 +367,7 @@
         if (environmentRecipe is TypeExpressionRecipe) {
           assert(environmentStructure.bindings.isEmpty);
           return _Substitution(_dartTypes, environmentStructure.classType,
-                  environmentRecipe.type, null, null)
+                  environmentRecipe.type as InterfaceType, null, null)
               .substituteRecipe(recipe);
         }
         return null;
@@ -398,14 +394,14 @@
   }
 
   @override
-  TypeRecipeAndEnvironmentStructure foldBindLoadEval(TypeRecipe bindArgument,
+  TypeRecipeAndEnvironmentStructure? foldBindLoadEval(TypeRecipe bindArgument,
       TypeEnvironmentStructure environmentStructure, TypeRecipe recipe) {
     // 'Bind' adds variables to the environment. We fold 'bind' of a ground type
     // by removing the added variables and replacing them in the recipe with the
     // constant type values.
 
     if (environmentStructure is FullTypeEnvironmentStructure) {
-      List<DartType> replacements;
+      late final List<DartType> replacements;
       if (bindArgument is TypeExpressionRecipe) {
         // Bind call adds a single binding.
         replacements = [bindArgument.type];
@@ -419,7 +415,7 @@
       int index = bindings.length - replacements.length;
       List<TypeVariableType> replacedVariables = bindings.sublist(index);
       List<TypeVariableType> remainingVariables = bindings.sublist(0, index);
-      TypeRecipe newRecipe =
+      TypeRecipe? newRecipe =
           _Substitution(_dartTypes, null, null, replacedVariables, replacements)
               .substituteRecipe(recipe);
       if (newRecipe == null) return null;
@@ -437,14 +433,14 @@
   }
 
   @override
-  TypeRecipeAndEnvironmentStructure foldEvalEval(
+  TypeRecipeAndEnvironmentStructure? foldEvalEval(
       TypeEnvironmentStructure environmentStructure1,
       TypeRecipe recipe1,
       TypeEnvironmentStructure environmentStructure2,
       TypeRecipe recipe2) {
     if (environmentStructure2 is SingletonTypeEnvironmentStructure &&
         recipe1 is TypeExpressionRecipe) {
-      TypeRecipe newRecipe = _Substitution(
+      TypeRecipe? newRecipe = _Substitution(
           _dartTypes,
           null,
           null,
@@ -458,8 +454,12 @@
     if (environmentStructure2 is FullTypeEnvironmentStructure &&
         recipe1 is TypeExpressionRecipe) {
       assert(environmentStructure2.bindings.isEmpty);
-      TypeRecipe newRecipe = _Substitution(_dartTypes,
-              environmentStructure2.classType, recipe1.type, null, null)
+      TypeRecipe? newRecipe = _Substitution(
+              _dartTypes,
+              environmentStructure2.classType,
+              recipe1.type as InterfaceType,
+              null,
+              null)
           .substituteRecipe(recipe2);
       if (newRecipe == null) return null;
       return TypeRecipeAndEnvironmentStructure(
@@ -468,7 +468,7 @@
 
     if (environmentStructure2 is FullTypeEnvironmentStructure &&
         recipe1 is FullTypeEnvironmentRecipe) {
-      TypeRecipe newRecipe = _Substitution(
+      TypeRecipe? newRecipe = _Substitution(
               _dartTypes,
               environmentStructure2.classType,
               recipe1.classType,
@@ -497,28 +497,29 @@
 class _Substitution extends DartTypeSubstitutionVisitor<Null> {
   @override
   final DartTypes dartTypes;
-  final Map<DartType, DartType> _lookupCache = {};
+  final Map<DartType, DartType?> _lookupCache = {};
   final Map<DartType, int> _counts = {};
   bool _failed = false;
 
-  final InterfaceType _classEnvironment;
-  final InterfaceType _classValue;
-  final List<TypeVariableType> _variables;
-  final List<DartType> _replacements;
+  final InterfaceType? _classEnvironment;
+  final InterfaceType? _classValue;
+  final List<TypeVariableType>? _variables;
+  final List<DartType>? _replacements;
 
   _Substitution(this.dartTypes, this._classEnvironment, this._classValue,
       this._variables, this._replacements)
       : assert(_variables?.length == _replacements?.length);
 
   // Returns `null` if declined.
-  TypeRecipe substituteRecipe(TypeRecipe recipe) {
+  TypeRecipe? substituteRecipe(TypeRecipe recipe) {
     if (recipe is TypeExpressionRecipe) {
       DartType result = _substituteType(recipe.type);
       if (_failed) return null;
       return TypeExpressionRecipe(result);
     }
     if (recipe is FullTypeEnvironmentRecipe) {
-      DartType newClass = _substitutePossiblyNullType(recipe.classType);
+      final newClass =
+          _substitutePossiblyNullType(recipe.classType) as InterfaceType?;
       List<DartType> newTypes = recipe.types.map(_substituteType).toList();
       if (_failed) return null;
       return FullTypeEnvironmentRecipe(classType: newClass, types: newTypes);
@@ -530,20 +531,20 @@
 
   DartType _substituteType(DartType type) => visit(type, null);
 
-  DartType _substitutePossiblyNullType(DartType type) =>
+  DartType? _substitutePossiblyNullType(DartType? type) =>
       type == null ? null : visit(type, null);
 
   // Returns `null` if not bound.
-  DartType _lookupTypeVariableType(TypeVariableType type) {
+  DartType? _lookupTypeVariableType(TypeVariableType type) {
     if (_variables != null) {
-      int index = _variables.indexOf(type);
-      if (index >= 0) return _replacements[index];
+      int index = _variables!.indexOf(type);
+      if (index >= 0) return _replacements![index];
     }
     if (_classEnvironment == null) return null;
 
-    if (_classEnvironment.element == _classValue.element) {
-      int index = _classEnvironment.typeArguments.indexOf(type);
-      if (index >= 0) return _classValue.typeArguments[index];
+    if (_classEnvironment!.element == _classValue?.element) {
+      int index = _classEnvironment!.typeArguments.indexOf(type);
+      if (index >= 0) return _classValue!.typeArguments[index];
       return null;
     }
     // TODO(sra): Lookup type variable of supertype (e.g. ListMixin.E of
@@ -555,7 +556,7 @@
   @override
   DartType substituteTypeVariableType(
       TypeVariableType variable, Null argument, bool freshReference) {
-    DartType replacement =
+    DartType? replacement =
         _lookupCache[variable] ??= _lookupTypeVariableType(variable);
     if (replacement == null) return variable; // not substituted.
     if (!freshReference) return replacement;
diff --git a/pkg/compiler/lib/src/kernel/front_end_adapter.dart b/pkg/compiler/lib/src/kernel/front_end_adapter.dart
index e86e6d3..26742da 100644
--- a/pkg/compiler/lib/src/kernel/front_end_adapter.dart
+++ b/pkg/compiler/lib/src/kernel/front_end_adapter.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.
 
-// @dart = 2.10
-
 /// Helper classes and methods to adapt between `package:compiler` and
 /// `package:front_end` APIs.
 library compiler.kernel.front_end_adapter;
@@ -49,7 +47,6 @@
     } catch (e) {
       throw fe.FileSystemException(uri, '$e');
     }
-    if (input == null) throw fe.FileSystemException(uri, "File not found");
     // TODO(sigmund): technically someone could provide dart2js with an input
     // that is not a SourceFile. Note that this assumption is also done in the
     // (non-kernel) ScriptLoader.
@@ -66,7 +63,6 @@
     } catch (e) {
       throw fe.FileSystemException(uri, '$e');
     }
-    if (input == null) throw fe.FileSystemException(uri, "File not found");
     return input.data;
   }
 
@@ -76,9 +72,8 @@
   @override
   Future<bool> exists() async {
     try {
-      api.Input input = await fs.inputProvider
-          .readFromUri(uri, inputKind: api.InputKind.binary);
-      return input != null;
+      await fs.inputProvider.readFromUri(uri, inputKind: api.InputKind.binary);
+      return true;
     } catch (e) {
       return false;
     }
@@ -93,9 +88,9 @@
 void reportFrontEndMessage(
     DiagnosticReporter reporter, fe.DiagnosticMessage message) {
   Spannable _getSpannable(fe.DiagnosticMessage message) {
-    Uri uri = fe.getMessageUri(message);
-    int offset = fe.getMessageCharOffset(message);
-    int length = fe.getMessageLength(message);
+    Uri? uri = fe.getMessageUri(message);
+    int offset = fe.getMessageCharOffset(message)!;
+    int length = fe.getMessageLength(message)!;
     if (uri != null && offset != -1) {
       return SourceSpan(uri, offset, offset + length);
     } else {
@@ -105,11 +100,12 @@
 
   DiagnosticMessage _convertMessage(fe.DiagnosticMessage message) {
     Spannable span = _getSpannable(message);
-    String text = fe.getMessageHeaderText(message);
-    return reporter.createMessage(span, MessageKind.GENERIC, {'text': text});
+    String? text = fe.getMessageHeaderText(message);
+    return reporter
+        .createMessage(span, MessageKind.GENERIC, {'text': text ?? ''});
   }
 
-  List<fe.DiagnosticMessage> relatedInformation =
+  Iterable<fe.DiagnosticMessage>? relatedInformation =
       fe.getMessageRelatedInformation(message);
   DiagnosticMessage mainMessage = _convertMessage(message);
   List<DiagnosticMessage> infos = relatedInformation != null
diff --git a/pkg/compiler/lib/src/kernel/kelements.dart b/pkg/compiler/lib/src/kernel/kelements.dart
index 1731db7..b2a7409 100644
--- a/pkg/compiler/lib/src/kernel/kelements.dart
+++ b/pkg/compiler/lib/src/kernel/kelements.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.
 
-// @dart = 2.10
-
 /// Entity model for elements derived from Kernel IR.
 
 import 'package:kernel/ast.dart' as ir;
@@ -35,9 +33,9 @@
   @override
   final String name;
   @override
-  final bool /*!*/ isAbstract;
+  final bool isAbstract;
 
-  KClass(this.library, this.name, {/*required*/ this.isAbstract});
+  KClass(this.library, this.name, {required this.isAbstract});
 
   @override
   bool get isClosure => false;
@@ -50,7 +48,7 @@
   @override
   final KLibrary library;
   @override
-  final KClass enclosingClass;
+  final KClass? enclosingClass;
   final Name _name;
   final bool _isStatic;
 
@@ -101,7 +99,7 @@
 
   @override
   String toString() => '${kElementPrefix}$_kind'
-      '(${enclosingClass != null ? '${enclosingClass.name}.' : ''}$name)';
+      '(${enclosingClass != null ? '${enclosingClass!.name}.' : ''}$name)';
 }
 
 abstract class KFunction extends KMember
@@ -123,10 +121,12 @@
     implements ConstructorEntity, IndexedConstructor {
   @override
   final bool isConst;
+  @override
+  KClass enclosingClass;
 
   KConstructor(
-      KClass enclosingClass, Name name, ParameterStructure parameterStructure,
-      {bool isExternal, this.isConst})
+      this.enclosingClass, Name name, ParameterStructure parameterStructure,
+      {required bool isExternal, required this.isConst})
       : super(enclosingClass.library, enclosingClass, name, parameterStructure,
             AsyncMarker.SYNC,
             isExternal: isExternal);
@@ -153,7 +153,7 @@
 class KGenerativeConstructor extends KConstructor {
   KGenerativeConstructor(
       KClass enclosingClass, Name name, ParameterStructure parameterStructure,
-      {bool isExternal, bool isConst})
+      {required bool isExternal, required bool isConst})
       : super(enclosingClass, name, parameterStructure,
             isExternal: isExternal, isConst: isConst);
 
@@ -166,11 +166,13 @@
 
 class KFactoryConstructor extends KConstructor {
   @override
-  final bool /*!*/ isFromEnvironmentConstructor;
+  final bool isFromEnvironmentConstructor;
 
   KFactoryConstructor(
       KClass enclosingClass, Name name, ParameterStructure parameterStructure,
-      {bool isExternal, bool isConst, this.isFromEnvironmentConstructor})
+      {required bool isExternal,
+      required bool isConst,
+      required this.isFromEnvironmentConstructor})
       : super(enclosingClass, name, parameterStructure,
             isExternal: isExternal, isConst: isConst);
 
@@ -187,9 +189,9 @@
 
   KMethod(KLibrary library, KClass enclosingClass, Name name,
       ParameterStructure parameterStructure, AsyncMarker asyncMarker,
-      {/*required*/ bool isStatic,
-      /*required*/ bool isExternal,
-      /*required*/ this.isAbstract})
+      {required bool isStatic,
+      required bool isExternal,
+      required this.isAbstract})
       : super(library, enclosingClass, name, parameterStructure, asyncMarker,
             isStatic: isStatic, isExternal: isExternal);
 
@@ -206,9 +208,9 @@
 
   KGetter(KLibrary library, KClass enclosingClass, Name name,
       AsyncMarker asyncMarker,
-      {/*required*/ bool isStatic,
-      /*required*/ bool isExternal,
-      /*required*/ this.isAbstract})
+      {required bool isStatic,
+      required bool isExternal,
+      required this.isAbstract})
       : super(library, enclosingClass, name, ParameterStructure.getter,
             asyncMarker,
             isStatic: isStatic, isExternal: isExternal);
@@ -225,9 +227,9 @@
   final bool isAbstract;
 
   KSetter(KLibrary library, KClass enclosingClass, Name name,
-      {/*required*/ bool isStatic,
-      /*required*/ bool isExternal,
-      /*required*/ this.isAbstract})
+      {required bool isStatic,
+      required bool isExternal,
+      required this.isAbstract})
       : super(library, enclosingClass, name, ParameterStructure.setter,
             AsyncMarker.SYNC,
             isStatic: isStatic, isExternal: isExternal);
@@ -249,9 +251,9 @@
   final bool isConst;
 
   KField(KLibrary library, KClass enclosingClass, Name name,
-      {/*required*/ bool isStatic,
-      /*required*/ this.isAssignable,
-      /*required*/ this.isConst})
+      {required bool isStatic,
+      required this.isAssignable,
+      required this.isConst})
       : super(library, enclosingClass, name, isStatic: isStatic);
 
   @override
@@ -278,11 +280,11 @@
 
 class KLocalFunction implements Local {
   @override
-  final String name;
+  final String? name;
   final MemberEntity memberContext;
   final Entity executableContext;
   final ir.LocalFunction node;
-  /*late final*/ FunctionType functionType;
+  late final FunctionType functionType;
 
   KLocalFunction(
       this.name, this.memberContext, this.executableContext, this.node);
@@ -299,8 +301,8 @@
   final String name;
   @override
   final int index;
-  /*late final*/ DartType bound;
-  /*late final*/ DartType defaultType;
+  late final DartType bound;
+  late final DartType defaultType;
 
   KLocalTypeVariable(this.typeDeclaration, this.name, this.index);
 
diff --git a/pkg/compiler/lib/src/ordered_typeset.dart b/pkg/compiler/lib/src/ordered_typeset.dart
index 62b0eef..d8e8b07 100644
--- a/pkg/compiler/lib/src/ordered_typeset.dart
+++ b/pkg/compiler/lib/src/ordered_typeset.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.
 
-// @dart = 2.10
-
 library ordered_typeset;
 
 import 'package:front_end/src/api_unstable/dart2js.dart'
@@ -35,9 +33,9 @@
   static const String tag = 'ordered-type-set';
 
   final List<Link<InterfaceType>> _levels;
-  final Link<InterfaceType> types;
+  final LinkEntry<InterfaceType> types;
 
-  OrderedTypeSet.internal(this._levels, this.types);
+  OrderedTypeSet._(this._levels, this.types);
 
   /// Deserializes a [OrderedTypeSet] object from [source].
   factory OrderedTypeSet.readFromDataSource(DataSourceReader source) {
@@ -48,20 +46,19 @@
     LinkBuilder<InterfaceType> typeLinkBuilder = LinkBuilder<InterfaceType>();
     List<Link<InterfaceType>> links = [];
     for (int i = 0; i < typesCount; i++) {
-      links.add(typeLinkBuilder.addLast(source.readDartType()));
+      links
+          .add(typeLinkBuilder.addLast(source.readDartType() as InterfaceType));
     }
-    Link<InterfaceType> types =
-        typeLinkBuilder.toLink(const Link<InterfaceType>());
+    final types = typeLinkBuilder.toLink(const Link<InterfaceType>())
+        as LinkEntry<InterfaceType>;
     links.add(const Link<InterfaceType>());
 
     int levelCount = source.readInt();
-    List<Link<InterfaceType>> levels =
-        List<Link<InterfaceType>>.filled(levelCount, null);
-    for (int i = 0; i < levelCount; i++) {
-      levels[i] = links[source.readInt()];
-    }
+    List<Link<InterfaceType>> levels = List<Link<InterfaceType>>.generate(
+        levelCount, (index) => links[source.readInt()],
+        growable: false);
     source.end(tag);
-    return OrderedTypeSet.internal(levels, types);
+    return OrderedTypeSet._(levels, types);
   }
 
   /// Serializes this [OrderedTypeSet] to [sink].
@@ -73,7 +70,7 @@
       sink.writeDartType(type);
     }
     List<int> levelList = [];
-    Link<InterfaceType> link = types;
+    Link<InterfaceType>? link = types;
     while (link != null) {
       int index = _levels.indexOf(link);
       if (index != -1) {
@@ -89,11 +86,9 @@
   }
 
   factory OrderedTypeSet.singleton(InterfaceType type) {
-    Link<InterfaceType> types =
-        LinkEntry<InterfaceType>(type, const Link<InterfaceType>());
-    List<Link<InterfaceType>> list = List<Link<InterfaceType>>.filled(1, null);
-    list[0] = types;
-    return OrderedTypeSet.internal(list, types);
+    final types = LinkEntry<InterfaceType>(type, const Link<InterfaceType>());
+    List<Link<InterfaceType>> list = List<Link<InterfaceType>>.filled(1, types);
+    return OrderedTypeSet._(list, types);
   }
 
   /// Creates a new [OrderedTypeSet] for [type] when it directly extends the
@@ -106,17 +101,13 @@
             type.element,
             'Cannot extend generic class ${types.head} using '
             'OrderedTypeSet.extendClass'));
-    Link<InterfaceType> extendedTypes = LinkEntry<InterfaceType>(type, types);
+    final extendedTypes = LinkEntry<InterfaceType>(type, types);
     List<Link<InterfaceType>> list =
-        List<Link<InterfaceType>>.filled(levels + 1, null);
-    for (int i = 0; i < levels; i++) {
-      list[i] = _levels[i];
-    }
-    list[levels] = extendedTypes;
-    return OrderedTypeSet.internal(list, extendedTypes);
+        _levels.followedBy([extendedTypes]).toList(growable: false);
+    return OrderedTypeSet._(list, extendedTypes);
   }
 
-  Link<InterfaceType> get supertypes => types.tail;
+  Link<InterfaceType>? get supertypes => types.tail;
 
   int get levels => _levels.length;
 
@@ -136,7 +127,7 @@
     Link<InterfaceType> pointer = types;
     for (int depth = maxDepth; depth >= 0; depth--) {
       while (!identical(pointer, _levels[depth])) {
-        pointer = pointer.tail;
+        pointer = pointer.tail!;
         offset++;
       }
       offsets[depth] = offset;
@@ -153,12 +144,12 @@
       // constants are properly canonicalized
       while (pointer.isNotEmpty && !identical(pointer, end)) {
         f(pointer.head);
-        pointer = pointer.tail;
+        pointer = pointer.tail!;
       }
     }
   }
 
-  InterfaceType asInstanceOf(ClassEntity cls, int hierarchyDepth) {
+  InterfaceType? asInstanceOf(ClassEntity cls, int hierarchyDepth) {
     int level = hierarchyDepth;
     if (level < levels) {
       Link<InterfaceType> pointer = _levels[level];
@@ -170,7 +161,7 @@
         if (cls == pointer.head.element) {
           return pointer.head;
         }
-        pointer = pointer.tail;
+        pointer = pointer.tail!;
       }
     }
     return null;
@@ -231,20 +222,19 @@
   }
 
   void _addAtDepth(InterfaceType type, int depth) {
-    LinkEntry<InterfaceType> prev = null;
-    LinkEntry<InterfaceType> link = map[depth];
-    while (link != null) {
+    LinkEntry<InterfaceType>? prev;
+    Link<InterfaceType>? link = map[depth];
+    while (link != null && link is LinkEntry) {
       InterfaceType existingType = link.head;
       if (existingType == type) return;
       if (existingType.element == type.element) {
         assert(false, failedAt(cls, 'Invalid ordered typeset for $cls'));
         return;
       }
-      prev = link;
+      prev = link as LinkEntry<InterfaceType>;
       link = link.tail;
     }
     LinkEntry<InterfaceType> next = LinkEntry<InterfaceType>(type);
-    next.tail = null;
     if (prev == null) {
       map[depth] = next;
     } else {
@@ -256,27 +246,26 @@
   }
 
   OrderedTypeSet toTypeSet() {
-    List<Link<InterfaceType>> levels =
-        List<Link<InterfaceType>>.filled(maxDepth + 1, null);
-    if (maxDepth < 0) {
-      return OrderedTypeSet.internal(levels, const Link<InterfaceType>());
-    }
+    assert(maxDepth >= 0);
     Link<InterfaceType> next = const Link<InterfaceType>();
-    for (int depth = 0; depth <= maxDepth; depth++) {
-      LinkEntry<InterfaceType> first = map[depth];
+
+    List<Link<InterfaceType>> levels =
+        List<Link<InterfaceType>>.generate(maxDepth + 1, (depth) {
+      LinkEntry<InterfaceType>? first = map[depth];
       if (first == null) {
-        levels[depth] = next;
+        return next;
       } else {
-        levels[depth] = first;
+        final value = first;
         LinkEntry<InterfaceType> last = first;
-        while (last.tail != null) {
-          last = last.tail;
+        while (last.tail != const Link<Never>()) {
+          last = last.tail as LinkEntry<InterfaceType>;
         }
         last.tail = next;
         next = first;
+        return value;
       }
-    }
-    return OrderedTypeSet.internal(levels, levels.last);
+    });
+    return OrderedTypeSet._(levels, levels.last as LinkEntry<InterfaceType>);
   }
 
   @override
@@ -284,7 +273,7 @@
     StringBuffer sb = StringBuffer();
     for (int depth = 0; depth <= maxDepth; depth++) {
       sb.write('$depth: ');
-      LinkEntry<InterfaceType> first = map[depth];
+      LinkEntry<InterfaceType> first = map[depth]!;
       first.printOn(sb, ", ");
       sb.write('\n');
     }
diff --git a/pkg/compiler/lib/src/ssa/builder.dart b/pkg/compiler/lib/src/ssa/builder.dart
index dda60e0..03d96d5 100644
--- a/pkg/compiler/lib/src/ssa/builder.dart
+++ b/pkg/compiler/lib/src/ssa/builder.dart
@@ -599,7 +599,7 @@
           field, parameter, type);
       // TODO(sra): Pass source information to
       // [potentiallyCheckOrTrustTypeOfParameter].
-      // TODO(sra): The source information should indiciate the field and
+      // TODO(sra): The source information should indicate the field and
       // possibly its type but not the initializer.
       value.sourceInformation ??= _sourceInformationBuilder.buildSet(node);
       value = _potentiallyAssertNotNull(field, node, value, type);
@@ -1812,7 +1812,7 @@
     _handleInTryStatement();
     if (_inliningStack.isEmpty && targetElement.isSetter) {
       if (node.parent is ir.FunctionNode) {
-        // An arrow function definition of a setter has a ReturnStatemnt as a
+        // An arrow function definition of a setter has a ReturnStatement as a
         // body, e.g. "set foo(x) => this._x = x;". There is no way to access
         // the returned value, so don't emit a return.
         return;
@@ -1964,7 +1964,7 @@
       // moved to the loop update.
 
       // Find a type for the element. Use the element type of the indexer of the
-      // array, as this is stronger than the iterator's `get current` type, for
+      // array, as this is stronger than the Iterator's `get current` type, for
       // example, `get current` includes null.
       // TODO(sra): The element type of a container type mask might be better.
       AbstractValue type = _typeInferenceMap.inferredIndexType(node);
@@ -3021,7 +3021,7 @@
         localsHandler = savedLocals.mergeMultiple(caseHandlers, joinBlock);
       }
     } else {
-      // The joinblock is not used.
+      // The joinBlock is not used.
       joinBlock = null;
     }
 
@@ -4313,7 +4313,7 @@
           } else {
             reporter.internalError(
                 computeSourceSpanFromTreeNode(invocation),
-                "Unexpected named arguments value in createInvocationMirrror: "
+                "Unexpected named arguments value in createInvocationMirror: "
                 "${namedArgumentsLiteral}.");
           }
           CallStructure callStructure = CallStructure(
@@ -5669,10 +5669,6 @@
 
   void _pushIsTest(ir.DartType type, HInstruction expression,
       SourceInformation sourceInformation) {
-    // Note: The call to "unalias" this type like in the original SSA builder is
-    // unnecessary in kernel because Kernel has no notion of typedef.
-    // TODO(efortuna): Add test for this.
-
     if (type is ir.InvalidType) {
       // TODO(sra): Make InvalidType carry a message.
       _generateTypeError('invalid type', sourceInformation);
@@ -7638,7 +7634,7 @@
     // In addition to the initializer expressions and body calls, there is an
     // allocator call.
     if (hasCallToSomeConstructorBody) {
-      // A temporary is requried so we have
+      // A temporary is required so we have
       //
       //     t=new ...;
       //     ...;
@@ -7646,7 +7642,7 @@
       //
       // I'm guessing it takes about 4 nodes to introduce the temporary and
       // assign it.
-      registerRegularNode(4); // A temporary is requried.
+      registerRegularNode(4); // A temporary is required.
     }
     // The initial field values are passed to the allocator.
     registerRegularNode(
diff --git a/pkg/compiler/lib/src/ssa/codegen.dart b/pkg/compiler/lib/src/ssa/codegen.dart
index 442efaf..10bb620 100644
--- a/pkg/compiler/lib/src/ssa/codegen.dart
+++ b/pkg/compiler/lib/src/ssa/codegen.dart
@@ -1887,7 +1887,7 @@
     List<js.Expression> arguments = visitArguments(node.inputs);
     MemberEntity target = node.element;
 
-    // TODO(herhut): The namer should return the appropriate backendname here.
+    // TODO(herhut): The namer should return the appropriate backend name here.
     if (target != null && !node.isInterceptedCall) {
       if (target == _commonElements.jsArrayAdd) {
         methodName = 'push';
@@ -2120,7 +2120,7 @@
     if (_commonElements.isCheckConcurrentModificationError(element)) {
       // Manually inline the [checkConcurrentModificationError] function.  This
       // function is only called from a for-loop update.  Ideally we would just
-      // generate the conditionalcontrol flow in the builder but it adds basic
+      // generate the conditional control flow in the builder but it adds basic
       // blocks in the loop update that interfere with other optimizations and
       // confuses loop recognition.
 
@@ -2384,16 +2384,16 @@
       }
       if (target.isStatic || target.isTopLevel) {
         var arguments = visitArguments(inputs, start: 0);
-        js.Expression targeExpression =
+        js.Expression targetExpression =
             js.js.uncachedExpressionTemplate(targetName).instantiate([]);
         js.Expression expression;
         if (target.isGetter) {
-          expression = targeExpression;
+          expression = targetExpression;
         } else if (target.isSetter) {
-          expression = js.js('# = #', [targeExpression, inputs.single]);
+          expression = js.js('# = #', [targetExpression, inputs.single]);
         } else {
           assert(target.isFunction);
-          expression = js.js('#(#)', [targeExpression, arguments]);
+          expression = js.js('#(#)', [targetExpression, arguments]);
         }
         push(expression.withSourceInformation(node.sourceInformation));
         _registry.registerNativeMethod(target);
@@ -3186,7 +3186,7 @@
 
       case IsTestSpecialization.instanceof:
         DartType dartType = node.dartType;
-        // We don't generate instancof specializations for Never* and Object*.
+        // We don't generate instanceof specializations for Never* and Object*.
         assert(dartType is InterfaceType ||
             (dartType is LegacyType &&
                 !dartType.baseType.isObject &&
diff --git a/pkg/compiler/lib/src/universe/class_set.dart b/pkg/compiler/lib/src/universe/class_set.dart
index a527f69..e5ccc33 100644
--- a/pkg/compiler/lib/src/universe/class_set.dart
+++ b/pkg/compiler/lib/src/universe/class_set.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.
 
-// @dart = 2.10
-
 library dart2js.world.class_set;
 
 import 'dart:collection' show IterableBase, MapBase;
@@ -99,14 +97,14 @@
     return mask;
   }
 
-  final ClassHierarchyNode parentNode;
+  final ClassHierarchyNode? parentNode;
   final EnumSet<Instantiation> _mask =
       EnumSet.fromValues(const [Instantiation.UNINSTANTIATED]);
   final IndexedClass cls;
 
   final int hierarchyDepth;
 
-  ClassEntity _leastUpperInstantiatedSubclass;
+  ClassEntity? _leastUpperInstantiatedSubclass;
   int _instantiatedSubclassCount = 0;
 
   /// `true` if [cls] has been directly instantiated.
@@ -152,8 +150,8 @@
       isDirectlyInstantiated || isAbstractlyInstantiated;
 
   void _updateParentInstantiatedSubclassCount(Instantiation instantiation,
-      {bool add}) {
-    ClassHierarchyNode parent = parentNode;
+      {required bool add}) {
+    ClassHierarchyNode? parent = parentNode;
     if (add) {
       _mask.remove(Instantiation.UNINSTANTIATED);
       _mask.add(instantiation);
@@ -209,7 +207,7 @@
 
   ClassHierarchyNode(this.parentNode, this.cls, this.hierarchyDepth) {
     if (parentNode != null) {
-      parentNode.addDirectSubclass(this);
+      parentNode!.addDirectSubclass(this);
     }
   }
 
@@ -217,13 +215,11 @@
   factory ClassHierarchyNode.readFromDataSource(
       DataSourceReader source, Map<ClassEntity, ClassHierarchyNode> nodeMap) {
     source.begin(tag);
-    IndexedClass cls = source.readClass();
-    ClassHierarchyNode parentNode;
-    IndexedClass superclass = source.readClassOrNull();
+    IndexedClass cls = source.readClass() as IndexedClass;
+    ClassHierarchyNode? parentNode;
+    final superclass = source.readClassOrNull() as IndexedClass?;
     if (superclass != null) {
-      parentNode = nodeMap[superclass];
-      assert(parentNode != null,
-          "No ClassHierarchyNode for superclass $superclass.");
+      parentNode = nodeMap[superclass]!;
     }
     int maskValue = source.readInt();
     int hierarchyDepth = source.readInt();
@@ -256,7 +252,7 @@
   /// Returns `true` if [other] is contained in the subtree of this node.
   ///
   /// This means that [other] is a subclass of [cls].
-  bool contains(ClassHierarchyNode other) {
+  bool contains(ClassHierarchyNode? other) {
     while (other != null) {
       if (cls == other.cls) return true;
       if (hierarchyDepth >= other.hierarchyDepth) return false;
@@ -314,9 +310,9 @@
   /// continues. The return value of the function is either [ForEach.STOP], if
   /// visitation was stopped, or [ForEach.CONTINUE] if visitation continued to
   /// the end.
-  IterationStep forEachSubclass(ForEachFunction f, EnumSet<Instantiation> mask,
+  IterationStep? forEachSubclass(ForEachFunction f, EnumSet<Instantiation> mask,
       {bool strict = false}) {
-    IterationStep nextStep;
+    IterationStep? nextStep;
     if (!strict && mask.intersects(_mask)) {
       nextStep = f(cls);
     }
@@ -326,7 +322,7 @@
     if (nextStep == IterationStep.CONTINUE) {
       if (mask.contains(Instantiation.UNINSTANTIATED) || isInstantiated) {
         for (ClassHierarchyNode subclass in _directSubclasses) {
-          IterationStep subForEach = subclass.forEachSubclass(f, mask);
+          IterationStep? subForEach = subclass.forEachSubclass(f, mask);
           if (subForEach == IterationStep.STOP) {
             return subForEach;
           }
@@ -342,7 +338,7 @@
   /// Returns the most specific subclass of [cls] (including [cls]) that is
   /// directly instantiated or a superclass of all directly instantiated
   /// subclasses. If [cls] is not instantiated, `null` is returned.
-  ClassEntity getLubOfInstantiatedSubclasses() {
+  ClassEntity? getLubOfInstantiatedSubclasses() {
     if (!isInstantiated) return null;
     if (_leastUpperInstantiatedSubclass == null) {
       _leastUpperInstantiatedSubclass =
@@ -351,14 +347,14 @@
     return _leastUpperInstantiatedSubclass;
   }
 
-  ClassEntity _computeLeastUpperInstantiatedSubclass() {
+  ClassEntity? _computeLeastUpperInstantiatedSubclass() {
     if (isExplicitlyInstantiated) {
       return cls;
     }
     if (!isInstantiated) {
       return null;
     }
-    ClassHierarchyNode subclass;
+    ClassHierarchyNode? subclass;
     for (ClassHierarchyNode node in _directSubclasses) {
       if (node.isInstantiated) {
         if (subclass == null) {
@@ -377,7 +373,7 @@
   void printOn(StringBuffer sb, String indentation,
       {bool instantiatedOnly = false,
       bool sorted = true,
-      ClassEntity withRespectTo}) {
+      ClassEntity? withRespectTo}) {
     bool isRelatedTo(ClassEntity _subclass) {
       return true;
       // TODO(johnniwinther): Support this for kernel based elements:
@@ -442,7 +438,7 @@
   String dump(
       {String indentation = '',
       bool instantiatedOnly = false,
-      ClassEntity withRespectTo}) {
+      ClassEntity? withRespectTo}) {
     StringBuffer sb = StringBuffer();
     printOn(sb, indentation,
         instantiatedOnly: instantiatedOnly, withRespectTo: withRespectTo);
@@ -503,7 +499,7 @@
   static const String tag = 'class-set';
 
   final ClassHierarchyNode node;
-  ClassEntity _leastUpperInstantiatedSubtype;
+  ClassEntity? _leastUpperInstantiatedSubtype;
 
   /// A list of the class hierarchy nodes for the subtypes that declare a
   /// subtype relationship to [cls] either directly or indirectly.
@@ -521,7 +517,7 @@
   /// directly. `E` also implements `A` through its extension of `D` and it is
   /// therefore included through the class hierarchy node for `D`.
   ///
-  List<ClassHierarchyNode> _subtypes;
+  List<ClassHierarchyNode>? _subtypes;
 
   /// A list of the class hierarchy nodes for the class that directly mix in
   /// [cls].
@@ -537,7 +533,7 @@
   /// The class hierarchy nodes for the unnamed mixin application `Object+A` and
   /// the named mixin application `C` are in [_mixinApplications].
   ///
-  List<ClassHierarchyNode> _mixinApplications;
+  List<ClassHierarchyNode>? _mixinApplications;
 
   ClassSet(this.node);
 
@@ -545,12 +541,12 @@
   factory ClassSet.readFromDataSource(
       DataSourceReader source, Map<ClassEntity, ClassHierarchyNode> nodeMap) {
     source.begin(tag);
-    ClassHierarchyNode node = nodeMap[source.readClass()];
-    List<ClassHierarchyNode> subtypes = source.readListOrNull(() {
-      return nodeMap[source.readClass()];
+    ClassHierarchyNode node = nodeMap[source.readClass()]!;
+    List<ClassHierarchyNode>? subtypes = source.readListOrNull(() {
+      return nodeMap[source.readClass()]!;
     });
-    List<ClassHierarchyNode> mixinApplications = source.readListOrNull(() {
-      return nodeMap[source.readClass()];
+    List<ClassHierarchyNode>? mixinApplications = source.readListOrNull(() {
+      return nodeMap[source.readClass()]!;
     });
     source.end(tag);
     return ClassSet(node)
@@ -580,7 +576,7 @@
   bool hasSubtype(ClassHierarchyNode other) {
     if (hasSubclass(other)) return true;
     if (_subtypes != null) {
-      for (ClassHierarchyNode subtypeNode in _subtypes) {
+      for (ClassHierarchyNode subtypeNode in _subtypes!) {
         if (subtypeNode.hasSubclass(other)) return true;
       }
     }
@@ -591,7 +587,7 @@
   int get instantiatedSubtypeCount {
     int count = node.instantiatedSubclassCount;
     if (_subtypes != null) {
-      for (ClassHierarchyNode subtypeNode in _subtypes) {
+      for (ClassHierarchyNode subtypeNode in _subtypes!) {
         if (subtypeNode.isExplicitlyInstantiated) {
           count++;
         }
@@ -605,7 +601,7 @@
   /// [cls].
   bool get hasOnlyInstantiatedSubclasses {
     if (_subtypes != null) {
-      for (ClassHierarchyNode subtypeNode in _subtypes) {
+      for (ClassHierarchyNode subtypeNode in _subtypes!) {
         if (subtypeNode.isInstantiated) {
           return false;
         }
@@ -696,7 +692,7 @@
   /// continues. The return value of the function is either [ForEach.STOP], if
   /// visitation was stopped, or [ForEach.CONTINUE] if visitation continued to
   /// the end.
-  IterationStep forEachSubclass(ForEachFunction f, EnumSet<Instantiation> mask,
+  IterationStep? forEachSubclass(ForEachFunction f, EnumSet<Instantiation> mask,
       {bool strict = false}) {
     return node.forEachSubclass(f, mask, strict: strict);
   }
@@ -731,13 +727,13 @@
   /// continues. The return value of the function is either [ForEach.STOP], if
   /// visitation was stopped, or [ForEach.CONTINUE] if visitation continued to
   /// the end.
-  IterationStep forEachSubtype(ForEachFunction f, EnumSet<Instantiation> mask,
+  IterationStep? forEachSubtype(ForEachFunction f, EnumSet<Instantiation> mask,
       {bool strict = false}) {
     IterationStep nextStep =
         node.forEachSubclass(f, mask, strict: strict) ?? IterationStep.CONTINUE;
     if (nextStep == IterationStep.CONTINUE && _subtypes != null) {
-      for (ClassHierarchyNode subclass in _subtypes) {
-        IterationStep subForEach = subclass.forEachSubclass(f, mask);
+      for (ClassHierarchyNode subclass in _subtypes!) {
+        IterationStep? subForEach = subclass.forEachSubclass(f, mask);
         if (subForEach == IterationStep.STOP) {
           return subForEach;
         }
@@ -758,7 +754,7 @@
       int hierarchyDepth = subtype.hierarchyDepth;
       List<ClassHierarchyNode> newSubtypes = [];
       bool added = false;
-      for (ClassHierarchyNode otherSubtype in _subtypes) {
+      for (ClassHierarchyNode otherSubtype in _subtypes!) {
         int otherHierarchyDepth = otherSubtype.hierarchyDepth;
         if (hierarchyDepth == otherHierarchyDepth) {
           if (subtype == otherSubtype) {
@@ -805,23 +801,23 @@
   /// Returns the most specific subtype of [cls] (including [cls]) that is
   /// directly instantiated or a superclass of all directly instantiated
   /// subtypes. If no subtypes of [cls] are instantiated, `null` is returned.
-  ClassEntity getLubOfInstantiatedSubtypes() {
+  ClassEntity? getLubOfInstantiatedSubtypes() {
     return _leastUpperInstantiatedSubtype ??=
         _computeLeastUpperInstantiatedSubtype();
   }
 
-  ClassEntity _computeLeastUpperInstantiatedSubtype() {
+  ClassEntity? _computeLeastUpperInstantiatedSubtype() {
     if (node.isExplicitlyInstantiated) {
       return cls;
     }
     if (_subtypes == null) {
       return node.getLubOfInstantiatedSubclasses();
     }
-    ClassHierarchyNode subtype;
+    ClassHierarchyNode? subtype;
     if (node.isInstantiated) {
       subtype = node;
     }
-    for (ClassHierarchyNode subnode in _subtypes) {
+    for (ClassHierarchyNode subnode in _subtypes!) {
       if (subnode.isInstantiated) {
         if (subtype == null) {
           subtype = subnode;
@@ -844,14 +840,14 @@
     sb.write('\n');
     if (_subtypes != null) {
       sb.write('  subtypes:\n');
-      for (ClassHierarchyNode node in _subtypes) {
+      for (ClassHierarchyNode node in _subtypes!) {
         node.printOn(sb, '  ');
         sb.write('\n');
       }
     }
     if (_mixinApplications != null) {
       sb.write('  mixin-applications:\n');
-      for (ClassHierarchyNode node in _mixinApplications) {
+      for (ClassHierarchyNode node in _mixinApplications!) {
         node.printOn(sb, '  ');
         sb.write('\n');
       }
@@ -867,9 +863,7 @@
   final EnumSet<Instantiation> mask;
   final bool includeRoot;
 
-  ClassHierarchyNodeIterable(this.root, this.mask, {this.includeRoot = true}) {
-    if (root == null) throw StateError("No root for iterable.");
-  }
+  ClassHierarchyNodeIterable(this.root, this.mask, {this.includeRoot = true});
 
   @override
   Iterator<ClassEntity> get iterator {
@@ -887,12 +881,12 @@
   ///
   /// This is `null` before the first call to [moveNext] and at the end of
   /// iteration, i.e. after [moveNext] has returned `false`.
-  ClassHierarchyNode currentNode;
+  ClassHierarchyNode? currentNode;
 
   /// Stack of pending class nodes.
   ///
   /// This is `null` before the first call to [moveNext].
-  List<ClassHierarchyNode> stack;
+  List<ClassHierarchyNode>? stack;
 
   ClassHierarchyNodeIterator(this.iterable);
 
@@ -908,7 +902,10 @@
 
   @override
   ClassEntity get current {
-    return currentNode?.cls;
+    // The [Iterator] spec allows for any behavior if current is not set yet
+    // (i.e. the iterator is in an invalid state). Therefore we can assert not
+    // null and allow this to throw.
+    return currentNode!.cls;
   }
 
   @override
@@ -927,24 +924,24 @@
   /// Find the next class using the [stack].
   bool _findNext() {
     while (true) {
-      if (stack.isEmpty) {
+      if (stack!.isEmpty) {
         // No more classes. Set [currentNode] to `null` to signal the end of
         // iteration.
         currentNode = null;
         return false;
       }
-      currentNode = stack.removeLast();
-      if (!includeUninstantiated && !currentNode.isInstantiated) {
+      currentNode = stack!.removeLast();
+      if (!includeUninstantiated && !currentNode!.isInstantiated) {
         // We're only iterating instantiated classes so there is no use in
         // visiting the current node and its subtree.
         continue;
       }
       // Add direct subclasses in reverse order so will visit them in the list
       // order.
-      for (int i = currentNode._directSubclasses.length - 1; i >= 0; i--) {
-        stack.add(currentNode._directSubclasses[i]);
+      for (int i = currentNode!._directSubclasses.length - 1; i >= 0; i--) {
+        stack!.add(currentNode!._directSubclasses[i]);
       }
-      if (_isValid(currentNode)) {
+      if (_isValid(currentNode!)) {
         return true;
       }
     }
@@ -973,8 +970,8 @@
 /// Iterator for the subtypes in a [ClassSet].
 class SubtypesIterator extends Iterator<ClassEntity> {
   final SubtypesIterable iterable;
-  Iterator<ClassEntity> elements;
-  Iterator<ClassHierarchyNode> hierarchyNodes;
+  Iterator<ClassEntity>? elements;
+  Iterator<ClassHierarchyNode>? hierarchyNodes;
 
   SubtypesIterator(this.iterable);
 
@@ -984,10 +981,9 @@
 
   @override
   ClassEntity get current {
-    if (elements != null) {
-      return elements.current;
-    }
-    return null;
+    // The [Iterator] spec says that the behavior is unspecified if current is
+    // unset because moveNext() has been called 0 times or too many times.
+    return elements!.current;
   }
 
   @override
@@ -998,16 +994,16 @@
           .subclassesByMask(mask, strict: !includeRoot)
           .iterator;
     }
-    if (elements != null && elements.moveNext()) {
+    if (elements != null && elements!.moveNext()) {
       return true;
     }
     if (hierarchyNodes == null) {
       // Start iterating through subtypes.
-      hierarchyNodes = iterable.subtypeSet._subtypes.iterator;
+      hierarchyNodes = iterable.subtypeSet._subtypes!.iterator;
     }
-    while (hierarchyNodes.moveNext()) {
-      elements = hierarchyNodes.current.subclassesByMask(mask).iterator;
-      if (elements.moveNext()) {
+    while (hierarchyNodes!.moveNext()) {
+      elements = hierarchyNodes!.current.subclassesByMask(mask).iterator;
+      if (elements!.moveNext()) {
         return true;
       }
     }
@@ -1037,7 +1033,7 @@
 /// Singleton map implemented as a field on the key.
 class ClassHierarchyNodesMap extends MapBase<ClassEntity, ClassHierarchyNode> {
   @override
-  ClassHierarchyNode operator [](Object cls) {
+  ClassHierarchyNode? operator [](Object? cls) {
     // TODO(sra): Change the key type to `covariant ClassHierarchyNodesMapKey`.
     if (cls is ClassHierarchyNodesMapKey) {
       return cls._classHierarchyNode;
@@ -1067,7 +1063,7 @@
   }
 
   @override
-  ClassHierarchyNode remove(Object key) {
+  ClassHierarchyNode remove(Object? key) {
     throw UnimplementedError('ClassHierarchyNodesMap.remove');
   }
 
@@ -1078,5 +1074,5 @@
 }
 
 abstract class ClassHierarchyNodesMapKey implements ClassEntity {
-  ClassHierarchyNode _classHierarchyNode;
+  ClassHierarchyNode? _classHierarchyNode;
 }
diff --git a/pkg/compiler/lib/src/universe/function_set.dart b/pkg/compiler/lib/src/universe/function_set.dart
index 13f48fc..2c723a3 100644
--- a/pkg/compiler/lib/src/universe/function_set.dart
+++ b/pkg/compiler/lib/src/universe/function_set.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.
 
-// @dart = 2.10
-
 library universe.function_set;
 
 import '../common/names.dart' show Identifiers, Selectors;
@@ -21,7 +19,7 @@
   factory FunctionSet(Iterable<MemberEntity> liveInstanceMembers) {
     Map<String, FunctionSetNode> nodes = {};
     for (MemberEntity member in liveInstanceMembers) {
-      String name = member.name;
+      String name = member.name!;
       (nodes[name] ??= FunctionSetNode(name)).add(member);
     }
     return FunctionSet.internal(nodes);
@@ -32,8 +30,8 @@
   bool contains(MemberEntity element) {
     assert(element.isInstanceMember);
     assert(!element.isAbstract);
-    String name = element.name;
-    FunctionSetNode node = _nodes[name];
+    String name = element.name!;
+    FunctionSetNode? node = _nodes[name];
     return (node != null) ? node.contains(element) : false;
   }
 
@@ -58,7 +56,7 @@
   }
 
   SelectorMask _createSelectorMask(
-      Selector selector, AbstractValue receiver, AbstractValueDomain domain) {
+      Selector selector, AbstractValue? receiver, AbstractValueDomain domain) {
     return receiver != null
         ? SelectorMask(selector, receiver)
         : SelectorMask(selector, domain.dynamicType);
@@ -73,8 +71,8 @@
     SelectorMask selectorMask = _createSelectorMask(selector, receiver, domain);
     SelectorMask noSuchMethodMask =
         SelectorMask(Selectors.noSuchMethod_, selectorMask.receiver);
-    FunctionSetNode node = _nodes[name];
-    FunctionSetNode noSuchMethods = _nodes[Identifiers.noSuchMethod_];
+    FunctionSetNode? node = _nodes[name];
+    FunctionSetNode? noSuchMethods = _nodes[Identifiers.noSuchMethod_];
     if (node != null) {
       return node.query(selectorMask, domain, noSuchMethods, noSuchMethodMask);
     }
@@ -103,9 +101,7 @@
 
   SelectorMask(this.selector, this.receiver)
       : this.hashCode =
-            Hashing.mixHashCodeBits(selector.hashCode, receiver.hashCode) {
-    assert(receiver != null);
-  }
+            Hashing.mixHashCodeBits(selector.hashCode, receiver.hashCode);
 
   String get name => selector.name;
 
@@ -160,10 +156,10 @@
         isList = false;
       }
       if (isList) {
-        List<MemberEntity> list = elements;
+        final list = elements as List<MemberEntity>;
         list.add(element);
       } else {
-        Set<MemberEntity> set = elements;
+        final set = elements as Set<MemberEntity>;
         set.add(element);
       }
       if (!cache.isEmpty) cache.clear();
@@ -173,7 +169,7 @@
   void remove(MemberEntity element) {
     assert(element.name == name);
     if (isList) {
-      List<MemberEntity> list = elements;
+      final list = elements as List<MemberEntity>;
       int index = list.indexOf(element);
       if (index < 0) return;
       MemberEntity last = list.removeLast();
@@ -182,7 +178,7 @@
       }
       if (!cache.isEmpty) cache.clear();
     } else {
-      Set<MemberEntity> set = elements;
+      final set = elements as List<MemberEntity>;
       if (set.remove(element)) {
         // To avoid wobbling between the two representations, we do
         // not transition back to the list representation even if we
@@ -204,12 +200,12 @@
   /// Returns the set of functions that can be the target of [selectorMask]
   /// including no such method handling where applicable.
   FunctionSetQuery query(SelectorMask selectorMask, AbstractValueDomain domain,
-      [FunctionSetNode noSuchMethods, SelectorMask noSuchMethodMask]) {
+      [FunctionSetNode? noSuchMethods, SelectorMask? noSuchMethodMask]) {
     assert(selectorMask.name == name);
-    FunctionSetQuery result = cache[selectorMask];
+    FunctionSetQuery? result = cache[selectorMask];
     if (result != null) return result;
 
-    Setlet<MemberEntity> functions;
+    Setlet<MemberEntity>? functions;
     for (MemberEntity element in elements) {
       if (selectorMask.applies(element, domain)) {
         // Defer the allocation of the functions set until we are
@@ -225,8 +221,10 @@
     // potential targets.
     if (noSuchMethods != null &&
         selectorMask.needsNoSuchMethodHandling(domain)) {
+      // If [noSuchMethods] was provided then [noSuchMethodMask] should also
+      // have been provided.
       FunctionSetQuery noSuchMethodQuery =
-          noSuchMethods.query(noSuchMethodMask, domain);
+          noSuchMethods.query(noSuchMethodMask!, domain);
       if (!noSuchMethodQuery.functions.isEmpty) {
         functions ??= Setlet();
         functions.addAll(noSuchMethodQuery.functions);
@@ -282,7 +280,7 @@
   @override
   final Iterable<MemberEntity> functions;
 
-  AbstractValue _receiver;
+  AbstractValue? _receiver;
 
   FullFunctionSetQuery(this.functions);
 
diff --git a/pkg/compiler/lib/src/universe/side_effects.dart b/pkg/compiler/lib/src/universe/side_effects.dart
index 9533a2b..a269f63 100644
--- a/pkg/compiler/lib/src/universe/side_effects.dart
+++ b/pkg/compiler/lib/src/universe/side_effects.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.
 
-// @dart = 2.10
-
 library universe.side_effects;
 
 import '../elements/entities.dart';
@@ -259,7 +257,7 @@
   final MemberEntity _member;
   final SideEffects _sideEffects = SideEffects.empty();
   final bool _free;
-  Set<SideEffectsBuilder> _depending;
+  Set<SideEffectsBuilder>? _depending;
 
   SideEffectsBuilder(this._member) : _free = false;
 
diff --git a/pkg/compiler/pubspec.yaml b/pkg/compiler/pubspec.yaml
index 071e5e1..ff1ae62 100644
--- a/pkg/compiler/pubspec.yaml
+++ b/pkg/compiler/pubspec.yaml
@@ -6,8 +6,7 @@
 environment:
   sdk: '>=2.16.0 <3.0.0'
 
-# NOTE: `pub get / pub upgrade` are generally not needed when working on this
-# package. The `.packages` file in the repository root will be used by default.
+# Use 'any' constraints here; we get our versions from the DEPS file.
 dependencies:
   _fe_analyzer_shared: any
   _js_interop_checks: any
@@ -21,6 +20,7 @@
   kernel: any
   vm_service: any
 
+# Use 'any' constraints here; we get our versions from the DEPS file.
 dev_dependencies:
   args: any
   dart_style: any
diff --git a/pkg/compiler/test/model/class_set_test.dart b/pkg/compiler/test/model/class_set_test.dart
index 31e538e..b5614fb 100644
--- a/pkg/compiler/test/model/class_set_test.dart
+++ b/pkg/compiler/test/model/class_set_test.dart
@@ -144,7 +144,7 @@
   checkState(G, currentNode: G, stack: []);
   Expect.isFalse(iterator.moveNext());
   checkState(G, currentNode: null, stack: []);
-  Expect.isNull(iterator.current);
+  Expect.throws(() => iterator.current);
 
   iterator = new ClassHierarchyNodeIterable(
           world.classHierarchy.getClassHierarchyNode(G), ClassHierarchyNode.ALL,
diff --git a/pkg/compiler/test/static_type/static_type_test.dart b/pkg/compiler/test/static_type/static_type_test.dart
index 0498952..dcaea02 100644
--- a/pkg/compiler/test/static_type/static_type_test.dart
+++ b/pkg/compiler/test/static_type/static_type_test.dart
@@ -61,7 +61,7 @@
             new CachedStaticType(
                 getStaticTypeContext(elementMap, node),
                 staticTypeCache,
-                new ThisInterfaceType.from(node.enclosingClass?.getThisType(
+                ThisInterfaceType.from(node.enclosingClass?.getThisType(
                     _typeEnvironment.coreTypes,
                     node.enclosingLibrary.nonNullable))))
         .run(node);
diff --git a/pkg/dart2js_info/bin/src/code_deps.dart b/pkg/dart2js_info/bin/src/code_deps.dart
index 056e08b..5a57686 100644
--- a/pkg/dart2js_info/bin/src/code_deps.dart
+++ b/pkg/dart2js_info/bin/src/code_deps.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+// @dart = 2.11
+
 /// Command to query for code dependencies. Currently this tool only
 /// supports the `some_path` query, which gives you the shortest path for how
 /// one function depends on another.
@@ -59,7 +61,6 @@
     if (args.length < 3) {
       usageException("Missing arguments for some_path, expected: "
           "info.data <element-regexp-1> <element-regexp-2>");
-      return;
     }
 
     var info = await infoFromFile(args.first);
diff --git a/pkg/dart2js_info/bin/src/common_command.dart b/pkg/dart2js_info/bin/src/common_command.dart
index 8719b11..e8cba55 100644
--- a/pkg/dart2js_info/bin/src/common_command.dart
+++ b/pkg/dart2js_info/bin/src/common_command.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+// @dart = 2.11
+
 import 'package:args/command_runner.dart';
 
 import 'package:dart2js_info/info.dart';
@@ -35,7 +37,6 @@
     if (args.length < 2) {
       usageException(
           'Missing arguments, expected two dump-info files to compare');
-      return;
     }
 
     var oldInfo = await infoFromFile(args[0]);
diff --git a/pkg/dart2js_info/bin/src/convert.dart b/pkg/dart2js_info/bin/src/convert.dart
index 7439957..e698029 100644
--- a/pkg/dart2js_info/bin/src/convert.dart
+++ b/pkg/dart2js_info/bin/src/convert.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+// @dart = 2.11
+
 import 'package:args/command_runner.dart';
 
 import 'to_json.dart' show ToJsonCommand;
diff --git a/pkg/dart2js_info/bin/src/coverage_log_server.dart b/pkg/dart2js_info/bin/src/coverage_log_server.dart
index f86654a..375731a 100644
--- a/pkg/dart2js_info/bin/src/coverage_log_server.dart
+++ b/pkg/dart2js_info/bin/src/coverage_log_server.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+// @dart = 2.11
+
 /// A tool to gather coverage data from an app generated with dart2js. This
 /// depends on code that has been landed in the bleeding_edge version of dart2js
 /// and that we expect to become publicly visible in version 0.13.0 of the Dart
diff --git a/pkg/dart2js_info/bin/src/debug_info.dart b/pkg/dart2js_info/bin/src/debug_info.dart
index 51a8c99..24b2298 100644
--- a/pkg/dart2js_info/bin/src/debug_info.dart
+++ b/pkg/dart2js_info/bin/src/debug_info.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+// @dart = 2.11
+
 /// Tool used mainly by dart2js developers to debug the generated info and check
 /// that it is consistent and that it covers all the data we expect it to cover.
 library dart2js_info.bin.debug_info;
diff --git a/pkg/dart2js_info/bin/src/deferred_library_check.dart b/pkg/dart2js_info/bin/src/deferred_library_check.dart
index a54bdeb..2aba53c 100644
--- a/pkg/dart2js_info/bin/src/deferred_library_check.dart
+++ b/pkg/dart2js_info/bin/src/deferred_library_check.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+// @dart = 2.11
+
 /// A command that verifies that deferred libraries split the code as expected.
 ///
 /// This tool checks that the output from dart2js meets a given specification,
diff --git a/pkg/dart2js_info/bin/src/deferred_library_layout.dart b/pkg/dart2js_info/bin/src/deferred_library_layout.dart
index 95f20a5..7dc279a 100644
--- a/pkg/dart2js_info/bin/src/deferred_library_layout.dart
+++ b/pkg/dart2js_info/bin/src/deferred_library_layout.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+// @dart = 2.11
+
 /// This tool reports how code is divided among deferred chunks.
 library dart2js_info.bin.deferred_library_layout;
 
diff --git a/pkg/dart2js_info/bin/src/deferred_library_size.dart b/pkg/dart2js_info/bin/src/deferred_library_size.dart
index 353d8ed..78f94c9 100644
--- a/pkg/dart2js_info/bin/src/deferred_library_size.dart
+++ b/pkg/dart2js_info/bin/src/deferred_library_size.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+// @dart = 2.11
+
 /// This tool gives a breakdown of code size by deferred part in the program.
 library dart2js_info.bin.deferred_library_size;
 
diff --git a/pkg/dart2js_info/bin/src/diff.dart b/pkg/dart2js_info/bin/src/diff.dart
index b811071..dfa4b34 100644
--- a/pkg/dart2js_info/bin/src/diff.dart
+++ b/pkg/dart2js_info/bin/src/diff.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+// @dart = 2.11
+
 import 'package:args/command_runner.dart';
 
 import 'package:dart2js_info/info.dart';
@@ -31,7 +33,6 @@
     if (args.length < 2) {
       usageException(
           'Missing arguments, expected two dump-info files to compare');
-      return;
     }
 
     var oldInfo = await infoFromFile(args[0]);
diff --git a/pkg/dart2js_info/bin/src/function_size_analysis.dart b/pkg/dart2js_info/bin/src/function_size_analysis.dart
index 704155d..a856f2e 100644
--- a/pkg/dart2js_info/bin/src/function_size_analysis.dart
+++ b/pkg/dart2js_info/bin/src/function_size_analysis.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+// @dart = 2.11
+
 /// Tool presenting how much each function contributes to the total code.
 library compiler.tool.function_size_analysis;
 
diff --git a/pkg/dart2js_info/bin/src/inject_text.dart b/pkg/dart2js_info/bin/src/inject_text.dart
index 18bd5bd..ea245ad 100644
--- a/pkg/dart2js_info/bin/src/inject_text.dart
+++ b/pkg/dart2js_info/bin/src/inject_text.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+// @dart = 2.11
+
 import 'dart:io';
 
 import 'package:dart2js_info/info.dart';
diff --git a/pkg/dart2js_info/bin/src/library_size_split.dart b/pkg/dart2js_info/bin/src/library_size_split.dart
index 3246d1e..a4e2483 100644
--- a/pkg/dart2js_info/bin/src/library_size_split.dart
+++ b/pkg/dart2js_info/bin/src/library_size_split.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+// @dart = 2.11
+
 /// Command-line tool to show the size distribution of generated code among
 /// libraries. Libraries can be grouped using regular expressions. You can
 /// specify what regular expressions to use by providing a `grouping.yaml` file.
@@ -87,9 +89,6 @@
     var args = argResults.rest;
     if (args.isEmpty) {
       usageException('Missing argument: info.data');
-      print('usage: dart tool/library_size_split.dart '
-          'path-to-info.json [grouping.yaml]');
-      exit(1);
     }
 
     var info = await infoFromFile(args.first);
diff --git a/pkg/dart2js_info/bin/src/live_code_size_analysis.dart b/pkg/dart2js_info/bin/src/live_code_size_analysis.dart
index 23d4e32..3e02b7a 100644
--- a/pkg/dart2js_info/bin/src/live_code_size_analysis.dart
+++ b/pkg/dart2js_info/bin/src/live_code_size_analysis.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+// @dart = 2.11
+
 /// Command-line tool presenting combined information from dump-info and
 /// coverage data.
 ///
diff --git a/pkg/dart2js_info/bin/src/runtime_coverage_analysis.dart b/pkg/dart2js_info/bin/src/runtime_coverage_analysis.dart
index 44429e0..6f8183f 100644
--- a/pkg/dart2js_info/bin/src/runtime_coverage_analysis.dart
+++ b/pkg/dart2js_info/bin/src/runtime_coverage_analysis.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+// @dart = 2.11
+
 /// Command-line tool presenting combined information from dump-info and
 /// runtime coverage data.
 ///
diff --git a/pkg/dart2js_info/bin/src/show_inferred_types.dart b/pkg/dart2js_info/bin/src/show_inferred_types.dart
index 9c3b119..7c43318 100644
--- a/pkg/dart2js_info/bin/src/show_inferred_types.dart
+++ b/pkg/dart2js_info/bin/src/show_inferred_types.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+// @dart = 2.11
+
 /// Simple script that shows the inferred types of a function.
 library compiler.tool.show_inferred_types;
 
diff --git a/pkg/dart2js_info/bin/src/text_print.dart b/pkg/dart2js_info/bin/src/text_print.dart
index 3615b4d..95ad015 100644
--- a/pkg/dart2js_info/bin/src/text_print.dart
+++ b/pkg/dart2js_info/bin/src/text_print.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+// @dart = 2.11
+
 import 'dart:io';
 
 import 'package:args/command_runner.dart';
diff --git a/pkg/dart2js_info/bin/src/to_binary.dart b/pkg/dart2js_info/bin/src/to_binary.dart
index e1170f3..3061c3e 100644
--- a/pkg/dart2js_info/bin/src/to_binary.dart
+++ b/pkg/dart2js_info/bin/src/to_binary.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+// @dart = 2.11
+
 import 'dart:io';
 
 import 'package:args/command_runner.dart';
@@ -24,7 +26,6 @@
   void run() async {
     if (argResults.rest.isEmpty) {
       usageException('Missing argument: <input-info>');
-      exit(1);
     }
 
     String filename = argResults.rest[0];
diff --git a/pkg/dart2js_info/bin/src/to_json.dart b/pkg/dart2js_info/bin/src/to_json.dart
index 15e2722..38a909c 100644
--- a/pkg/dart2js_info/bin/src/to_json.dart
+++ b/pkg/dart2js_info/bin/src/to_json.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+// @dart = 2.11
+
 import 'dart:io';
 import 'dart:convert';
 
diff --git a/pkg/dart2js_info/bin/src/to_proto.dart b/pkg/dart2js_info/bin/src/to_proto.dart
index 5af4503..89ed41d 100644
--- a/pkg/dart2js_info/bin/src/to_proto.dart
+++ b/pkg/dart2js_info/bin/src/to_proto.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+// @dart = 2.11
+
 /// Command-line tool to convert an info.json file ouputted by dart2js to the
 /// alternative protobuf format.
 
@@ -26,7 +28,6 @@
   void run() async {
     if (argResults.rest.isEmpty) {
       usageException('Missing argument: <input-info>');
-      exit(1);
     }
 
     String filename = argResults.rest[0];
diff --git a/pkg/dart2js_info/bin/src/usage_exception.dart b/pkg/dart2js_info/bin/src/usage_exception.dart
index 3065100..3222ef4 100644
--- a/pkg/dart2js_info/bin/src/usage_exception.dart
+++ b/pkg/dart2js_info/bin/src/usage_exception.dart
@@ -6,10 +6,8 @@
 import 'package:args/command_runner.dart';
 
 abstract class PrintUsageException implements Command<void> {
-  // TODO(rnystrom): Use "Never" for the return type when this package is
-  // migrated to null safety.
   @override
-  usageException(String message) {
+  Never usageException(String message) {
     print(message);
     printUsage();
     exit(1);
diff --git a/pkg/dart2js_info/bin/tools.dart b/pkg/dart2js_info/bin/tools.dart
index 7dc64bd..785e00c 100644
--- a/pkg/dart2js_info/bin/tools.dart
+++ b/pkg/dart2js_info/bin/tools.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+// @dart = 2.11
+
 import 'package:args/command_runner.dart';
 
 import 'src/code_deps.dart';
diff --git a/pkg/dart2js_info/lib/binary_serialization.dart b/pkg/dart2js_info/lib/binary_serialization.dart
index 23b626d..043c93b 100644
--- a/pkg/dart2js_info/lib/binary_serialization.dart
+++ b/pkg/dart2js_info/lib/binary_serialization.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+// @dart = 2.11
+
 /// Info serialization to a binary form.
 ///
 /// Unlike the JSON codec, this serialization is designed to be streamed.
diff --git a/pkg/dart2js_info/lib/deferred_library_check.dart b/pkg/dart2js_info/lib/deferred_library_check.dart
index 3b5c365c..111cb10 100644
--- a/pkg/dart2js_info/lib/deferred_library_check.dart
+++ b/pkg/dart2js_info/lib/deferred_library_check.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+// @dart = 2.11
+
 /// This tool checks that the output from dart2js meets a given specification,
 /// given in a YAML file. The format of the YAML file is:
 ///
diff --git a/pkg/dart2js_info/lib/info.dart b/pkg/dart2js_info/lib/info.dart
index 132e13b..d274125 100644
--- a/pkg/dart2js_info/lib/info.dart
+++ b/pkg/dart2js_info/lib/info.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+// @dart = 2.11
+
 /// Data produced by dart2js when run with the `--dump-info` flag.
 library dart2js_info.info;
 
diff --git a/pkg/dart2js_info/lib/json_info_codec.dart b/pkg/dart2js_info/lib/json_info_codec.dart
index 647559f..a6a4a71 100644
--- a/pkg/dart2js_info/lib/json_info_codec.dart
+++ b/pkg/dart2js_info/lib/json_info_codec.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+// @dart = 2.11
+
 /// Converters and codecs for converting between JSON and [Info] classes.
 import 'dart:collection';
 import 'dart:convert';
diff --git a/pkg/dart2js_info/lib/proto_info_codec.dart b/pkg/dart2js_info/lib/proto_info_codec.dart
index 4d42457..60bd5fa 100644
--- a/pkg/dart2js_info/lib/proto_info_codec.dart
+++ b/pkg/dart2js_info/lib/proto_info_codec.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+// @dart = 2.11
+
 /// Converters and codecs for converting between Protobuf and [Info] classes.
 import 'dart:convert';
 
diff --git a/pkg/dart2js_info/lib/src/binary/sink.dart b/pkg/dart2js_info/lib/src/binary/sink.dart
index 4905b49..7c1f821 100644
--- a/pkg/dart2js_info/lib/src/binary/sink.dart
+++ b/pkg/dart2js_info/lib/src/binary/sink.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+// @dart = 2.11
+
 import 'dart:convert';
 import 'dart:typed_data';
 
diff --git a/pkg/dart2js_info/lib/src/binary/source.dart b/pkg/dart2js_info/lib/src/binary/source.dart
index d423f3f..ef68784 100644
--- a/pkg/dart2js_info/lib/src/binary/source.dart
+++ b/pkg/dart2js_info/lib/src/binary/source.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+// @dart = 2.11
+
 import 'dart:convert';
 import 'dart:typed_data';
 
diff --git a/pkg/dart2js_info/lib/src/common_element.dart b/pkg/dart2js_info/lib/src/common_element.dart
index 788d6f2..c2b94e5 100644
--- a/pkg/dart2js_info/lib/src/common_element.dart
+++ b/pkg/dart2js_info/lib/src/common_element.dart
@@ -1,3 +1,5 @@
+// @dart = 2.11
+
 import 'package:dart2js_info/info.dart';
 import 'package:dart2js_info/src/util.dart';
 
diff --git a/pkg/dart2js_info/lib/src/diff.dart b/pkg/dart2js_info/lib/src/diff.dart
index 29dd698..4093dac 100644
--- a/pkg/dart2js_info/lib/src/diff.dart
+++ b/pkg/dart2js_info/lib/src/diff.dart
@@ -1,3 +1,5 @@
+// @dart = 2.11
+
 import 'package:dart2js_info/info.dart';
 import 'package:dart2js_info/src/util.dart';
 
diff --git a/pkg/dart2js_info/lib/src/graph.dart b/pkg/dart2js_info/lib/src/graph.dart
index 9233d9f..3c80ba2 100644
--- a/pkg/dart2js_info/lib/src/graph.dart
+++ b/pkg/dart2js_info/lib/src/graph.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+// @dart = 2.11
+
 /// A library to work with graphs. It contains a couple algorithms, including
 /// Tarjan's algorithm to compute strongly connected components in a graph and
 /// Cooper et al's dominator algorithm.
diff --git a/pkg/dart2js_info/lib/src/io.dart b/pkg/dart2js_info/lib/src/io.dart
index affc8de..f006e87 100644
--- a/pkg/dart2js_info/lib/src/io.dart
+++ b/pkg/dart2js_info/lib/src/io.dart
@@ -1,3 +1,5 @@
+// @dart = 2.11
+
 import 'dart:convert';
 import 'dart:io';
 
diff --git a/pkg/dart2js_info/lib/src/string_edit_buffer.dart b/pkg/dart2js_info/lib/src/string_edit_buffer.dart
index 7630bf2..4f552c0 100644
--- a/pkg/dart2js_info/lib/src/string_edit_buffer.dart
+++ b/pkg/dart2js_info/lib/src/string_edit_buffer.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+// @dart = 2.11
+
 /// Defines [StringEditBuffer], a buffer that can be used to apply edits on a
 /// string.
 // TODO(sigmund): this should move to a separate package.
diff --git a/pkg/dart2js_info/lib/src/table.dart b/pkg/dart2js_info/lib/src/table.dart
index 23f44f0..b092ec8 100644
--- a/pkg/dart2js_info/lib/src/table.dart
+++ b/pkg/dart2js_info/lib/src/table.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+// @dart = 2.11
+
 library dart2js_info.src.table;
 
 import 'dart:math' show max;
diff --git a/pkg/dart2js_info/lib/src/util.dart b/pkg/dart2js_info/lib/src/util.dart
index c90b09f..ec8245a 100644
--- a/pkg/dart2js_info/lib/src/util.dart
+++ b/pkg/dart2js_info/lib/src/util.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+// @dart = 2.11
+
 library dart2js_info.src.util;
 
 import 'package:dart2js_info/info.dart';
diff --git a/pkg/dart2js_info/pubspec.yaml b/pkg/dart2js_info/pubspec.yaml
index 2d8ff24..04e3c7b 100644
--- a/pkg/dart2js_info/pubspec.yaml
+++ b/pkg/dart2js_info/pubspec.yaml
@@ -6,8 +6,9 @@
   --dump-info.
 
 environment:
-  sdk: '>=2.11.99 <3.0.0'
+  sdk: '>=2.16.0 <3.0.0'
 
+# Use 'any' constraints here; we get our versions from the DEPS file.
 dependencies:
   args: any
   collection: any
@@ -17,6 +18,7 @@
   shelf: any
   yaml: any
 
+# Use 'any' constraints here; we get our versions from the DEPS file.
 dev_dependencies:
   lints: any
   test: any
diff --git a/pkg/dart2js_info/test/binary_serialization_test.dart b/pkg/dart2js_info/test/binary_serialization_test.dart
index b622d04..3abdf36 100644
--- a/pkg/dart2js_info/test/binary_serialization_test.dart
+++ b/pkg/dart2js_info/test/binary_serialization_test.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+// @dart = 2.11
+
 import 'dart:convert';
 import 'dart:io';
 
diff --git a/pkg/dart2js_info/test/graph_test.dart b/pkg/dart2js_info/test/graph_test.dart
index 71afc23..017a90e 100644
--- a/pkg/dart2js_info/test/graph_test.dart
+++ b/pkg/dart2js_info/test/graph_test.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+// @dart = 2.11
+
 import 'package:dart2js_info/src/graph.dart';
 import 'package:test/test.dart';
 
diff --git a/pkg/dart2js_info/test/json_to_proto_deferred_test.dart b/pkg/dart2js_info/test/json_to_proto_deferred_test.dart
index fc0af00..190b005 100644
--- a/pkg/dart2js_info/test/json_to_proto_deferred_test.dart
+++ b/pkg/dart2js_info/test/json_to_proto_deferred_test.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+// @dart = 2.11
+
 import 'dart:convert';
 import 'dart:io';
 
diff --git a/pkg/dart2js_info/test/json_to_proto_test.dart b/pkg/dart2js_info/test/json_to_proto_test.dart
index 1975ca1..72d4e7b 100644
--- a/pkg/dart2js_info/test/json_to_proto_test.dart
+++ b/pkg/dart2js_info/test/json_to_proto_test.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+// @dart = 2.11
+
 import 'dart:convert';
 import 'dart:io';
 
diff --git a/pkg/dart2js_info/test/parse_test.dart b/pkg/dart2js_info/test/parse_test.dart
index 40709b9..80a0870 100644
--- a/pkg/dart2js_info/test/parse_test.dart
+++ b/pkg/dart2js_info/test/parse_test.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+// @dart = 2.11
+
 import 'dart:convert';
 import 'dart:io';
 
diff --git a/pkg/dart2js_runtime_metrics/pubspec.yaml b/pkg/dart2js_runtime_metrics/pubspec.yaml
index 8db9891..57a2179 100644
--- a/pkg/dart2js_runtime_metrics/pubspec.yaml
+++ b/pkg/dart2js_runtime_metrics/pubspec.yaml
@@ -11,5 +11,6 @@
   # a later version of the SDK without it being a breaking change.
   sdk: ">=2.14.0 <2.15.0"
 
+# Use 'any' constraints here; we get our versions from the DEPS file.
 dev_dependencies:
   expect: any
diff --git a/pkg/dart2js_tools/pubspec.yaml b/pkg/dart2js_tools/pubspec.yaml
index ec4d63b..ce67a9b 100644
--- a/pkg/dart2js_tools/pubspec.yaml
+++ b/pkg/dart2js_tools/pubspec.yaml
@@ -8,6 +8,7 @@
 environment:
   sdk: '>=2.12.0 <3.0.0'
 
+# Use 'any' constraints here; we get our versions from the DEPS file.
 dependencies:
   path: any
   source_maps: any
diff --git a/pkg/dart2native/pubspec.yaml b/pkg/dart2native/pubspec.yaml
index 6cd6814..80bf3ee 100644
--- a/pkg/dart2native/pubspec.yaml
+++ b/pkg/dart2native/pubspec.yaml
@@ -9,8 +9,10 @@
 executables:
   dart2native:
 
+# Use 'any' constraints here; we get our versions from the DEPS file.
 dependencies:
    path: any
 
+# Use 'any' constraints here; we get our versions from the DEPS file.
 dev_dependencies:
   lints: any
diff --git a/pkg/dart2wasm/pubspec.yaml b/pkg/dart2wasm/pubspec.yaml
index 2c0f711..f4ed37e 100644
--- a/pkg/dart2wasm/pubspec.yaml
+++ b/pkg/dart2wasm/pubspec.yaml
@@ -4,6 +4,7 @@
 environment:
   sdk: '>=2.12.0'
 
+# Use 'any' constraints here; we get our versions from the DEPS file.
 dependencies:
   _js_interop_checks: any
   front_end: any
diff --git a/pkg/dartdev/pubspec.yaml b/pkg/dartdev/pubspec.yaml
index 2e71998..58afb2a 100644
--- a/pkg/dartdev/pubspec.yaml
+++ b/pkg/dartdev/pubspec.yaml
@@ -6,6 +6,7 @@
 environment:
   sdk: '>=2.12.0 <3.0.0'
 
+# Use 'any' constraints here; we get our versions from the DEPS file.
 dependencies:
   analysis_server: any
   analysis_server_client: any
@@ -25,6 +26,7 @@
   telemetry: any
   usage: any
 
+# Use 'any' constraints here; we get our versions from the DEPS file.
 dev_dependencies:
   expect: any
   lints: any
diff --git a/pkg/dartdev/test/commands/analyze_test.dart b/pkg/dartdev/test/commands/analyze_test.dart
index 31a4dd4..065d607 100644
--- a/pkg/dartdev/test/commands/analyze_test.dart
+++ b/pkg/dartdev/test/commands/analyze_test.dart
@@ -53,6 +53,10 @@
 }
 ''';
 
+/// The exit code of the analysis server when the highest severity issue is a
+/// warning.
+const int _warningExitCode = 2;
+
 void defineAnalysisError() {
   group('contextMessages', () {
     test('none', () {
@@ -389,7 +393,7 @@
     );
     var result = await p.run(['analyze', p.dirPath]);
 
-    expect(result.exitCode, equals(0));
+    expect(result.exitCode, equals(_warningExitCode));
     expect(result.stderr, isEmpty);
     expect(result.stdout, contains('lib/main.dart:2:6 '));
     expect(result.stdout, contains('TODO: Implement this - todo'));
diff --git a/pkg/dds/pubspec.yaml b/pkg/dds/pubspec.yaml
index e2ca11c..40e8453 100644
--- a/pkg/dds/pubspec.yaml
+++ b/pkg/dds/pubspec.yaml
@@ -19,18 +19,22 @@
   json_rpc_2: ^3.0.0
   meta: ^1.1.8
   path: ^1.8.0
-  shelf: ^1.0.0
   shelf_proxy: ^1.0.0
   shelf_static: ^1.0.0
   shelf_web_socket: ^1.0.0
-  stack_trace: ^1.10.0
+  shelf: ^1.0.0
   sse: ^4.0.0
+  stack_trace: ^1.10.0
   stream_channel: ^2.0.0
   vm_service: ^8.1.0
   web_socket_channel: ^2.0.0
 
+# We use 'any' version constraints here as we get our package versions from
+# the dart-lang/sdk repo's DEPS file. Note that this is a special case; the
+# best practice for packages is to specify their compatible version ranges.
+# See also https://dart.dev/tools/pub/dependencies.
 dev_dependencies:
-  http: ^0.13.0
+  http: any
   lints: any
-  test: ^1.0.0
-  webdriver: ^3.0.0
+  test: any
+  webdriver: any
diff --git a/pkg/dds_service_extensions/pubspec.yaml b/pkg/dds_service_extensions/pubspec.yaml
index f26c41ba..f42ed22 100644
--- a/pkg/dds_service_extensions/pubspec.yaml
+++ b/pkg/dds_service_extensions/pubspec.yaml
@@ -12,5 +12,9 @@
   async: ^2.4.1
   vm_service: ^8.1.0
 
+# We use 'any' version constraints here as we get our package versions from
+# the dart-lang/sdk repo's DEPS file. Note that this is a special case; the
+# best practice for packages is to specify their compatible version ranges.
+# See also https://dart.dev/tools/pub/dependencies.
 dev_dependencies:
   lints: any
diff --git a/pkg/dev_compiler/lib/src/compiler/js_metalet.dart b/pkg/dev_compiler/lib/src/compiler/js_metalet.dart
index afca760..0e143ed 100644
--- a/pkg/dev_compiler/lib/src/compiler/js_metalet.dart
+++ b/pkg/dev_compiler/lib/src/compiler/js_metalet.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.
 
-// @dart = 2.9
-
 // TODO(jmesserly): import from its own package
 import '../js_ast/js_ast.dart';
 import 'js_names.dart' show TemporaryId;
@@ -27,7 +25,6 @@
 /// Because this deals with JS AST nodes, it is not aware of any Dart semantics
 /// around statelessness (such as `final` variables). [variables] should not
 /// be created for these Dart expressions.
-///
 class MetaLet extends Expression {
   /// Creates a temporary to contain the value of [expr]. The temporary can be
   /// used multiple times in the resulting expression. For example:
@@ -49,7 +46,7 @@
   /// We run [toExpression] implicitly when the JS AST is visited, to get the
   /// transformation to happen before the tree is printed.
   /// This happens multiple times, so ensure the expression form is cached.
-  Expression _expression;
+  Expression? _expression;
 
   MetaLet(this.variables, this.body, {this.statelessResult = false});
 
@@ -68,7 +65,7 @@
   }
 
   @override
-  Expression toAssignExpression(Expression left, [String op]) {
+  Expression toAssignExpression(Expression left, [String? op]) {
     if (left is Identifier) {
       return _simplifyAssignment(left, op: op) ?? _toAssign(left, op);
     } else if (left is PropertyAccess &&
@@ -79,7 +76,7 @@
     return super.toAssignExpression(left, op);
   }
 
-  Expression _toAssign(Expression left, [String op]) {
+  Expression _toAssign(Expression left, [String? op]) {
     var exprs = body.toList();
     exprs.add(exprs.removeLast().toAssignExpression(left, op));
     return MetaLet(variables, exprs);
@@ -111,11 +108,11 @@
   }
 
   Expression toExpression() {
-    if (_expression != null) return _expression;
+    if (_expression != null) return _expression!;
     var block = toReturn();
     var s = block.statements;
     if (s.length == 1 && s.first is Return) {
-      return _expression = (s.first as Return).value;
+      return (_expression = (s.first as Return).value)!;
     }
     // Wrap it in an immediately called function to get in expression context.
     return _expression = _toInvokedFunction(block);
@@ -148,8 +145,8 @@
 
   @override
   T accept<T>(NodeVisitor<T> visitor) {
-    // TODO(jmesserly): we special case vistors from js_ast.Template, because it
-    // doesn't know about MetaLet. Should we integrate directly?
+    // TODO(jmesserly): we special case visitors from js_ast.Template, because
+    // it doesn't know about MetaLet. Should we integrate directly?
     NodeVisitor v = visitor;
     if (v is InstantiatorGeneratorVisitor) {
       return _templateVisitMetaLet(v) as T;
@@ -162,8 +159,8 @@
 
   @override
   void visitChildren(NodeVisitor visitor) {
-    // TODO(jmesserly): we special case vistors from js_ast.Template, because it
-    // doesn't know about MetaLet. Should we integrate directly?
+    // TODO(jmesserly): we special case visitors from js_ast.Template, because
+    // it doesn't know about MetaLet. Should we integrate directly?
     if (visitor is InterpolatedNodeAnalysis ||
         visitor is InstantiatorGeneratorVisitor) {
       variables.values.forEach((v) => v.accept(visitor));
@@ -236,7 +233,7 @@
       var first = initializers[0];
       node = Block([
         initializers.length == 1
-            ? first.value.toVariableDeclaration(first.declaration)
+            ? first.value!.toVariableDeclaration(first.declaration)
             : VariableDeclarationList('let', initializers).toStatement(),
         node
       ]);
@@ -257,8 +254,8 @@
   ///
   ///     result = ((_) => _.addAll(result), _.add(2), _)([])
   ///
-  MetaLet _simplifyAssignment(Identifier left,
-      {String op, bool isDeclaration = false}) {
+  MetaLet? _simplifyAssignment(Identifier left,
+      {String? op, bool isDeclaration = false}) {
     // See if the result value is a let* temporary variable.
     var result = body.last;
     if (result is MetaLetVariable && variables.containsKey(result)) {
@@ -267,7 +264,7 @@
       if (!isDeclaration && _IdentFinder.foundIn(left.name, body)) return null;
 
       var vars = Map<MetaLetVariable, Expression>.from(variables);
-      var value = vars.remove(result);
+      var value = vars.remove(result)!;
       Expression assign;
       if (isDeclaration) {
         // Technically, putting one of these in a comma expression is not
diff --git a/pkg/dev_compiler/lib/src/compiler/js_names.dart b/pkg/dev_compiler/lib/src/compiler/js_names.dart
index f884331..985496d 100644
--- a/pkg/dev_compiler/lib/src/compiler/js_names.dart
+++ b/pkg/dev_compiler/lib/src/compiler/js_names.dart
@@ -9,6 +9,22 @@
 /// The ES6 name for the Dart SDK.  All dart:* libraries are in this module.
 const String dartSdkModule = 'dart_sdk';
 
+/// Names expected to be used without renaming.
+///
+/// These are fixed by the dart:_rti library and are accessed through the
+/// `JsGetName` enum.
+abstract class FixedNames {
+  static const operatorIsPrefix = r'$is';
+  static const operatorSignature = r'$signature';
+  static const rtiName = r'$ti';
+  // TODO(48585) Fix this name.
+  static const futureClassName = 'TODO';
+  // TODO(48585) Fix this name.
+  static const listClassName = 'TODO';
+  static const rtiAsField = '_as';
+  static const rtiIsField = '_is';
+}
+
 /// Unique instance for temporary variables. Will be renamed consistently
 /// across the entire file. Different instances will be named differently
 /// even if they have the same name, this makes it safe to use in code
diff --git a/pkg/dev_compiler/lib/src/compiler/js_utils.dart b/pkg/dev_compiler/lib/src/compiler/js_utils.dart
index aaecf7f..57adce8 100644
--- a/pkg/dev_compiler/lib/src/compiler/js_utils.dart
+++ b/pkg/dev_compiler/lib/src/compiler/js_utils.dart
@@ -2,6 +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 'package:js_shared/synced/embedded_names.dart'
+    show RtiUniverseFieldNames;
+
 import '../js_ast/js_ast.dart';
 
 /// Simplify `(args) => (() => { ... })()` to `(args) => { ... }`.
@@ -51,3 +54,21 @@
     node.sourceInformation = null;
   }
 }
+
+/// Returns an expression that creates the initial Rti Universe.
+///
+/// This needs to be kept in sync with `_Universe.create` in `dart:_rti`.
+Expression createRtiUniverse() {
+  Property initField(String name, String value) =>
+      Property(js.string(name), js(value));
+
+  var universeFields = [
+    initField(RtiUniverseFieldNames.evalCache, 'new Map()'),
+    initField(RtiUniverseFieldNames.typeRules, '{}'),
+    initField(RtiUniverseFieldNames.erasedTypes, '{}'),
+    initField(RtiUniverseFieldNames.typeParameterVariances, '{}'),
+    initField(RtiUniverseFieldNames.sharedEmptyArray, '[]'),
+  ];
+
+  return ObjectInitializer(universeFields);
+}
diff --git a/pkg/dev_compiler/lib/src/compiler/module_builder.dart b/pkg/dev_compiler/lib/src/compiler/module_builder.dart
index 9e89dc5..eeb78ea 100644
--- a/pkg/dev_compiler/lib/src/compiler/module_builder.dart
+++ b/pkg/dev_compiler/lib/src/compiler/module_builder.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.
 
-// @dart = 2.9
-
 import 'package:args/args.dart' show ArgParser, ArgResults;
 import 'package:path/path.dart' as p;
 
@@ -104,7 +102,7 @@
 /// structure as possible with the original. The transformation is a shallow one
 /// that affects the [ImportDeclaration]s from [items].
 ///
-/// Returns a new function that combines all statements from tranformed imports
+/// Returns a new function that combines all statements from transformed imports
 /// from [items] and the body of the [function].
 Fun transformFunctionModuleFormat(
     List<ModuleItem> items, Fun function, ModuleFormat format) {
@@ -191,11 +189,11 @@
       Identifier moduleVar, ImportDeclaration import, bool deferModules) {
     var items = <Statement>[];
 
-    for (var importName in import.namedImports) {
+    for (var importName in import.namedImports!) {
       // import * is not emitted by the compiler, so we don't handle it here.
       assert(!importName.isStar);
       var asName = importName.asName ?? importName.name;
-      var fromName = importName.name.name;
+      var fromName = importName.name!.name;
       // Load non-SDK modules on demand (i.e., deferred).
       if (deferModules && import.from.valueWithoutQuotes != dartSdkModule) {
         items.add(js.statement(
@@ -220,10 +218,11 @@
       items.add(js.comment('Exports:'));
       // TODO(jmesserly): make these immutable in JS?
       for (var export in exports) {
-        var names = export.exportedNames;
-        assert(names != null); // export * not supported in ddc modules.
+        // export * (exportedNames is null) is not emitted by the compiler, so
+        // we don't handle it here.
+        var names = export.exportedNames!;
         for (var name in names) {
-          var alias = name.asName ?? name.name;
+          var alias = name.asName ?? name.name!;
           items.add(
               js.statement('#.# = #;', [exportsVar, alias.name, name.name]));
         }
@@ -238,7 +237,7 @@
   /// compilation, in order to include all the context needed for evaluation
   /// inside it.
   ///
-  /// Returns a new function that combines all statements from tranformed
+  /// Returns a new function that combines all statements from transformed
   /// imports from [items] and the body of the [function].
   Fun buildFunctionWithImports(List<ModuleItem> items, Fun function) {
     clear();
@@ -279,19 +278,20 @@
       importStatements.addAll(buildImports(moduleVar, import, true));
     }
 
-    // Prepend import statetements.
+    // Prepend import statements.
     statements.insertAll(0, importStatements);
 
     // Append export statements.
     statements.addAll(buildExports(exportsVar, exports));
 
+    var moduleName = module.name!;
     var resultModule = NamedFunction(
-        loadFunctionIdentifier(module.name),
+        loadFunctionIdentifier(moduleName),
         js.fun("function(#) { 'use strict'; #; }", [parameters, statements]),
         true);
 
     var moduleDef = js.statement('dart_library.library(#, #, #, #, #)', [
-      js.string(module.name, "'"),
+      js.string(moduleName, "'"),
       LiteralNull(),
       js.commentExpression(
           'Imports', ArrayInitializer(importNames, multiline: true)),
@@ -320,12 +320,12 @@
           .add(js.statement('const # = require(#);', [moduleVar, import.from]));
 
       // TODO(jmesserly): optimize for the common case of a single import.
-      for (var importName in import.namedImports) {
+      for (var importName in import.namedImports!) {
         // import * is not emitted by the compiler, so we don't support it here.
         assert(!importName.isStar);
         var asName = importName.asName ?? importName.name;
         importStatements.add(js.statement(
-            'const # = #.#', [asName, moduleVar, importName.name.name]));
+            'const # = #.#', [asName, moduleVar, importName.name!.name]));
       }
     }
     statements.insertAll(0, importStatements);
@@ -334,11 +334,11 @@
       var exportsVar = Identifier('exports');
       statements.add(js.comment('Exports:'));
       for (var export in exports) {
-        var names = export.exportedNames;
-        // export * is not emitted by the compiler, so we don't handle it here.
-        assert(names != null);
+        // export * (exportedNames is null) is not emitted by the compiler, so
+        // we don't handle it here.
+        var names = export.exportedNames!;
         for (var name in names) {
-          var alias = name.asName ?? name.name;
+          var alias = name.asName ?? name.name!;
           statements.add(
               js.statement('#.# = #;', [exportsVar, alias.name, name.name]));
         }
@@ -366,12 +366,12 @@
       Identifier moduleVar, ImportDeclaration import) {
     var items = <Statement>[];
 
-    for (var importName in import.namedImports) {
+    for (var importName in import.namedImports!) {
       // import * is not emitted by the compiler, so we don't handle it here.
       assert(!importName.isStar);
       var asName = importName.asName ?? importName.name;
       items.add(js.statement(
-          'const # = #.#', [asName, moduleVar, importName.name.name]));
+          'const # = #.#', [asName, moduleVar, importName.name!.name]));
     }
     return items;
   }
@@ -383,12 +383,12 @@
     if (exports.isNotEmpty) {
       var exportedProps = <Property>[];
       for (var export in exports) {
-        var names = export.exportedNames;
-        // export * is not emitted by the compiler, so we don't handle it here.
-        assert(names != null);
+        // export * (exportedNames is null) is not emitted by the compiler, so
+        // we don't handle it here.
+        var names = export.exportedNames!;
         for (var name in names) {
-          var alias = name.asName ?? name.name;
-          exportedProps.add(Property(js.string(alias.name), name.name));
+          var alias = name.asName ?? name.name!;
+          exportedProps.add(Property(js.string(alias.name), name.name!));
         }
       }
       items.add(js.comment('Exports:'));
@@ -403,7 +403,7 @@
   /// compilation, in order to include all the context needed for evaluation
   /// inside it.
   ///
-  /// Returns a new function that combines all statements from tranformed
+  /// Returns a new function that combines all statements from transformed
   /// imports from [items] and the body of the [function].
   Fun buildFunctionWithImports(List<ModuleItem> items, Fun function) {
     clear();
@@ -442,14 +442,14 @@
       importStatements.addAll(buildImports(moduleVar, import));
     }
 
-    // Prepend import statetements.
+    // Prepend import statements.
     statements.insertAll(0, importStatements);
 
     // Append export statements.
     statements.addAll(buildExports(exports));
 
     var resultModule = NamedFunction(
-        loadFunctionIdentifier(module.name),
+        loadFunctionIdentifier(module.name!),
         js.fun("function(#) { 'use strict'; #; }", [fnParams, statements]),
         true);
     var block = js.statement(
diff --git a/pkg/dev_compiler/lib/src/compiler/shared_compiler.dart b/pkg/dev_compiler/lib/src/compiler/shared_compiler.dart
index fd2b9c8..924057d0 100644
--- a/pkg/dev_compiler/lib/src/compiler/shared_compiler.dart
+++ b/pkg/dev_compiler/lib/src/compiler/shared_compiler.dart
@@ -2,9 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.9
-
 import 'dart:collection';
+
 import 'package:meta/meta.dart';
 
 import '../compiler/js_names.dart' as js_ast;
@@ -16,12 +15,13 @@
 ///
 /// This class should only implement functionality that depends purely on JS
 /// classes, rather than on Analyzer/Kernel types.
-abstract class SharedCompiler<Library, Class, InterfaceType, FunctionNode> {
+abstract class SharedCompiler<Library extends Object, Class extends Object,
+    InterfaceType extends Object, FunctionNode extends Object> {
   /// When inside a `[]=` operator, this will be a non-null value that should be
   /// returned by any `return;` statement.
   ///
   /// This lets DDC use the setter method's return value directly.
-  final List<js_ast.Identifier> _operatorSetResultStack = [];
+  final List<js_ast.Identifier?> _operatorSetResultStack = [];
 
   /// Private member names in this module, organized by their library.
   final _privateNames = HashMap<Library, HashMap<String, js_ast.TemporaryId>>();
@@ -48,7 +48,7 @@
 
   /// Incremental mode for expression compilation.
   ///
-  /// If set to true, triggers emitting tall used ypes, symbols, libraries,
+  /// If set to true, triggers emitting all used types, symbols, libraries,
   /// constants, urs inside the generated function.
   bool _incrementalMode = false;
 
@@ -75,27 +75,27 @@
 
   @protected
   void setEmitIfIncrementalLibrary(Library library) {
-    if (incrementalMode && library != null) {
+    if (incrementalMode) {
       setEmitIfIncremental(libraryToModule(library), jsLibraryName(library));
     }
   }
 
   @protected
   void setEmitIfIncremental(String module, String library) {
-    if (incrementalMode && library != null) {
+    if (incrementalMode) {
       incrementalModules.putIfAbsent(module, () => {}).add(library);
     }
   }
 
   /// The identifier used to reference DDC's core "dart:_runtime" library from
   /// generated JS code, typically called "dart" e.g. `dart.dcall`.
-  js_ast.Identifier runtimeModule;
+  late js_ast.Identifier runtimeModule;
 
   /// The identifier used to reference DDC's "extension method" symbols, used to
   /// safely add Dart-specific member names to JavaScript classes, such as
   /// primitive types (e.g. String) or DOM types in "dart:html".
   @protected
-  js_ast.Identifier extensionSymbolsModule;
+  late js_ast.Identifier extensionSymbolsModule;
 
   /// Whether we're currently building the SDK, which may require special
   /// bootstrapping logic.
@@ -103,14 +103,14 @@
   /// This is initialized by [emitModule], which must be called before
   /// accessing this field.
   @protected
-  bool isBuildingSdk;
+  bool isBuildingSdk = false;
 
   /// Whether or not to move top level symbols into top-level containers.
   ///
   /// This is set in both [emitModule] and [emitLibrary].
   /// Depends on [isBuildingSdk].
   @protected
-  bool containerizeSymbols;
+  bool containerizeSymbols = false;
 
   /// The temporary variable that stores named arguments (these are passed via a
   /// JS object literal, to match JS conventions).
@@ -138,7 +138,7 @@
 
   /// The current library being compiled.
   @protected
-  Library get currentLibrary;
+  Library? get currentLibrary;
 
   /// The library for dart:core in the SDK.
   @protected
@@ -150,7 +150,7 @@
 
   /// The current function being compiled, if any.
   @protected
-  FunctionNode get currentFunction;
+  FunctionNode? get currentFunction;
 
   /// Choose a canonical name from the [library] element.
   @protected
@@ -164,7 +164,7 @@
   /// This never uses the library's name (the identifier in the `library`
   /// declaration) as it doesn't have any meaningful rules enforced.
   @protected
-  String jsLibraryAlias(Library library);
+  String? jsLibraryAlias(Library library);
 
   /// Debugger friendly name for a Dart [library].
   @protected
@@ -178,6 +178,10 @@
   @protected
   String libraryToModule(Library library);
 
+  /// Returns true if [library] is identified by [name].
+  @protected
+  bool isDartLibrary(Library library, String name);
+
   /// Returns true if the library [l] is "dart:_runtime".
   @protected
   bool isSdkInternalRuntime(Library l);
@@ -193,7 +197,7 @@
   /// When compiling the body of a `operator []=` method, this will be non-null
   /// and will indicate the value that should be returned from any `return;`
   /// statements.
-  js_ast.Identifier get _operatorSetResult {
+  js_ast.Identifier? get _operatorSetResult {
     var stack = _operatorSetResultStack;
     return stack.isEmpty ? null : stack.last;
   }
@@ -203,7 +207,7 @@
   ///
   /// See also [exitFunction] and [emitReturnStatement].
   @protected
-  void enterFunction(String name, List<js_ast.Parameter> formals,
+  void enterFunction(String? name, List<js_ast.Parameter> formals,
       bool Function() isLastParamMutated) {
     if (name == '[]=') {
       _operatorSetResultStack.add(isLastParamMutated()
@@ -217,8 +221,7 @@
   /// Called when finished emitting methods/functions, and must correspond to a
   /// previous [enterFunction] call.
   @protected
-  js_ast.Block exitFunction(
-      String name, List<js_ast.Parameter> formals, js_ast.Block code) {
+  js_ast.Block exitFunction(List<js_ast.Parameter> formals, js_ast.Block code) {
     var setOperatorResult = _operatorSetResultStack.removeLast();
     if (setOperatorResult != null) {
       // []= methods need to return the value. We could also address this at
@@ -242,7 +245,7 @@
   /// Emits a return statement `return <value>;`, handling special rules for
   /// the `operator []=` method.
   @protected
-  js_ast.Statement emitReturnStatement(js_ast.Expression value) {
+  js_ast.Statement emitReturnStatement(js_ast.Expression? value) {
     if (_operatorSetResult != null) {
       var result = js_ast.Return(_operatorSetResult);
       return value != null
@@ -264,7 +267,7 @@
   ///     dart.asInt(<expr>)
   ///
   @protected
-  js_ast.Expression runtimeCall(String code, [List<Object> args]) {
+  js_ast.Expression runtimeCall(String code, [List<Object>? args]) {
     setEmitIfIncremental(libraryToModule(coreLibrary), runtimeModule.name);
     return js.call('#.$code', <Object>[runtimeModule, ...?args]);
   }
@@ -272,7 +275,7 @@
   /// Calls [runtimeCall] and uses `toStatement()` to convert the resulting
   /// expression into a statement.
   @protected
-  js_ast.Statement runtimeStatement(String code, [List<Object> args]) =>
+  js_ast.Statement runtimeStatement(String code, [List<Object>? args]) =>
       runtimeCall(code, args).toStatement();
 
   /// Emits a private name JS Symbol for [name] scoped to the Dart [library].
@@ -290,7 +293,7 @@
   /// top-level variables (see callers to this method).
   @protected
   js_ast.TemporaryId emitPrivateNameSymbol(Library library, String name,
-      [js_ast.TemporaryId id]) {
+      [js_ast.TemporaryId? id]) {
     /// Initializes the JS `Symbol` for the private member [name] in [library].
     ///
     /// If the library is in the current JS module ([_libraries] contains it),
@@ -307,21 +310,21 @@
     js_ast.TemporaryId initPrivateNameSymbol() {
       var idName = name.endsWith('=') ? name.replaceAll('=', '_') : name;
       idName = idName.replaceAll(js_ast.invalidCharInIdentifier, '_');
-      id ??= js_ast.TemporaryId(idName);
+      var identifier = id ?? js_ast.TemporaryId(idName);
       addSymbol(
-          id,
+          identifier,
           runtimeCall('privateName(#, #)',
               [emitLibraryName(library), js.string(name)]));
       if (!containerizeSymbols) {
         // TODO(vsm): Change back to `const`.
         // See https://github.com/dart-lang/sdk/issues/40380.
         moduleItems.add(js.statement('var # = #', [
-          id,
+          identifier,
           runtimeCall(
               'privateName(#, #)', [emitLibraryName(library), js.string(name)])
         ]));
       }
-      return id;
+      return identifier;
     }
 
     var privateNames = _privateNames.putIfAbsent(library, () => HashMap());
@@ -339,7 +342,7 @@
   ///
   /// This will use `className.name = value` if possible, otherwise it will use
   /// `dart.defineValue(className, name, value)`. This is required when
-  /// `FunctionNode.prototype` already defins a getters with the same name.
+  /// `FunctionNode.prototype` already defines a getters with the same name.
   @protected
   js_ast.Expression defineValueOnClass(Class c, js_ast.Expression className,
       js_ast.Expression nameExpr, js_ast.Expression value) {
@@ -372,10 +375,10 @@
   /// [canonicalizeConstObject] can be used for class instances; it will wrap
   /// the expression in `dart.const` and then call this method.
   ///
-  /// If the same consant is used elsewhere (in this module, or another module),
-  /// that will require a second canonicalization. In general it is uncommon
-  /// to define the same large constant (such as lists, maps) in different
-  /// locations, because that requires copy+paste, so in practice this
+  /// If the same constant is used elsewhere (in this module, or another
+  /// module), that will require a second canonicalization. In general it is
+  /// uncommon to define the same large constant (such as lists, maps) in
+  /// different locations, because that requires copy+paste, so in practice this
   /// optimization is rather effective (we should consider caching once
   /// per-module, though, as that would be relatively easy for the compiler to
   /// implement once we have a single Kernel backend).
@@ -400,7 +403,7 @@
     js_ast.Expression result;
     if (last.startsWith('_')) {
       var nativeSymbolAccessor =
-          getSymbol(emitPrivateNameSymbol(currentLibrary, last));
+          getSymbol(emitPrivateNameSymbol(currentLibrary!, last));
       result = js.call('new #.new(#, #)', [
         emitConstructorAccess(privateSymbolType),
         name,
@@ -531,7 +534,7 @@
       modules.putIfAbsent(libraryToModule(import), () => []).add(import);
     }
 
-    String coreModuleName;
+    String? coreModuleName;
     if (!_libraries.containsKey(coreLibrary)) {
       coreModuleName = libraryToModule(coreLibrary);
     }
@@ -552,7 +555,7 @@
         var imports = <js_ast.NameSpecifier>[];
         for (var library in libraries) {
           if (!incrementalMode ||
-              usedLibraries.contains(jsLibraryName(library))) {
+              usedLibraries!.contains(jsLibraryName(library))) {
             var alias = jsLibraryAlias(library);
             if (alias != null) {
               var aliasId = js_ast.TemporaryId(alias);
@@ -565,11 +568,11 @@
         }
 
         if (module == coreModuleName) {
-          if (!incrementalMode || usedLibraries.contains(runtimeModule.name)) {
+          if (!incrementalMode || usedLibraries!.contains(runtimeModule.name)) {
             imports.add(js_ast.NameSpecifier(runtimeModule));
           }
           if (!incrementalMode ||
-              usedLibraries.contains(extensionSymbolsModule.name)) {
+              usedLibraries!.contains(extensionSymbolsModule.name)) {
             imports.add(js_ast.NameSpecifier(extensionSymbolsModule));
           }
         }
@@ -709,7 +712,7 @@
   /// Returns the raw JS value associated with [id].
   js_ast.Expression getSymbolValue(js_ast.Identifier id) {
     _symbolContainer.setEmitIfIncremental(id);
-    return _symbolContainer[id];
+    return _symbolContainer[id]!;
   }
 
   /// Inserts a symbol into the symbol table.
@@ -719,10 +722,10 @@
     if (!containerizeSymbols) {
       _symbolContainer.setNoEmit(id);
     }
-    return _symbolContainer[id];
+    return _symbolContainer[id]!;
   }
 
-  /// Finishes the module created by [startModule], by combining the preable
+  /// Finishes the module created by [startModule], by combining the preamble
   /// [items] with the [moduleItems] that have been emitted.
   ///
   /// The [moduleName] should specify the module's name, and the items should
@@ -759,7 +762,7 @@
     for (var item in items) {
       if (item is js_ast.Block && !item.isScope) {
         _copyAndFlattenBlocks(result, item.statements);
-      } else if (item != null) {
+      } else {
         result.add(item);
       }
     }
@@ -779,7 +782,7 @@
       _extensionSymbols[name] = id;
       addSymbol(id, id);
     }
-    var symbolId = _extensionSymbols[name];
+    var symbolId = _extensionSymbols[name]!;
     _symbolContainer.setEmitIfIncremental(symbolId);
     return symbolId;
   }
@@ -806,9 +809,7 @@
 
 /// Whether a variable with [name] is referenced in the [node].
 bool variableIsReferenced(String name, js_ast.Node node) {
-  var finder = _IdentifierFinder.instance;
-  finder.nameToFind = name;
-  finder.found = false;
+  var finder = _IdentifierFinder.instance(name);
   node.accept(finder);
   return finder.found;
 }
@@ -817,7 +818,13 @@
   String nameToFind;
   bool found = false;
 
-  static final instance = _IdentifierFinder();
+  _IdentifierFinder(this.nameToFind);
+
+  static final _instance = _IdentifierFinder('');
+
+  factory _IdentifierFinder.instance(String nameToFind) => _instance
+    ..nameToFind = nameToFind
+    ..found = false;
 
   @override
   void visitIdentifier(node) {
diff --git a/pkg/dev_compiler/lib/src/kernel/compiler.dart b/pkg/dev_compiler/lib/src/kernel/compiler.dart
index 506b32d..2b3a91d 100644
--- a/pkg/dev_compiler/lib/src/kernel/compiler.dart
+++ b/pkg/dev_compiler/lib/src/kernel/compiler.dart
@@ -9,6 +9,7 @@
 import 'dart:math' show max, min;
 
 import 'package:front_end/src/api_unstable/ddc.dart';
+import 'package:js_shared/synced/embedded_names.dart' show JsGetName, JsBuiltin;
 import 'package:kernel/class_hierarchy.dart';
 import 'package:kernel/core_types.dart';
 import 'package:kernel/kernel.dart';
@@ -368,6 +369,17 @@
     // Initialize library variables.
     isBuildingSdk = libraries.any(isSdkInternalRuntime);
 
+    // TODO(48585) Remove after new type system has landed.
+    if (isBuildingSdk && !_options.newRuntimeTypes) {
+      libraries.removeWhere((library) {
+        var path = library.importUri.path;
+        return path == '_js_shared_embedded_names' ||
+            path == '_js_names' ||
+            path == '_recipe_syntax' ||
+            path == '_rti';
+      });
+    }
+
     // For runtime performance reasons, we only containerize SDK symbols in web
     // libraries. Otherwise, we use a 600-member cutoff before a module is
     // containerized. This is somewhat arbitrary but works promisingly for the
@@ -475,6 +487,8 @@
     if (!isBuildingSdk) {
       items.add(
           runtimeStatement('_checkModuleNullSafetyMode(#)', [soundNullSafety]));
+      items.add(runtimeStatement('_checkModuleRuntimeTypes(#)',
+          [js_ast.LiteralBool(_options.newRuntimeTypes)]));
     }
 
     // Emit the hoisted type table cache variables
@@ -519,9 +533,16 @@
       library.parts.map((part) => part.partUri);
 
   /// True when [library] is the sdk internal library 'dart:_internal'.
-  bool _isDartInternal(Library library) {
+  bool _isDartInternal(Library library) => isDartLibrary(library, '_internal');
+
+  /// True when [library] is the sdk internal library 'dart:_internal'.
+  bool _isDartForeignHelper(Library library) =>
+      isDartLibrary(library, '_foreign_helper');
+
+  @override
+  bool isDartLibrary(Library library, String name) {
     var importUri = library.importUri;
-    return importUri.isScheme('dart') && importUri.path == '_internal';
+    return importUri.isScheme('dart') && importUri.path == name;
   }
 
   @override
@@ -559,6 +580,12 @@
     }
 
     if (isSdkInternalRuntime(library)) {
+      if (_options.newRuntimeTypes) {
+        // Add embedded globals.
+        moduleItems.add(
+            runtimeCall('typeUniverse = #', [js_ast.createRtiUniverse()])
+                .toStatement());
+      }
       // `dart:_runtime` uses a different order for bootstrapping.
       //
       // Functions are first because we use them to associate type info
@@ -625,7 +652,11 @@
     _currentLibrary = c.enclosingLibrary;
     _currentUri = c.fileUri;
 
-    moduleItems.add(_emitClassDeclaration(c));
+    // Mixins are unrolled in _defineClass.
+    // If this class is annotated with `@JS`, then there is nothing to emit.
+    if (!c.isAnonymousMixin && !hasJSInteropAnnotation(c)) {
+      moduleItems.add(_emitClassDeclaration(c));
+    }
 
     // The const table depends on dart.defineLazy, so emit it after the SDK.
     if (isSdkInternalRuntime(_currentLibrary)) {
@@ -660,12 +691,6 @@
       js_ast.TemporaryId(js_ast.toJSIdentifier(name));
 
   js_ast.Statement _emitClassDeclaration(Class c) {
-    // Mixins are unrolled in _defineClass.
-    if (c.isAnonymousMixin) return null;
-
-    // If this class is annotated with `@JS`, then there is nothing to emit.
-    if (findAnnotation(c, isPublicJSAnnotation) != null) return null;
-
     // Generic classes will be defined inside a function that closes over the
     // type parameter. So we can use their local variable name directly.
     //
@@ -3406,7 +3431,7 @@
         ? _emitSyncFunctionBody(f, name)
         : _emitGeneratorFunctionBody(f, name);
 
-    block = super.exitFunction(name, formals, block);
+    block = super.exitFunction(formals, block);
     return js_ast.Fun(formals, block);
   }
 
@@ -5535,17 +5560,45 @@
     if (isInlineJS(target)) return _emitInlineJSCode(node) as js_ast.Expression;
     if (target.isFactory) return _emitFactoryInvocation(node);
 
-    // Optimize some internal SDK calls.
-    if (_isDartInternal(target.enclosingLibrary)) {
+    var enclosingLibrary = target.enclosingLibrary;
+    if (_isDartInternal(enclosingLibrary)) {
       var args = node.arguments;
       if (args.positional.length == 1 &&
           args.types.length == 1 &&
           args.named.isEmpty &&
           target.name.text == 'unsafeCast') {
+        // Optimize some internal SDK calls by avoiding the insertion of a
+        // runtime cast.
         return args.positional.single.accept(this);
       }
     }
-    if (isSdkInternalRuntime(target.enclosingLibrary)) {
+
+    if (_isDartForeignHelper(enclosingLibrary)) {
+      var args = node.arguments.positional;
+      var name = target.name.text;
+
+      if (args.length == 1) {
+        if (name == 'JS_GET_NAME') {
+          var staticGet = args.single as StaticGet;
+          var enumField = staticGet.target as Field;
+          return _emitNameForJsGetName(asJsGetName(enumField));
+        }
+      } else if (args.length == 2) {
+        if (name == 'JS_EMBEDDED_GLOBAL') return _emitEmbeddedGlobal(node);
+        if (name == 'JS_STRING_CONCAT') {
+          var left = _visitExpression(args.first);
+          var right = _visitExpression(args.last);
+          return js.call('# + #', [left, right]);
+        }
+      }
+      if (name == 'JS_BUILTIN') {
+        var staticGet = args[1] as StaticGet;
+        var enumField = staticGet.target as Field;
+        return _emitOperationForJsBuiltIn(asJsBuiltin(enumField));
+      }
+    }
+
+    if (isSdkInternalRuntime(enclosingLibrary)) {
       var name = target.name.text;
       if (node.arguments.positional.isEmpty &&
           node.arguments.types.length == 1) {
@@ -5577,6 +5630,9 @@
           if (flagName == 'soundNullSafety') {
             return js.boolean(_options.soundNullSafety);
           }
+          if (flagName == 'newRuntimeTypes') {
+            return js.boolean(_options.newRuntimeTypes);
+          }
           throw UnsupportedError('Invalid flag in call to $name: $flagName');
         }
       } else if (node.arguments.positional.length == 2) {
@@ -5762,6 +5818,62 @@
     return result.withSourceInformation(_nodeStart(node));
   }
 
+  js_ast.Expression _emitEmbeddedGlobal(StaticInvocation node) {
+    var constantExpression = node.arguments.positional[1] as ConstantExpression;
+    var name = constantExpression.constant as StringConstant;
+    return runtimeCall('#', [name.value]);
+  }
+
+  /// Returns the string literal that is to be used as the result of a call to
+  /// [JS_GET_NAME] for [name].
+  js_ast.LiteralString _emitNameForJsGetName(JsGetName name) {
+    switch (name) {
+      case JsGetName.OPERATOR_IS_PREFIX:
+        return js.string(js_ast.FixedNames.operatorIsPrefix);
+      case JsGetName.SIGNATURE_NAME:
+        return js.string(js_ast.FixedNames.operatorSignature);
+      case JsGetName.RTI_NAME:
+        return js.string(js_ast.FixedNames.rtiName);
+      case JsGetName.FUTURE_CLASS_TYPE_NAME:
+        return js.string(js_ast.FixedNames.futureClassName);
+      case JsGetName.LIST_CLASS_TYPE_NAME:
+        return js.string(js_ast.FixedNames.listClassName);
+      case JsGetName.RTI_FIELD_AS:
+        return js.string(js_ast.FixedNames.rtiAsField);
+      case JsGetName.RTI_FIELD_IS:
+        return js.string(js_ast.FixedNames.rtiIsField);
+      default:
+        throw UnsupportedError('JsGetName has no name for "$name".');
+    }
+  }
+
+  /// Returns the expression that is to be used as the result of a call to
+  /// [JS_BUILTIN] for [builtin].
+  js_ast.Expression _emitOperationForJsBuiltIn(JsBuiltin builtin) {
+    switch (builtin) {
+      case JsBuiltin.dartClosureConstructor:
+        // TODO(48585) How to get constructor for a Dart Function?
+        return js.call('TODO');
+      case JsBuiltin.dartObjectConstructor:
+        // TODO(48585) How to get constructor for a Dart Object?
+        return js.call('TODO');
+      default:
+        throw UnsupportedError('JsBuiltin has no operation for "$builtin".');
+    }
+  }
+
+  String _enumValueName(Field field) {
+    var enumName = field.enclosingClass.name;
+    var valueName = field.name.text;
+    return '$enumName.$valueName';
+  }
+
+  JsGetName asJsGetName(Field field) => JsGetName.values
+      .firstWhere((val) => val.toString() == _enumValueName(field));
+
+  JsBuiltin asJsBuiltin(Field field) => JsBuiltin.values
+      .firstWhere((val) => val.toString() == _enumValueName(field));
+
   bool _isWebLibrary(Uri importUri) =>
       importUri != null &&
       importUri.isScheme('dart') &&
diff --git a/pkg/dev_compiler/lib/src/kernel/kernel_helpers.dart b/pkg/dev_compiler/lib/src/kernel/kernel_helpers.dart
index fa868d9..0576c6f 100644
--- a/pkg/dev_compiler/lib/src/kernel/kernel_helpers.dart
+++ b/pkg/dev_compiler/lib/src/kernel/kernel_helpers.dart
@@ -203,9 +203,13 @@
 }
 
 bool isInlineJS(Member e) =>
-    e is Procedure &&
-    e.name.text == 'JS' &&
-    e.enclosingLibrary.importUri.toString() == 'dart:_foreign_helper';
+    e is Procedure && _isProcedureFromForeignHelper('JS', e);
+
+/// Returns `true` if [p] is the procedure named [name] from the
+/// 'dart:_foreign_helper' library.
+bool _isProcedureFromForeignHelper(String name, Procedure p) =>
+    p.name.text == name &&
+    p.enclosingLibrary.importUri.toString() == 'dart:_foreign_helper';
 
 /// Whether the parameter [p] is covariant (either explicitly `covariant` or
 /// implicitly due to generics) and needs a check for soundness.
diff --git a/pkg/dev_compiler/lib/src/kernel/target.dart b/pkg/dev_compiler/lib/src/kernel/target.dart
index 9bddfc7..0a3e3ff 100644
--- a/pkg/dev_compiler/lib/src/kernel/target.dart
+++ b/pkg/dev_compiler/lib/src/kernel/target.dart
@@ -57,6 +57,9 @@
   @override
   List<String> get extraRequiredLibraries => const [
         'dart:_runtime',
+        'dart:_js_shared_embedded_names',
+        'dart:_recipe_syntax',
+        'dart:_rti',
         'dart:_dart2js_runtime_metrics',
         'dart:_debugger',
         'dart:_foreign_helper',
@@ -64,6 +67,7 @@
         'dart:_internal',
         'dart:_isolate_helper',
         'dart:_js_helper',
+        'dart:_js_names',
         'dart:_js_primitives',
         'dart:_metadata',
         'dart:_native_typed_data',
@@ -103,6 +107,7 @@
         'dart:_js_helper',
         'dart:_native_typed_data',
         'dart:_runtime',
+        'dart:_rti',
       ];
 
   @override
diff --git a/pkg/dev_compiler/pubspec.yaml b/pkg/dev_compiler/pubspec.yaml
index 5ec84aa..1acbb51 100644
--- a/pkg/dev_compiler/pubspec.yaml
+++ b/pkg/dev_compiler/pubspec.yaml
@@ -5,6 +5,7 @@
 environment:
   sdk: '>=2.15.0 <3.0.0'
 
+# Use 'any' constraints here; we get our versions from the DEPS file.
 dependencies:
   _fe_analyzer_shared: any
   _js_interop_checks: any
@@ -14,12 +15,14 @@
   build_integration: any
   collection: any
   front_end: any
+  js_shared: any
   kernel: any
   meta: any
   path: any
   source_maps: any
   source_span: any
 
+# Use 'any' constraints here; we get our versions from the DEPS file.
 dev_dependencies:
   browser_launcher: any
   expect: any
diff --git a/pkg/dev_compiler/test/sourcemap/ddc_common.dart b/pkg/dev_compiler/test/sourcemap/ddc_common.dart
index b090d76..6653e57 100644
--- a/pkg/dev_compiler/test/sourcemap/ddc_common.dart
+++ b/pkg/dev_compiler/test/sourcemap/ddc_common.dart
@@ -104,8 +104,7 @@
     var result = name;
     if (result.startsWith('new ')) result = result.substring(4);
     if (result.startsWith('Object.')) result = result.substring(7);
-    var inputName =
-        INPUT_FILE_NAME.substring(0, INPUT_FILE_NAME.indexOf('.') + 1);
+    var inputName = inputFileName.substring(0, inputFileName.indexOf('.') + 1);
     if (result.startsWith(inputName)) {
       result = result.substring(inputName.length);
     }
diff --git a/pkg/expect/pubspec.yaml b/pkg/expect/pubspec.yaml
index e231d0c..5f045c2 100644
--- a/pkg/expect/pubspec.yaml
+++ b/pkg/expect/pubspec.yaml
@@ -11,6 +11,7 @@
 environment:
   sdk: '>=2.12.0 <3.0.0'
 
+# Use 'any' constraints here; we get our versions from the DEPS file.
 dependencies:
   meta: any
   smith: any
diff --git a/pkg/front_end/lib/src/api_prototype/experimental_flags_generated.dart b/pkg/front_end/lib/src/api_prototype/experimental_flags_generated.dart
index 3bfd9d3..bc70279 100644
--- a/pkg/front_end/lib/src/api_prototype/experimental_flags_generated.dart
+++ b/pkg/front_end/lib/src/api_prototype/experimental_flags_generated.dart
@@ -125,7 +125,7 @@
 
   static const ExperimentalFlag inferenceUpdate1 = const ExperimentalFlag(
       name: 'inference-update-1',
-      isEnabledByDefault: false,
+      isEnabledByDefault: true,
       isExpired: false,
       enabledVersion: const Version(2, 18),
       experimentEnabledVersion: const Version(2, 18),
diff --git a/pkg/front_end/lib/src/fasta/util/outline_extractor.dart b/pkg/front_end/lib/src/fasta/util/outline_extractor.dart
index d1f5d0a..011171f 100644
--- a/pkg/front_end/lib/src/fasta/util/outline_extractor.dart
+++ b/pkg/front_end/lib/src/fasta/util/outline_extractor.dart
@@ -78,9 +78,18 @@
     ..packagesFileUri = packages
     ..sdkSummary = platform
     ..sdkRoot = sdk;
-  ProcessedOptions pOptions =
+  ProcessedOptions processedOptions =
       new ProcessedOptions(options: options, inputs: entryPointUris);
-  return CompilerContext.runWithOptions(pOptions, (CompilerContext c) async {
+  return extractOutlineWithProcessedOptions(entryPointUris,
+      verbosityLevel: verbosityLevel, processedOptions: processedOptions);
+}
+
+Future<Map<Uri, String>> extractOutlineWithProcessedOptions(
+    List<Uri> entryPointUris,
+    {int verbosityLevel: 0,
+    required ProcessedOptions processedOptions}) {
+  return CompilerContext.runWithOptions(processedOptions,
+      (CompilerContext c) async {
     FileSystem fileSystem = c.options.fileSystem;
     UriTranslator uriTranslator = await c.options.getUriTranslator();
     _Processor processor =
@@ -208,17 +217,26 @@
           await _premarkTopLevel(worklist, closed, partTopLevel);
         }
       } else if (child is Export) {
-        for (Uri importedUri in child.uris) {
-          if (!importedUri.isScheme("dart")) {
-            TopLevel exportTopLevel =
-                parsed[importedUri] ?? await preprocessUri(importedUri);
-            await _premarkTopLevel(worklist, closed, exportTopLevel);
-          }
+        for (Uri exportedUri in child.uris) {
+          if (exportedUri.isScheme("dart")) continue;
+          // E.g. conditional exports could point to non-existing files.
+          if (!await _exists(exportedUri)) continue;
+          TopLevel exportTopLevel =
+              parsed[exportedUri] ?? await preprocessUri(exportedUri);
+          await _premarkTopLevel(worklist, closed, exportTopLevel);
         }
       }
     }
   }
 
+  Future<bool> _exists(Uri uri) {
+    Uri fileUri = uri;
+    if (fileUri.isScheme("package")) {
+      fileUri = uriTranslator.translate(fileUri)!;
+    }
+    return fileSystem.entityForUri(fileUri).exists();
+  }
+
   Future<List<TopLevel>> _preprocessImportsAsNeeded(
       Map<TopLevel, List<TopLevel>> imports, TopLevel topLevel) async {
     List<TopLevel>? imported = imports[topLevel];
@@ -230,11 +248,13 @@
         if (child is Import) {
           child.marked = Coloring.Marked;
           for (Uri importedUri in child.uris) {
-            if (!importedUri.isScheme("dart")) {
-              TopLevel importedTopLevel =
-                  parsed[importedUri] ?? await preprocessUri(importedUri);
-              imported.add(importedTopLevel);
-            }
+            if (importedUri.isScheme("dart")) continue;
+            // E.g. conditional imports could point to non-existing files.
+            if (!await _exists(importedUri)) continue;
+
+            TopLevel importedTopLevel =
+                parsed[importedUri] ?? await preprocessUri(importedUri);
+            imported.add(importedTopLevel);
           }
         } else if (child is PartOf) {
           child.marked = Coloring.Marked;
@@ -399,10 +419,11 @@
           } else if (child is Export) {
             child.marked = Coloring.Marked;
             // do stuff to export.
-            for (Uri importedUri in child.uris) {
-              if (!importedUri.isScheme("dart")) {
-                other = parsed[importedUri] ?? await preprocessUri(importedUri);
-              }
+            for (Uri exportedUri in child.uris) {
+              if (exportedUri.isScheme("dart")) continue;
+              // E.g. conditional exports could point to non-existing files.
+              if (!await _exists(exportedUri)) continue;
+              other = parsed[exportedUri] ?? await preprocessUri(exportedUri);
             }
           } else if (child is Extension) {
             // TODO: Maybe put on a list to process later and only include if
@@ -645,16 +666,12 @@
       currentContainer.addChild(classFactoryMethod, map);
       log("Hello from factory method ${ids.first.token}.${ids.last.token}");
     } else {
-      Container findTopLevel = currentContainer;
-      while (findTopLevel is! TopLevel) {
-        findTopLevel = findTopLevel.parent!;
-      }
-      String src = findTopLevel.sourceText
-          .substring(startInclusive.charOffset, endInclusive.charEnd);
-      throw "Unexpected identifiers in class factory method: $ids "
-          "(${ids.map((e) => e.token.lexeme).toList()}) --- "
-          "error on source ${src} --- "
-          "${node.children}";
+      debugDumpSource(
+          startInclusive,
+          endInclusive,
+          node,
+          "Unexpected identifiers in class factory method: $ids "
+          "(${ids.map((e) => e.token.lexeme).toList()}).");
     }
 
     super.visitClassFactoryMethod(node, startInclusive, endInclusive);
@@ -678,20 +695,7 @@
       ClassMethodEnd node, Token startInclusive, Token endInclusive) {
     assert(currentContainer is Class);
 
-    String identifier;
-    try {
-      identifier = node.getNameIdentifier();
-    } catch (e) {
-      Container findTopLevel = currentContainer;
-      while (findTopLevel is! TopLevel) {
-        findTopLevel = findTopLevel.parent!;
-      }
-      String src = findTopLevel.sourceText
-          .substring(startInclusive.charOffset, endInclusive.charEnd);
-      throw "Unexpected identifiers in visitClassMethod --- "
-          "error on source ${src} --- "
-          "${node.children}";
-    }
+    String identifier = node.getNameIdentifier();
     ClassMethod classMethod =
         new ClassMethod(node, identifier, startInclusive, endInclusive);
     currentContainer.addChild(classMethod, map);
@@ -701,18 +705,16 @@
 
   @override
   void visitEnum(EnumEnd node, Token startInclusive, Token endInclusive) {
+    TopLevelDeclarationEnd parent = node.parent! as TopLevelDeclarationEnd;
+    IdentifierHandle identifier = parent.getIdentifier();
     List<IdentifierHandle> ids = node.getIdentifiers();
 
-    Enum e = new Enum(
-        node,
-        ids.first.token.lexeme,
-        ids.skip(1).map((e) => e.token.lexeme).toList(),
-        startInclusive,
-        endInclusive);
+    Enum e = new Enum(node, identifier.token.lexeme,
+        ids.map((e) => e.token.lexeme).toList(), startInclusive, endInclusive);
     currentContainer.addChild(e, map);
 
-    log("Hello from enum ${ids.first.token} with content "
-        "${ids.skip(1).map((e) => e.token).join(", ")}");
+    log("Hello from enum ${identifier.token} with content "
+        "${ids.map((e) => e.token).join(", ")}");
     super.visitEnum(node, startInclusive, endInclusive);
   }
 
@@ -790,6 +792,19 @@
     super.visitExtensionMethod(node, startInclusive, endInclusive);
   }
 
+  void debugDumpSource(Token startInclusive, Token endInclusive,
+      ParserAstNode node, String message) {
+    Container findTopLevel = currentContainer;
+    while (findTopLevel is! TopLevel) {
+      findTopLevel = findTopLevel.parent!;
+    }
+    String src = findTopLevel.sourceText
+        .substring(startInclusive.charOffset, endInclusive.charEnd);
+    throw "Error on source ${src} --- \n\n"
+        "$message ---\n\n"
+        "${node.children}";
+  }
+
   @override
   void visitImport(ImportEnd node, Token startInclusive, Token? endInclusive) {
     IdentifierHandle? prefix = node.getImportPrefix();
@@ -904,6 +919,7 @@
   void visitPartOf(PartOfEnd node, Token startInclusive, Token endInclusive) {
     // We'll assume we've gotten here via a "part" so we'll ignore that for now.
     // TODO: partOfUri could - in an error case - be null.
+    if (partOfUri == null) throw "partOfUri is null -- uri $uri";
     PartOf partof = new PartOf(node, partOfUri!, startInclusive, endInclusive);
     partof.marked = Coloring.Marked;
     currentContainer.addChild(partof, map);
diff --git a/pkg/front_end/lib/src/fasta/util/parser_ast.dart b/pkg/front_end/lib/src/fasta/util/parser_ast.dart
index 3b131cf..f30a4a8 100644
--- a/pkg/front_end/lib/src/fasta/util/parser_ast.dart
+++ b/pkg/front_end/lib/src/fasta/util/parser_ast.dart
@@ -1293,7 +1293,8 @@
     for (ParserAstNode child in children!) {
       if (child is TypeHandle ||
           child is NoTypeHandle ||
-          child is VoidKeywordHandle) {
+          child is VoidKeywordHandle ||
+          child is FunctionTypeEnd) {
         foundType = true;
       }
       if (foundType && child is IdentifierHandle) {
@@ -1312,7 +1313,8 @@
     for (ParserAstNode child in children!) {
       if (child is TypeHandle ||
           child is NoTypeHandle ||
-          child is VoidKeywordHandle) {
+          child is VoidKeywordHandle ||
+          child is FunctionTypeEnd) {
         foundType = true;
       }
       if (foundType && child is IdentifierHandle) {
diff --git a/pkg/front_end/outline_extraction_testcases/.packages b/pkg/front_end/outline_extraction_testcases/.packages
new file mode 100644
index 0000000..68325fa
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/.packages
@@ -0,0 +1 @@
+# dummy
\ No newline at end of file
diff --git a/pkg/front_end/outline_extraction_testcases/conditional_imports_exports_2/exists.dart b/pkg/front_end/outline_extraction_testcases/conditional_imports_exports_2/exists.dart
new file mode 100644
index 0000000..45a8112
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/conditional_imports_exports_2/exists.dart
@@ -0,0 +1,3 @@
+export 'nonexisting.dart' if (dart.library.io) 'exists2.dart';
+
+class Foo {}
diff --git a/pkg/front_end/outline_extraction_testcases/conditional_imports_exports_2/exists2.dart b/pkg/front_end/outline_extraction_testcases/conditional_imports_exports_2/exists2.dart
new file mode 100644
index 0000000..8c26988
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/conditional_imports_exports_2/exists2.dart
@@ -0,0 +1 @@
+class Foo2 {}
diff --git a/pkg/front_end/outline_extraction_testcases/conditional_imports_exports_2/main.dart b/pkg/front_end/outline_extraction_testcases/conditional_imports_exports_2/main.dart
new file mode 100644
index 0000000..90e030f
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/conditional_imports_exports_2/main.dart
@@ -0,0 +1,8 @@
+import 'nonexisting.dart' if (dart.library.io) 'exists.dart';
+export 'nonexisting.dart'
+    if (dart.library.html) 'exists2.dart'
+    if (dart.library.io) 'exists.dart';
+
+Foo x() {
+  return new Foo();
+}
diff --git a/pkg/front_end/outline_extraction_testcases/conditional_imports_exports_2/main.dart.outline_extracted b/pkg/front_end/outline_extraction_testcases/conditional_imports_exports_2/main.dart.outline_extracted
new file mode 100644
index 0000000..b26416d
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/conditional_imports_exports_2/main.dart.outline_extracted
@@ -0,0 +1,17 @@
+org-dartlang-testcase:///main.dart:
+import 'nonexisting.dart' if (dart.library.io) 'exists.dart';
+export 'nonexisting.dart' if (dart.library.html) 'exists2.dart' if (dart.library.io) 'exists.dart';
+Foo x() {}
+
+
+
+
+org-dartlang-testcase:///exists2.dart:
+class Foo2 {}
+
+
+
+
+org-dartlang-testcase:///exists.dart:
+export 'nonexisting.dart' if (dart.library.io) 'exists2.dart';
+class Foo {}
diff --git a/pkg/front_end/outline_extraction_testcases/factories/.packages b/pkg/front_end/outline_extraction_testcases/factories/.packages
new file mode 100644
index 0000000..6607aec
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/factories/.packages
@@ -0,0 +1 @@
+foo:.
\ No newline at end of file
diff --git a/pkg/front_end/outline_extraction_testcases/named_import_with_export_and_named_constructor_and_class_type_parameter/.packages b/pkg/front_end/outline_extraction_testcases/named_import_with_export_and_named_constructor_and_class_type_parameter/.packages
new file mode 100644
index 0000000..6607aec
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/named_import_with_export_and_named_constructor_and_class_type_parameter/.packages
@@ -0,0 +1 @@
+foo:.
\ No newline at end of file
diff --git a/pkg/front_end/outline_extraction_testcases/split_import_export_part/.packages b/pkg/front_end/outline_extraction_testcases/split_import_export_part/.packages
new file mode 100644
index 0000000..d19a7e0
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/split_import_export_part/.packages
@@ -0,0 +1 @@
+foobar:.
\ No newline at end of file
diff --git a/pkg/front_end/outline_extraction_testcases/use_of_imported_extension_2/foo.dart b/pkg/front_end/outline_extraction_testcases/use_of_imported_extension_2/foo.dart
index bd036e7..e48bd35 100644
--- a/pkg/front_end/outline_extraction_testcases/use_of_imported_extension_2/foo.dart
+++ b/pkg/front_end/outline_extraction_testcases/use_of_imported_extension_2/foo.dart
@@ -10,6 +10,8 @@
   int get giveInt => 42;
 }
 
+// The below doesn't have to be included.
+
 extension BarExtension on Bar {
   int get giveInt => 42;
 }
diff --git a/pkg/front_end/outline_extraction_testcases/use_of_imported_extension_3/foo.dart b/pkg/front_end/outline_extraction_testcases/use_of_imported_extension_3/foo.dart
new file mode 100644
index 0000000..b6168cc
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/use_of_imported_extension_3/foo.dart
@@ -0,0 +1,19 @@
+enum Foo {
+  a,
+  b,
+  c,
+  d,
+  e,
+}
+
+extension FooExtension on Foo {
+  Function(int) get foobar => (int value) => 42;
+}
+
+// The below doesn't have to be included.
+
+extension BarExtension on Bar {
+  Function(int) get foobar => (int value) => 42;
+}
+
+class Bar {}
diff --git a/pkg/front_end/outline_extraction_testcases/use_of_imported_extension_3/main.dart b/pkg/front_end/outline_extraction_testcases/use_of_imported_extension_3/main.dart
new file mode 100644
index 0000000..cf29838
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/use_of_imported_extension_3/main.dart
@@ -0,0 +1,5 @@
+import "foo.dart";
+
+final foo = [Foo.d, Foo.b];
+
+final foo2 = foo.map((f) => f.foobar).toList();
diff --git a/pkg/front_end/outline_extraction_testcases/use_of_imported_extension_3/main.dart.outline_extracted b/pkg/front_end/outline_extraction_testcases/use_of_imported_extension_3/main.dart.outline_extracted
new file mode 100644
index 0000000..29e4991
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/use_of_imported_extension_3/main.dart.outline_extracted
@@ -0,0 +1,17 @@
+org-dartlang-testcase:///main.dart:
+import "foo.dart";
+final foo = [Foo.d, Foo.b];
+final foo2 = foo.map((f) => f.foobar).toList();
+
+
+
+
+org-dartlang-testcase:///foo.dart:
+enum Foo { a, b, c, d, e, }
+extension FooExtension on Foo {
+  Function(int) get foobar => (int value) => 42;
+}
+extension BarExtension on Bar {
+  Function(int) get foobar => (int value) => 42;
+}
+class Bar {}
diff --git a/pkg/front_end/pubspec.yaml b/pkg/front_end/pubspec.yaml
index 780e0c6..aedd3be 100644
--- a/pkg/front_end/pubspec.yaml
+++ b/pkg/front_end/pubspec.yaml
@@ -8,27 +8,29 @@
 environment:
   sdk: '>=2.13.0 <3.0.0'
 
+# Use 'any' constraints here; we get our versions from the DEPS file.
 dependencies:
   _fe_analyzer_shared: any
   kernel: any
   package_config: any
 
+# Use 'any' constraints here; we get our versions from the DEPS file.
 dev_dependencies:
   analyzer: any
   args: any
   async_helper: any
   build_integration: any
   compiler: any
-  dart2wasm: any
   dart_style: any
+  dart2wasm: any
   dev_compiler: any
   expect: any
   json_rpc_2: any
   path: any
-  test: any
   test_reflective_loader: any
+  test: any
   testing: any
-  vm: any
   vm_service: any
+  vm: any
   web_socket_channel: any
   yaml: any
diff --git a/pkg/front_end/test/outline_extractor_suite.dart b/pkg/front_end/test/outline_extractor_suite.dart
index 02be7f5..4548f0c 100644
--- a/pkg/front_end/test/outline_extractor_suite.dart
+++ b/pkg/front_end/test/outline_extractor_suite.dart
@@ -100,13 +100,12 @@
   @override
   Future<Result<TestDescription>> run(
       TestDescription description, Context context) async {
-    Uri? packages = description.uri.resolve(".dart_tool/package_config.json");
+    Uri? packages = description.uri.resolve(".packages");
     if (!new File.fromUri(packages).existsSync()) {
       packages = null;
     }
     Map<Uri, String> result =
         await extractOutline([description.uri], packages: packages);
-
     StringBuffer sb = new StringBuffer();
     Uri uri = description.uri;
     Uri base = uri.resolve(".");
@@ -142,7 +141,7 @@
   @override
   Future<Result<TestDescription>> run(
       TestDescription description, Context context) async {
-    Uri? packages = description.uri.resolve(".dart_tool/package_config.json");
+    Uri? packages = description.uri.resolve(".packages");
     if (!new File.fromUri(packages).existsSync()) {
       packages = null;
     }
diff --git a/pkg/front_end/test/unit_test_suites.dart b/pkg/front_end/test/unit_test_suites.dart
index c9acb09..20fd455 100644
--- a/pkg/front_end/test/unit_test_suites.dart
+++ b/pkg/front_end/test/unit_test_suites.dart
@@ -31,9 +31,10 @@
     show createContext;
 import 'incremental_suite.dart' as incremental show createContext;
 import 'lint_suite.dart' as lint show createContext;
-import 'parser_suite.dart' as parser show createContext;
-import 'parser_equivalence_suite.dart' as parserEquivalence show createContext;
+import 'outline_extractor_suite.dart' as outline_extractor show createContext;
 import 'parser_all_suite.dart' as parserAll show createContext;
+import 'parser_equivalence_suite.dart' as parserEquivalence show createContext;
+import 'parser_suite.dart' as parser show createContext;
 import 'spelling_test_not_src_suite.dart' as spelling_not_src
     show createContext;
 import 'spelling_test_src_suite.dart' as spelling_src show createContext;
@@ -473,6 +474,12 @@
     "../../testing.json",
     shardCount: 1,
   ),
+  const Suite(
+    "outline_extractor",
+    outline_extractor.createContext,
+    "../testing.json",
+    shardCount: 1,
+  ),
 ];
 
 const Duration timeoutDuration = Duration(minutes: 30);
diff --git a/pkg/frontend_server/pubspec.yaml b/pkg/frontend_server/pubspec.yaml
index 9ce3011..93b3740 100644
--- a/pkg/frontend_server/pubspec.yaml
+++ b/pkg/frontend_server/pubspec.yaml
@@ -6,6 +6,7 @@
 environment:
   sdk: "^2.15.0"
 
+# Use 'any' constraints here; we get our versions from the DEPS file.
 dependencies:
   _fe_analyzer_shared: any
   args: any
@@ -19,6 +20,7 @@
   usage: any
   vm: any
 
+# Use 'any' constraints here; we get our versions from the DEPS file.
 dev_dependencies:
   mockito: any
   test: any
diff --git a/pkg/js/pubspec.yaml b/pkg/js/pubspec.yaml
index c8d12d3..25acfba 100644
--- a/pkg/js/pubspec.yaml
+++ b/pkg/js/pubspec.yaml
@@ -9,5 +9,9 @@
 dependencies:
   meta: ^1.7.0
 
+# We use 'any' version constraints here as we get our package versions from
+# the dart-lang/sdk repo's DEPS file. Note that this is a special case; the
+# best practice for packages is to specify their compatible version ranges.
+# See also https://dart.dev/tools/pub/dependencies.
 dev_dependencies:
   lints: any
diff --git a/pkg/js_ast/lib/src/nodes.dart b/pkg/js_ast/lib/src/nodes.dart
index 4e7acf0..fb2c480 100644
--- a/pkg/js_ast/lib/src/nodes.dart
+++ b/pkg/js_ast/lib/src/nodes.dart
@@ -642,6 +642,18 @@
 }
 
 abstract class Statement extends Node {
+  // Override for refined return type.
+  @override
+  Statement _clone();
+
+  // Override for refined return type.
+  @override
+  Statement withSourceInformation(
+      JavaScriptNodeSourceInformation? sourceInformation) {
+    if (sourceInformation == _sourceInformation) return this;
+    return _clone().._sourceInformation = sourceInformation;
+  }
+
   @override
   Statement toStatement() => this;
 }
@@ -1277,6 +1289,18 @@
   // have precedence depending on how the deferred node is resolved.
   int get precedenceLevel;
 
+  // Override for refined return type.
+  @override
+  Expression _clone();
+
+  // Override for refined return type.
+  @override
+  Expression withSourceInformation(
+      JavaScriptNodeSourceInformation? sourceInformation) {
+    if (sourceInformation == _sourceInformation) return this;
+    return _clone().._sourceInformation = sourceInformation;
+  }
+
   @override
   Statement toStatement() => ExpressionStatement(this);
 }
diff --git a/pkg/js_ast/pubspec.yaml b/pkg/js_ast/pubspec.yaml
index 7d23ea0..f630c01 100644
--- a/pkg/js_ast/pubspec.yaml
+++ b/pkg/js_ast/pubspec.yaml
@@ -5,6 +5,7 @@
 environment:
   sdk: '>=2.16.0 <3.0.0'
 
+# Use 'any' constraints here; we get our versions from the DEPS file.
 dev_dependencies:
   expect: any
   lints: any
diff --git a/pkg/js_runtime/lib/synced/async_await_error_codes.dart b/pkg/js_runtime/lib/synced/async_await_error_codes.dart
index 1708230..f87406b 100644
--- a/pkg/js_runtime/lib/synced/async_await_error_codes.dart
+++ b/pkg/js_runtime/lib/synced/async_await_error_codes.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.
 
-// @dart=2.12
-
 /// Contains error codes that transformed async/async* functions use to
 /// communicate with js_helper functions.
 
diff --git a/pkg/js_runtime/lib/synced/embedded_names.dart b/pkg/js_runtime/lib/synced/embedded_names.dart
index 0c99f47..bbb7001 100644
--- a/pkg/js_runtime/lib/synced/embedded_names.dart
+++ b/pkg/js_runtime/lib/synced/embedded_names.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.
 
-// @dart=2.12
-
 /// Contains the names of globals that are embedded into the output by the
 /// compiler.
 ///
diff --git a/pkg/js_runtime/pubspec.yaml b/pkg/js_runtime/pubspec.yaml
index 14f07a4..a452bc9 100644
--- a/pkg/js_runtime/pubspec.yaml
+++ b/pkg/js_runtime/pubspec.yaml
@@ -5,6 +5,7 @@
 environment:
   sdk: '>=2.12.0 <3.0.0'
 
+# Use 'any' constraints here; we get our versions from the DEPS file.
 dev_dependencies:
-  expect: any
   _fe_analyzer_shared: any
+  expect: any
diff --git a/pkg/js_runtime/test/in_sync_test.dart b/pkg/js_runtime/test/in_sync_test.dart
index 5dab586..be8828d 100644
--- a/pkg/js_runtime/test/in_sync_test.dart
+++ b/pkg/js_runtime/test/in_sync_test.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.
 
-// @dart = 2.9
-
 /// Test to verify that this package is in-sync with dart2js runtime libraries.
 import 'dart:io';
 
diff --git a/pkg/js_shared/lib/synced/embedded_names.dart b/pkg/js_shared/lib/synced/embedded_names.dart
index c2f6307..1e3317e 100644
--- a/pkg/js_shared/lib/synced/embedded_names.dart
+++ b/pkg/js_shared/lib/synced/embedded_names.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.
 
-// @dart=2.12
-
 /// A 'Universe' object used by 'dart:_rti'.
 const RTI_UNIVERSE = 'typeUniverse';
 
diff --git a/pkg/js_shared/lib/synced/recipe_syntax.dart b/pkg/js_shared/lib/synced/recipe_syntax.dart
index 3ccec60..b24e7c2 100644
--- a/pkg/js_shared/lib/synced/recipe_syntax.dart
+++ b/pkg/js_shared/lib/synced/recipe_syntax.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.
 
-// @dart=2.12
-
 /// Constants and predicates used for encoding and decoding type recipes.
 ///
 /// This library is synchronized between the compiler and the runtime system.
diff --git a/pkg/js_shared/pubspec.yaml b/pkg/js_shared/pubspec.yaml
index 6424aac..3503f25 100644
--- a/pkg/js_shared/pubspec.yaml
+++ b/pkg/js_shared/pubspec.yaml
@@ -5,6 +5,7 @@
 environment:
   sdk: '>=2.12.0 <3.0.0'
 
+# Use 'any' constraints here; we get our versions from the DEPS file.
 dev_dependencies:
-  expect: any
   _fe_analyzer_shared: any
+  expect: any
diff --git a/pkg/kernel/pubspec.yaml b/pkg/kernel/pubspec.yaml
index 31ec688..2fb1c7d 100644
--- a/pkg/kernel/pubspec.yaml
+++ b/pkg/kernel/pubspec.yaml
@@ -8,6 +8,7 @@
 environment:
   sdk: '>=2.12.0 <3.0.0'
 
+# Use 'any' constraints here; we get our versions from the DEPS file.
 dev_dependencies:
   args: any
   expect: any
diff --git a/pkg/language_versioning_2.7_test/pubspec.yaml b/pkg/language_versioning_2.7_test/pubspec.yaml
index 3245f03..5ee0691 100644
--- a/pkg/language_versioning_2.7_test/pubspec.yaml
+++ b/pkg/language_versioning_2.7_test/pubspec.yaml
@@ -11,4 +11,3 @@
 
 environment:
   sdk: '>=2.7.0 <3.0.0'
-
diff --git a/pkg/modular_test/pubspec.yaml b/pkg/modular_test/pubspec.yaml
index 538c555..1a20237 100644
--- a/pkg/modular_test/pubspec.yaml
+++ b/pkg/modular_test/pubspec.yaml
@@ -2,18 +2,20 @@
 # This package is not intended for consumption on pub.dev. DO NOT publish.
 publish_to: none
 description: >
- Small framework to test modular pipelines.
- This is used within the Dart SDK to define and validate modular tests, and to
- execute them using the modular pipeline of different SDK tools.
+ Small framework to test modular pipelines. This is used within the Dart SDK to
+ define and validate modular tests, and to execute them using the modular
+ pipeline of different SDK tools.
 
 environment:
   sdk: '>=2.16.0 <3.0.0'
 
+# Use 'any' constraints here; we get our versions from the DEPS file.
 dependencies:
   args: any
   package_config: any
   yaml: any
 
+# Use 'any' constraints here; we get our versions from the DEPS file.
 dev_dependencies:
   async_helper: any
   expect: any
diff --git a/pkg/native_stack_traces/pubspec.yaml b/pkg/native_stack_traces/pubspec.yaml
index 50320e5..ad5add0 100644
--- a/pkg/native_stack_traces/pubspec.yaml
+++ b/pkg/native_stack_traces/pubspec.yaml
@@ -13,5 +13,9 @@
   args: ^2.0.0
   path: ^1.8.0
 
+# We use 'any' version constraints here as we get our package versions from
+# the dart-lang/sdk repo's DEPS file. Note that this is a special case; the
+# best practice for packages is to specify their compatible version ranges.
+# See also https://dart.dev/tools/pub/dependencies.
 dev_dependencies:
   lints: any
diff --git a/pkg/nnbd_migration/pubspec.yaml b/pkg/nnbd_migration/pubspec.yaml
index 67f287b..381567b 100644
--- a/pkg/nnbd_migration/pubspec.yaml
+++ b/pkg/nnbd_migration/pubspec.yaml
@@ -6,10 +6,11 @@
 environment:
   sdk: '>=2.14.0 <3.0.0'
 
+# Use 'any' constraints here; we get our versions from the DEPS file.
 dependencies:
   _fe_analyzer_shared: any
-  analyzer: any
   analyzer_plugin: any
+  analyzer: any
   args: any
   cli_util: any
   collection: any
@@ -20,9 +21,10 @@
   source_span: any
   yaml: any
 
+# Use 'any' constraints here; we get our versions from the DEPS file.
 dev_dependencies:
   analyzer_utilities: any
   http: any
   lints: any
-  test: any
   test_reflective_loader: any
+  test: any
diff --git a/pkg/nnbd_migration/test/api_test.dart b/pkg/nnbd_migration/test/api_test.dart
index 68359b0..c920737 100644
--- a/pkg/nnbd_migration/test/api_test.dart
+++ b/pkg/nnbd_migration/test/api_test.dart
@@ -6497,6 +6497,27 @@
     await _checkSingleFileChanges(content, expected);
   }
 
+  @FailingTest(issue: 'https://github.com/dart-lang/sdk/issues/49106')
+  Future<void> test_map_read_does_not_require_index_cast() async {
+    var content = '''
+int f(Map<String, int> m, Object o) => m[o];
+''';
+    var expected = '''
+int? f(Map<String, int> m, Object o) => m[o];
+''';
+    await _checkSingleFileChanges(content, expected);
+  }
+
+  Future<void> test_map_write_requires_index_cast() async {
+    var content = '''
+void f(Map<String, int> m, Object o, int i) => m[o] = i;
+''';
+    var expected = '''
+void f(Map<String, int> m, Object o, int i) => m[o as String] = i;
+''';
+    await _checkSingleFileChanges(content, expected);
+  }
+
   Future<void> test_methodInvocation_extension_invocation() async {
     var content = '''
 extension on bool {
@@ -9466,6 +9487,52 @@
     await _checkSingleFileChanges(content, expected);
   }
 
+  Future<void> test_whereNotNull_iterable_dynamic() async {
+    var content = '''
+f(Iterable<dynamic> it) => it.where((s) => s != null);
+''';
+    var expected = '''
+import 'package:collection/collection.dart' show IterableNullableExtension;
+
+f(Iterable<dynamic> it) => it.whereNotNull();
+''';
+    await _checkSingleFileChanges(content, expected);
+  }
+
+  @FailingTest(issue: 'https://github.com/dart-lang/sdk/issues/49103')
+  Future<void> test_whereNotNull_iterable_U() async {
+    var content = '''
+f<U>(Iterable<U> it) => it.where((s) => s != null);
+''';
+    // whereNotNull cannot be used in this case, because its signature is:
+    //
+    //   extension IterableNullableExtension<T extends Object> on Iterable<T?> {
+    //     Iterable<T> whereNotNull() => ...;
+    //   }
+    //
+    // When the type system tries to solve for a substitution T=... that makes
+    // the extension apply, it gets T=U, but that doesn't work because U is not
+    // a subtype of Object.
+    //
+    // So the migration tool shouldn't change the `where` to `whereNotNull`.
+    var expected = '''
+f<U>(Iterable<U> it) => it.where((s) => s != null);
+''';
+    await _checkSingleFileChanges(content, expected);
+  }
+
+  Future<void> test_whereNotNull_iterable_U_extends_object() async {
+    var content = '''
+f<U extends Object>(Iterable<U> it) => it.where((s) => s != null);
+''';
+    var expected = '''
+import 'package:collection/collection.dart' show IterableNullableExtension;
+
+f<U extends Object>(Iterable<U> it) => it.whereNotNull();
+''';
+    await _checkSingleFileChanges(content, expected);
+  }
+
   Future<void> test_whereNotNull_noContext() async {
     var content = '''
 f(Iterable<String/*?*/> it) => it.where((s) => s != null);
diff --git a/pkg/scrape/pubspec.yaml b/pkg/scrape/pubspec.yaml
index ca3cee5..ccfb019 100644
--- a/pkg/scrape/pubspec.yaml
+++ b/pkg/scrape/pubspec.yaml
@@ -6,10 +6,12 @@
 environment:
   sdk: ^2.13.0
 
+# Use 'any' constraints here; we get our versions from the DEPS file.
 dependencies:
-  args: any
   analyzer: any
+  args: any
   path: any
 
+# Use 'any' constraints here; we get our versions from the DEPS file.
 dev_dependencies:
   lints: any
diff --git a/pkg/smith/pubspec.yaml b/pkg/smith/pubspec.yaml
index 4dfeaea..e92131c 100644
--- a/pkg/smith/pubspec.yaml
+++ b/pkg/smith/pubspec.yaml
@@ -2,7 +2,10 @@
 description: Shared code for working with the Dart SDK's tests and test runner.
 # This package is not intended for consumption on pub.dev. DO NOT publish.
 publish_to: none
+
 environment:
-  sdk: "^2.12.0"
+  sdk: '^2.12.0'
+
+# Use 'any' constraints here; we get our versions from the DEPS file.
 dev_dependencies:
   expect: any
diff --git a/pkg/sourcemap_testing/analysis_options.yaml b/pkg/sourcemap_testing/analysis_options.yaml
new file mode 100644
index 0000000..a7b9b01
--- /dev/null
+++ b/pkg/sourcemap_testing/analysis_options.yaml
@@ -0,0 +1,18 @@
+# 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.
+
+include: package:lints/recommended.yaml
+
+analyzer:
+  errors:
+    implementation_imports: ignore
+
+linter:
+  rules:
+    # Not enforced by the lints package at any version.
+    - always_declare_return_types
+    - depend_on_referenced_packages
+    - directives_ordering
+    - prefer_single_quotes
+    - prefer_relative_imports
diff --git a/pkg/sourcemap_testing/lib/src/stacktrace_helper.dart b/pkg/sourcemap_testing/lib/src/stacktrace_helper.dart
index 8c545e2..43c9fa9 100644
--- a/pkg/sourcemap_testing/lib/src/stacktrace_helper.dart
+++ b/pkg/sourcemap_testing/lib/src/stacktrace_helper.dart
@@ -3,17 +3,18 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'dart:async';
-import 'dart:io';
 import 'dart:convert' show jsonDecode;
+import 'dart:io';
 
 import 'package:_fe_analyzer_shared/src/testing/annotated_code_helper.dart';
+import 'package:dart2js_tools/src/dart2js_mapping.dart';
+import 'package:dart2js_tools/src/util.dart';
 import 'package:expect/expect.dart';
 import 'package:source_maps/source_maps.dart';
 import 'package:source_maps/src/utils.dart';
 import 'package:source_span/source_span.dart';
-import 'package:dart2js_tools/src/dart2js_mapping.dart';
 
-const String INPUT_FILE_NAME = 'input.dart';
+const String inputFileName = 'input.dart';
 
 class Test {
   final String code;
@@ -33,7 +34,7 @@
 /// the annotations by prefix.
 Test processTestCode(String code, Iterable<String> configs) {
   AnnotatedCode annotatedCode =
-      new AnnotatedCode.fromText(code, commentStart, commentEnd);
+      AnnotatedCode.fromText(code, commentStart, commentEnd);
 
   Map<String, Expectations> expectationMap = <String, Expectations>{};
 
@@ -47,8 +48,8 @@
       int colonIndex = text.indexOf(':');
       String indexText = text.substring(0, colonIndex);
       String methodName = text.substring(colonIndex + 1);
-      StackTraceLine stackTraceLine = new StackTraceLine(
-          methodName, INPUT_FILE_NAME, annotation.lineNo, annotation.columnNo);
+      StackTraceLine stackTraceLine = StackTraceLine(
+          methodName, inputFileName, annotation.lineNo, annotation.columnNo);
       if (indexText == '') {
         unexpectedLines.add(stackTraceLine);
       } else {
@@ -58,24 +59,24 @@
       }
     }
 
-    List<StackTraceLine> expectedLines = <StackTraceLine>[];
+    List<StackTraceLine> expectedLines = [];
     for (int stackTraceIndex
         in (stackTraceMap.keys.toList()..sort()).reversed) {
-      expectedLines.add(stackTraceMap[stackTraceIndex]);
+      expectedLines.add(stackTraceMap[stackTraceIndex]!);
     }
-    expectationMap[config] = new Expectations(expectedLines, unexpectedLines);
+    expectationMap[config] = Expectations(expectedLines, unexpectedLines);
   });
 
-  return new Test(annotatedCode.sourceCode, expectationMap);
+  return Test(annotatedCode.sourceCode, expectationMap);
 }
 
 /// Compile function used in [testStackTrace]. [input] is the name of the input
 /// Dart file and [output] is the name of the generated JavaScript file. The
 /// function returns `true` if the compilation succeeded.
-typedef Future<bool> CompileFunc(String input, String output);
+typedef CompileFunc = Future<bool> Function(String, String);
 
 List<String> emptyPreamble(input, output) => const <String>[];
-String identityConverter(String name) => name;
+String? identityConverter(String? name) => name;
 
 /// Tests the stack trace of [test] using the expectations for [config].
 ///
@@ -97,45 +98,45 @@
 /// will not be cleaned up. Note that if *not* giving a temporary directory and
 /// the test fails the directory will not be cleaned up.
 Future testStackTrace(Test test, String config, CompileFunc compile,
-    {bool printJs: false,
-    bool writeJs: false,
-    bool verbose: false,
-    List<String> Function(String input, String output) jsPreambles:
+    {bool printJs = false,
+    bool writeJs = false,
+    bool verbose = false,
+    List<String> Function(String input, String output) jsPreambles =
         emptyPreamble,
-    List<LineException> beforeExceptions: const <LineException>[],
-    List<LineException> afterExceptions: const <LineException>[],
-    bool useJsMethodNamesOnAbsence: false,
-    String Function(String name) jsNameConverter: identityConverter,
-    Directory forcedTmpDir: null,
-    int stackTraceLimit: 10,
-    expandDart2jsInliningData: false}) async {
+    List<LineException> beforeExceptions = const <LineException>[],
+    List<LineException> afterExceptions = const <LineException>[],
+    bool useJsMethodNamesOnAbsence = false,
+    String? Function(String? name) jsNameConverter = identityConverter,
+    Directory? forcedTmpDir,
+    int stackTraceLimit = 10,
+    expandDart2jsInliningData = false}) async {
   Expect.isTrue(test.expectationMap.keys.contains(config),
       "No expectations found for '$config' in ${test.expectationMap.keys}");
 
   Directory tmpDir =
       forcedTmpDir ?? await Directory.systemTemp.createTemp('stacktrace-test');
-  String input = '${tmpDir.path}/$INPUT_FILE_NAME';
-  new File(input).writeAsStringSync(test.code);
+  String input = '${tmpDir.path}/$inputFileName';
+  File(input).writeAsStringSync(test.code);
   String output = '${tmpDir.path}/out.js';
 
   Expect.isTrue(await compile(input, output),
-      "Unsuccessful compilation of test:\n${test.code}");
-  File sourceMapFile = new File('$output.map');
+      'Unsuccessful compilation of test:\n${test.code}');
+  File sourceMapFile = File('$output.map');
   Expect.isTrue(
-      sourceMapFile.existsSync(), "Source map not generated for $input");
+      sourceMapFile.existsSync(), 'Source map not generated for $input');
   String sourceMapText = sourceMapFile.readAsStringSync();
-  SingleMapping sourceMap = parse(sourceMapText);
-  String jsOutput = new File(output).readAsStringSync();
+  SingleMapping sourceMap = parseSingleMapping(jsonDecode(sourceMapText));
+  String jsOutput = File(output).readAsStringSync();
 
   if (printJs) {
     print('JavaScript output:');
     print(jsOutput);
   }
   if (writeJs) {
-    new File('out.js').writeAsStringSync(jsOutput);
-    new File('out.js.map').writeAsStringSync(sourceMapText);
+    File('out.js').writeAsStringSync(jsOutput);
+    File('out.js.map').writeAsStringSync(sourceMapText);
   }
-  print("Running d8 $output");
+  print('Running d8 $output');
   List<String> d8Arguments = <String>[];
   d8Arguments.add('--stack-trace-limit');
   d8Arguments.add('$stackTraceLimit');
@@ -147,11 +148,11 @@
     print('d8 output:');
     print(out);
   }
-  List<String> lines = out.split(new RegExp(r'(\r|\n|\r\n)'));
+  List<String> lines = out.split(RegExp(r'(\r|\n|\r\n)'));
   List<StackTraceLine> jsStackTrace = <StackTraceLine>[];
   for (String line in lines) {
     if (line.startsWith('    at ')) {
-      StackTraceLine stackTraceLine = new StackTraceLine.fromText(line);
+      StackTraceLine stackTraceLine = StackTraceLine.fromText(line);
       if (stackTraceLine.lineNo != null && stackTraceLine.columnNo != null) {
         jsStackTrace.add(stackTraceLine);
       }
@@ -160,21 +161,18 @@
 
   List<StackTraceLine> dartStackTrace = <StackTraceLine>[];
   for (StackTraceLine line in jsStackTrace) {
-    TargetEntry targetEntry = _findColumn(
-        line.lineNo - 1, line.columnNo - 1, _findLine(sourceMap, line));
+    TargetEntry? targetEntry = _findColumn(
+        line.lineNo! - 1, line.columnNo! - 1, _findLine(sourceMap, line));
     if (targetEntry == null || targetEntry.sourceUrlId == null) {
       dartStackTrace.add(line);
     } else {
-      String fileName;
-      if (targetEntry.sourceUrlId != null) {
-        fileName = sourceMap.urls[targetEntry.sourceUrlId];
-      }
-      int targetLine = targetEntry.sourceLine + 1;
-      int targetColumn = targetEntry.sourceColumn + 1;
+      String fileName = sourceMap.urls[targetEntry.sourceUrlId!];
+      int targetLine = targetEntry.sourceLine! + 1;
+      int targetColumn = targetEntry.sourceColumn! + 1;
 
       if (expandDart2jsInliningData) {
-        SourceFile file = new SourceFile.fromString(jsOutput);
-        int offset = file.getOffset(line.lineNo - 1, line.columnNo - 1);
+        SourceFile file = SourceFile.fromString(jsOutput);
+        int offset = file.getOffset(line.lineNo! - 1, line.columnNo! - 1);
         Map<int, List<FrameEntry>> frames =
             _loadInlinedFrameData(sourceMap, sourceMapText);
         List<int> indices = frames.keys.toList()..sort();
@@ -182,19 +180,19 @@
         int depth = 0;
         outer:
         while (key >= 0) {
-          for (var frame in frames[indices[key]].reversed) {
+          for (var frame in frames[indices[key]]!.reversed) {
             if (frame.isEmpty) break outer;
             if (frame.isPush) {
               if (depth <= 0) {
-                dartStackTrace.add(new StackTraceLine(
-                    frame.inlinedMethodName + "(inlined)",
+                dartStackTrace.add(StackTraceLine(
+                    '${frame.inlinedMethodName}(inlined)',
                     fileName,
                     targetLine,
                     targetColumn,
                     isMapped: true));
-                fileName = frame.callUri;
-                targetLine = frame.callLine + 1;
-                targetColumn = frame.callColumn + 1;
+                fileName = frame.callUri!;
+                targetLine = frame.callLine! + 1;
+                targetColumn = frame.callColumn! + 1;
               } else {
                 depth--;
               }
@@ -208,20 +206,20 @@
         targetEntry = findEnclosingFunction(jsOutput, file, offset, sourceMap);
       }
 
-      String methodName;
-      if (targetEntry.sourceNameId != null) {
-        methodName = sourceMap.names[targetEntry.sourceNameId];
+      String? methodName;
+      if (targetEntry!.sourceNameId != null) {
+        methodName = sourceMap.names[targetEntry.sourceNameId!];
       } else if (useJsMethodNamesOnAbsence) {
         methodName = jsNameConverter(line.methodName);
       }
 
-      dartStackTrace.add(new StackTraceLine(
+      dartStackTrace.add(StackTraceLine(
           methodName, fileName, targetLine, targetColumn,
           isMapped: true));
     }
   }
 
-  Expectations expectations = test.expectationMap[config];
+  Expectations expectations = test.expectationMap[config]!;
 
   int expectedIndex = 0;
   List<StackTraceLine> unexpectedLines = <StackTraceLine>[];
@@ -251,7 +249,7 @@
       for (LineException exception in exceptions) {
         String fileName = exception.fileName;
         if (line.methodName == exception.methodName &&
-            line.fileName.endsWith(fileName)) {
+            line.fileName!.endsWith(fileName)) {
           found = true;
         }
       }
@@ -273,20 +271,20 @@
   Expect.equals(
       expectedIndex,
       expectations.expectedLines.length,
-      "Missing stack trace lines for test:\n${test.code}\n"
-      "Actual:\n${dartStackTrace.join('\n')}\n\n"
-      "Expected:\n${expectations.expectedLines.join('\n')}\n");
+      'Missing stack trace lines for test:\n${test.code}\n'
+      'Actual:\n${dartStackTrace.join('\n')}\n\n'
+      'Expected:\n${expectations.expectedLines.join('\n')}\n');
   Expect.isTrue(
       unexpectedLines.isEmpty,
-      "Unexpected stack trace lines for test:\n${test.code}\n"
-      "Actual:\n${dartStackTrace.join('\n')}\n\n"
-      "Unexpected:\n${expectations.unexpectedLines.join('\n')}\n");
+      'Unexpected stack trace lines for test:\n${test.code}\n'
+      'Actual:\n${dartStackTrace.join('\n')}\n\n'
+      'Unexpected:\n${expectations.unexpectedLines.join('\n')}\n');
   Expect.isTrue(
       unexpectedBeforeLines.isEmpty && unexpectedAfterLines.isEmpty,
-      "Unexpected stack trace lines:\n${test.code}\n"
-      "Actual:\n${dartStackTrace.join('\n')}\n\n"
-      "Unexpected before:\n${unexpectedBeforeLines.join('\n')}\n\n"
-      "Unexpected after:\n${unexpectedAfterLines.join('\n')}\n");
+      'Unexpected stack trace lines:\n${test.code}\n'
+      'Actual:\n${dartStackTrace.join('\n')}\n\n'
+      'Unexpected before:\n${unexpectedBeforeLines.join('\n')}\n\n'
+      'Unexpected after:\n${unexpectedAfterLines.join('\n')}\n');
 
   if (forcedTmpDir == null) {
     print("Deleting '${tmpDir.path}'.");
@@ -295,14 +293,14 @@
 }
 
 class StackTraceLine {
-  String methodName;
-  String fileName;
-  int lineNo;
-  int columnNo;
+  String? methodName;
+  String? fileName;
+  int? lineNo;
+  int? columnNo;
   bool isMapped;
 
   StackTraceLine(this.methodName, this.fileName, this.lineNo, this.columnNo,
-      {this.isMapped: false});
+      {this.isMapped = false});
 
   /// Creates a [StackTraceLine] by parsing a d8 stack trace line [text]. The
   /// expected formats are
@@ -318,22 +316,22 @@
     text = text.trim();
     assert(text.startsWith('at '));
     text = text.substring('at '.length);
-    String methodName;
+    String? methodName;
     if (text.endsWith(')')) {
       int nameEnd = text.indexOf(' (');
       methodName = text.substring(0, nameEnd);
       text = text.substring(nameEnd + 2, text.length - 1);
     }
-    int lineNo;
-    int columnNo;
+    int? lineNo;
+    int? columnNo;
     String fileName;
     int lastColon = text.lastIndexOf(':');
     if (lastColon != -1) {
-      int lastValue = int.tryParse(text.substring(lastColon + 1));
+      int? lastValue = int.tryParse(text.substring(lastColon + 1));
       if (lastValue != null) {
         int secondToLastColon = text.lastIndexOf(':', lastColon - 1);
         if (secondToLastColon != -1) {
-          int secondToLastValue =
+          int? secondToLastValue =
               int.tryParse(text.substring(secondToLastColon + 1, lastColon));
           if (secondToLastValue != null) {
             lineNo = secondToLastValue;
@@ -353,11 +351,12 @@
     } else {
       fileName = text;
     }
-    return new StackTraceLine(methodName, fileName, lineNo, columnNo);
+    return StackTraceLine(methodName, fileName, lineNo, columnNo);
   }
 
+  @override
   String toString() {
-    StringBuffer sb = new StringBuffer();
+    StringBuffer sb = StringBuffer();
     sb.write('  at ');
     if (methodName != null) {
       sb.write(methodName);
@@ -384,14 +383,14 @@
 /// number is lower or equal to [line].
 ///
 /// Copied from [SingleMapping._findLine].
-TargetLineEntry _findLine(SingleMapping sourceMap, StackTraceLine stLine) {
-  String filename = stLine.fileName
-      .substring(stLine.fileName.lastIndexOf(new RegExp("[\\\/]")) + 1);
+TargetLineEntry? _findLine(SingleMapping sourceMap, StackTraceLine stLine) {
+  String filename = stLine.fileName!
+      .substring(stLine.fileName!.lastIndexOf(RegExp('[\\/]')) + 1);
   if (sourceMap.targetUrl != filename) return null;
-  return _findLineInternal(sourceMap, stLine.lineNo - 1);
+  return _findLineInternal(sourceMap, stLine.lineNo! - 1);
 }
 
-TargetLineEntry _findLineInternal(SingleMapping sourceMap, int line) {
+TargetLineEntry? _findLineInternal(SingleMapping sourceMap, int line) {
   int index = binarySearch(sourceMap.lines, (e) => e.line > line);
   return (index <= 0) ? null : sourceMap.lines[index - 1];
 }
@@ -403,8 +402,8 @@
 /// the very last entry on that line.
 ///
 /// Copied from [SingleMapping._findColumn].
-TargetEntry _findColumn(int line, int column, TargetLineEntry lineEntry) {
-  if (lineEntry == null || lineEntry.entries.length == 0) return null;
+TargetEntry? _findColumn(int line, int column, TargetLineEntry? lineEntry) {
+  if (lineEntry == null || lineEntry.entries.isEmpty) return null;
   if (lineEntry.line != line) return lineEntry.entries.last;
   var entries = lineEntry.entries;
   int index = binarySearch(entries, (e) => e.column > column);
@@ -420,7 +419,7 @@
   } else if (Platform.isMacOS) {
     return 'third_party/d8/macos/d8';
   }
-  throw new UnsupportedError('Unsupported platform.');
+  throw UnsupportedError('Unsupported platform.');
 }
 
 /// A line allowed in the mapped stack trace.
@@ -433,9 +432,8 @@
 
 /// Search backwards in [sources] for a function declaration that includes the
 /// [start] offset.
-TargetEntry findEnclosingFunction(
+TargetEntry? findEnclosingFunction(
     String sources, SourceFile file, int start, SingleMapping mapping) {
-  if (sources == null) return null;
   var index = start;
   while (true) {
     index = nextDeclarationCandidate(sources, index);
diff --git a/pkg/sourcemap_testing/lib/src/stepping_helper.dart b/pkg/sourcemap_testing/lib/src/stepping_helper.dart
index 5468af7..9392f77 100644
--- a/pkg/sourcemap_testing/lib/src/stepping_helper.dart
+++ b/pkg/sourcemap_testing/lib/src/stepping_helper.dart
@@ -1,77 +1,76 @@
+import 'dart:convert' show jsonDecode;
 import 'dart:io';
 
 import 'package:_fe_analyzer_shared/src/testing/annotated_code_helper.dart';
+import 'package:collection/collection.dart' show IterableNullableExtension;
+import 'package:dart2js_tools/src/util.dart';
 import 'package:expect/minitest.dart';
 import 'package:path/path.dart' as path;
 import 'package:source_maps/source_maps.dart';
 
-/**
- * Runs D8 and steps as the AnnotatedCode dictates.
- *
- * Note that the compiled javascript is expected to be called "js.js" inside the
- * outputPath directory. It is also expected that there is a "js.js.map" file.
- * It is furthermore expected that the js has been compiled from a file in the
- * same folder called test.dart.
- */
+/// Runs D8 and steps as the AnnotatedCode dictates.
+///
+/// Note that the compiled javascript is expected to be called "js.js" inside
+/// the outputPath directory. It is also expected that there is a "js.js.map"
+/// file. It is furthermore expected that the js has been compiled from a file
+/// in the same folder called test.dart.
 ProcessResult runD8AndStep(String outputPath, String testFileName,
     AnnotatedCode code, List<String> scriptD8Command) {
-  var outputFile = path.join(outputPath, "js.js");
-  SingleMapping sourceMap =
-      parse(new File("${outputFile}.map").readAsStringSync());
+  var outputFile = path.join(outputPath, 'js.js');
+  var sourcemapText = File('$outputFile.map').readAsStringSync();
+  SingleMapping sourceMap = parseSingleMapping(jsonDecode(sourcemapText));
 
-  Set<int> mappedToLines = sourceMap.lines
+  Set<int?> mappedToLines = sourceMap.lines
       .map((entry) => entry.entries.map((entry) => entry.sourceLine).toSet())
-      .fold(new Set<int>(), (prev, e) => prev..addAll(e));
+      .fold(<int?>{}, (prev, e) => prev..addAll(e));
 
   for (Annotation annotation
-      in code.annotations.where((a) => a.text.trim() == "nm")) {
+      in code.annotations.where((a) => a.text.trim() == 'nm')) {
     if (mappedToLines.contains(annotation.lineNo - 1)) {
-      fail("Was not allowed to have a mapping to line "
-          "${annotation.lineNo}, but did.\n"
-          "Sourcemap looks like this (note 0-indexed):\n"
-          "${sourceMap.debugString}");
+      fail('Was not allowed to have a mapping to line '
+          '${annotation.lineNo}, but did.\n'
+          'Sourcemap looks like this (note 0-indexed):\n'
+          '${sourceMap.debugString}');
     }
   }
 
-  List<String> breakpoints = [];
+  List<String?> breakpoints = [];
   // Annotations are 1-based, js breakpoints are 0-based.
   for (Annotation breakAt
-      in code.annotations.where((a) => a.text.trim() == "bl")) {
+      in code.annotations.where((a) => a.text.trim() == 'bl')) {
     breakpoints
         .add(_getJsBreakpointLine(testFileName, sourceMap, breakAt.lineNo - 1));
   }
   for (Annotation breakAt
-      in code.annotations.where((a) => a.text.trim().startsWith("bc:"))) {
+      in code.annotations.where((a) => a.text.trim().startsWith('bc:'))) {
     breakpoints.add(_getJsBreakpointLineAndColumn(
         testFileName, sourceMap, breakAt.lineNo - 1, breakAt.columnNo - 1));
   }
 
-  File inspectorFile = new File.fromUri(
-      sdkRoot.uri.resolve("pkg/sourcemap_testing/lib/src/js/inspector.js"));
+  File inspectorFile = File.fromUri(
+      sdkRoot!.uri.resolve('pkg/sourcemap_testing/lib/src/js/inspector.js'));
   if (!inspectorFile.existsSync()) throw "Couldn't find 'inspector.js'";
-  var outInspectorPath = path.join(outputPath, "inspector.js");
+  var outInspectorPath = path.join(outputPath, 'inspector.js');
   inspectorFile.copySync(outInspectorPath);
-  String debugAction = "Debugger.stepInto";
-  if (code.annotations.any((a) => a.text.trim() == "Debugger:stepOver")) {
-    debugAction = "Debugger.stepOver";
+  String debugAction = 'Debugger.stepInto';
+  if (code.annotations.any((a) => a.text.trim() == 'Debugger:stepOver')) {
+    debugAction = 'Debugger.stepOver';
   }
   return _runD8(outInspectorPath, scriptD8Command, debugAction, breakpoints);
 }
 
-/**
- * Translates the D8 js steps and checks against expectations.
- *
- * Note that the compiled javascript is expected to be called "js.js" inside the
- * outputPath directory. It is also expected that there is a "js.js.map" file.
- * It is furthermore expected that the js has been compiled from a file in the
- * same folder called test.dart.
- */
+/// Translates the D8 js steps and checks against expectations.
+///
+/// Note that the compiled javascript is expected to be called "js.js" inside
+/// the outputPath directory. It is also expected that there is a "js.js.map"
+/// file. It is furthermore expected that the js has been compiled from a file
+/// in the same folder called test.dart.
 void checkD8Steps(String outputPath, List<String> d8Output, AnnotatedCode code,
-    {bool debug: false}) {
-  var outputFilename = "js.js";
+    {bool debug = false}) {
+  var outputFilename = 'js.js';
   var outputFile = path.join(outputPath, outputFilename);
-  SingleMapping sourceMap =
-      parse(new File("${outputFile}.map").readAsStringSync());
+  var sourcemapText = File('$outputFile.map').readAsStringSync();
+  SingleMapping sourceMap = parseSingleMapping(jsonDecode(sourcemapText));
 
   List<List<_DartStackTraceDataEntry>> result =
       _extractStackTraces(d8Output, sourceMap, outputFilename);
@@ -81,71 +80,68 @@
   if (debug) _debugPrint(trace, outputPath);
 
   List<String> recordStops =
-      trace.where((entry) => !entry.isError).map((entry) => "$entry").toList();
+      trace.where((entry) => !entry.isError).map((entry) => '$entry').toList();
 
   Set<int> recordStopLines =
       trace.where((entry) => !entry.isError).map((entry) => entry.line).toSet();
   Set<String> recordStopLineColumns = trace
       .where((entry) => !entry.isError)
-      .map((entry) => "${entry.line}:${entry.column}")
+      .map((entry) => '${entry.line}:${entry.column}')
       .toSet();
 
   List<String> expectedStops = [];
   for (Annotation annotation in code.annotations.where((annotation) =>
-      annotation.text.trim().startsWith("s:") ||
-      annotation.text.trim().startsWith("sl:") ||
-      annotation.text.trim().startsWith("bc:"))) {
+      annotation.text.trim().startsWith('s:') ||
+      annotation.text.trim().startsWith('sl:') ||
+      annotation.text.trim().startsWith('bc:'))) {
     String text = annotation.text.trim();
-    int stopNum = int.parse(text.substring(text.indexOf(":") + 1));
+    int stopNum = int.parse(text.substring(text.indexOf(':') + 1));
     if (expectedStops.length < stopNum) expectedStops.length = stopNum;
-    if (text.startsWith("sl:")) {
-      expectedStops[stopNum - 1] = "test.dart:${annotation.lineNo}:";
+    if (text.startsWith('sl:')) {
+      expectedStops[stopNum - 1] = 'test.dart:${annotation.lineNo}:';
     } else {
       expectedStops[stopNum - 1] =
-          "test.dart:${annotation.lineNo}:${annotation.columnNo}:";
+          'test.dart:${annotation.lineNo}:${annotation.columnNo}:';
     }
   }
 
-  List<List<String>> noBreaksStart = [];
-  List<List<String>> noBreaksEnd = [];
+  List<List<String>?> noBreaksStart = [];
+  List<List<String>?> noBreaksEnd = [];
   for (Annotation annotation in code.annotations
-      .where((annotation) => annotation.text.trim().startsWith("nbb:"))) {
+      .where((annotation) => annotation.text.trim().startsWith('nbb:'))) {
     String text = annotation.text.trim();
-    var split = text.split(":");
+    var split = text.split(':');
     int stopNum1 = int.parse(split[1]);
     int stopNum2 = int.parse(split[2]);
     if (noBreaksStart.length <= stopNum1) noBreaksStart.length = stopNum1 + 1;
-    noBreaksStart[stopNum1] ??= [];
+    (noBreaksStart[stopNum1] ??= []).add('test.dart:${annotation.lineNo}:');
     if (noBreaksEnd.length <= stopNum2) noBreaksEnd.length = stopNum2 + 1;
-    noBreaksEnd[stopNum2] ??= [];
-
-    noBreaksStart[stopNum1].add("test.dart:${annotation.lineNo}:");
-    noBreaksEnd[stopNum2].add("test.dart:${annotation.lineNo}:");
+    (noBreaksEnd[stopNum2] ??= []).add('test.dart:${annotation.lineNo}:');
   }
 
   _checkRecordedStops(
       recordStops, expectedStops, noBreaksStart, noBreaksEnd, debug);
 
   for (Annotation annotation in code.annotations
-      .where((annotation) => annotation.text.trim() == "nb")) {
+      .where((annotation) => annotation.text.trim() == 'nb')) {
     // Check that we didn't break where we're not allowed to.
     if (recordStopLines.contains(annotation.lineNo)) {
-      fail("Was not allowed to stop on line ${annotation.lineNo}, but did!"
-          "  Actual line stops: $recordStopLines${_debugHint(debug)}");
+      fail('Was not allowed to stop on line ${annotation.lineNo}, but did!'
+          '  Actual line stops: $recordStopLines${_debugHint(debug)}');
     }
   }
   for (Annotation annotation in code.annotations
-      .where((annotation) => annotation.text.trim() == "nbc")) {
+      .where((annotation) => annotation.text.trim() == 'nbc')) {
     // Check that we didn't break where we're not allowed to.
     if (recordStopLineColumns
-        .contains("${annotation.lineNo}:${annotation.columnNo}")) {
-      fail("Was not allowed to stop on line ${annotation.lineNo} "
-          "column ${annotation.columnNo}, but did!"
-          "  Actual line stops: $recordStopLineColumns${_debugHint(debug)}");
+        .contains('${annotation.lineNo}:${annotation.columnNo}')) {
+      fail('Was not allowed to stop on line ${annotation.lineNo} '
+          'column ${annotation.columnNo}, but did!'
+          '  Actual line stops: $recordStopLineColumns${_debugHint(debug)}');
     }
   }
 
-  if (code.annotations.any((a) => a.text.trim() == "fail")) {
+  if (code.annotations.any((a) => a.text.trim() == 'fail')) {
     fail("Test contains 'fail' annotation.");
   }
 }
@@ -153,8 +149,8 @@
 void _checkRecordedStops(
     List<String> recordStops,
     List<String> expectedStops,
-    List<List<String>> noBreaksStart,
-    List<List<String>> noBreaksEnd,
+    List<List<String>?> noBreaksStart,
+    List<List<String>?> noBreaksEnd,
     bool debug) {
   // We want to find all expected lines in recorded lines in order, but allow
   // more in between in the recorded lines.
@@ -162,23 +158,23 @@
   // to be between those points though.
 
   int expectedIndex = 0;
-  Set<String> aliveNoBreaks = new Set<String>();
-  if (noBreaksStart.length > 0 && noBreaksStart[0] != null) {
-    aliveNoBreaks.addAll(noBreaksStart[0]);
+  Set<String> aliveNoBreaks = {};
+  if (noBreaksStart.isNotEmpty && noBreaksStart[0] != null) {
+    aliveNoBreaks.addAll(noBreaksStart[0]!);
   }
   int stopNumber = 0;
   for (String recorded in recordStops) {
     stopNumber++;
     if (expectedIndex == expectedStops.length) break;
-    if ("$recorded:".contains(expectedStops[expectedIndex])) {
+    if ('$recorded:'.contains(expectedStops[expectedIndex])) {
       ++expectedIndex;
       if (noBreaksStart.length > expectedIndex &&
           noBreaksStart[expectedIndex] != null) {
-        aliveNoBreaks.addAll(noBreaksStart[expectedIndex]);
+        aliveNoBreaks.addAll(noBreaksStart[expectedIndex]!);
       }
       if (noBreaksEnd.length > expectedIndex &&
           noBreaksEnd[expectedIndex] != null) {
-        aliveNoBreaks.removeAll(noBreaksEnd[expectedIndex]);
+        aliveNoBreaks.removeAll(noBreaksEnd[expectedIndex]!);
       }
     } else {
       if (debug) {
@@ -191,27 +187,27 @@
         // Both failures are difficult to debug without seeing the stops that
         // didn't match. No breaks failures are misleading (the problem isn't
         // an incorrect break, but we missed a stop, so the aliveNoBreaks is
-        // wrong), and the normal failure list dumps the enitre stop list,
+        // wrong), and the normal failure list dumps the entire stop list,
         // making it difficult to see where the mismatch was.
         //
         // Also we add 1 to expectedIndex, because the stop annotations are
         // 1-based in the source files (e.g. `/*s:1*/` is expectedIndex 0)
         print("Skipping stop `$recorded` that didn't match expected stop "
-            "${expectedIndex + 1} `${expectedStops[expectedIndex]}`");
+            '${expectedIndex + 1} `${expectedStops[expectedIndex]}`');
       }
       if (aliveNoBreaks
           .contains("${(recorded.split(":")..removeLast()).join(":")}:")) {
         fail("Break '$recorded' was found when it wasn't allowed "
-            "(js step $stopNumber, after stop ${expectedIndex + 1}). "
-            "This can happen when an expected stop was not matched"
-            "${_debugHint(debug)}.");
+            '(js step $stopNumber, after stop ${expectedIndex + 1}). '
+            'This can happen when an expected stop was not matched'
+            '${_debugHint(debug)}.');
       }
     }
   }
   if (expectedIndex != expectedStops.length) {
     // Didn't find everything.
-    fail("Expected to find $expectedStops but found $recordStops"
-        "${_debugHint(debug)}");
+    fail('Expected to find $expectedStops but found $recordStops'
+        '${_debugHint(debug)}');
   }
 }
 
@@ -223,15 +219,14 @@
 }
 
 void _debugPrint(List<_DartStackTraceDataEntry> trace, String outputPath) {
-  StringBuffer sb = new StringBuffer();
+  StringBuffer sb = StringBuffer();
   var jsFile =
-      new File(path.join(outputPath, "js.js")).readAsStringSync().split("\n");
-  var dartFile = new File(path.join(outputPath, "test.dart"))
-      .readAsStringSync()
-      .split("\n");
+      File(path.join(outputPath, 'js.js')).readAsStringSync().split('\n');
+  var dartFile =
+      File(path.join(outputPath, 'test.dart')).readAsStringSync().split('\n');
 
   List<String> getSnippet(List<String> data, int line, int column) {
-    List<String> result = new List<String>.filled(5, "");
+    List<String> result = List<String>.filled(5, '');
     if (line < 0 || column < 0) return result;
 
     for (int i = 0; i < 5; ++i) {
@@ -240,48 +235,48 @@
       result[i] = data[j];
     }
     if (result[2].length >= column) {
-      result[2] = result[2].substring(0, column) +
-          "/*STOP*/" +
-          result[2].substring(column);
+      var before = result[2].substring(0, column);
+      var after = result[2].substring(column);
+      result[2] = '$before/*STOP*/$after';
     }
     return result;
   }
 
   List<String> sideBySide(List<String> a, List<String> b, int columns) {
-    List<String> result = new List<String>.filled(a.length, null);
+    List<String> result = List<String>.filled(a.length, '');
     for (int i = 0; i < a.length; ++i) {
       String left = a[i].padRight(columns).substring(0, columns);
       String right = b[i].padRight(columns).substring(0, columns);
-      result[i] = left + "  |  " + right;
+      result[i] = '$left  |  $right';
     }
     return result;
   }
 
   for (int i = 0; i < trace.length; ++i) {
-    sb.write("\n\nStop #${i + 1}\n\n");
+    sb.write('\n\nStop #${i + 1}\n\n');
     if (trace[i].isError && trace[i].jsLine < 0) {
-      sb.write("${trace[i].errorString}\n");
+      sb.write('${trace[i].errorString}\n');
       continue;
     }
     var jsSnippet = getSnippet(jsFile, trace[i].jsLine, trace[i].jsColumn);
     var dartSnippet =
         getSnippet(dartFile, trace[i].line - 1, trace[i].column - 1);
     var view = sideBySide(jsSnippet, dartSnippet, 50);
-    sb.writeAll(view, "\n");
+    sb.writeAll(view, '\n');
   }
 
   print(sb.toString());
 }
 
 List<List<_DartStackTraceDataEntry>> _extractStackTraces(
-    lines, SingleMapping sourceMap, String outputFilename) {
+    List<String> lines, SingleMapping sourceMap, String outputFilename) {
   List<List<_DartStackTraceDataEntry>> result = [];
   bool inStackTrace = false;
   List<String> currentStackTrace = <String>[];
   for (var line in lines) {
-    if (line.trim() == "--- Debugger stacktrace start ---") {
+    if (line.trim() == '--- Debugger stacktrace start ---') {
       inStackTrace = true;
-    } else if (line.trim() == "--- Debugger stacktrace end ---") {
+    } else if (line.trim() == '--- Debugger stacktrace end ---') {
       result.add(
           _extractStackTrace(currentStackTrace, sourceMap, outputFilename));
       currentStackTrace.clear();
@@ -297,36 +292,35 @@
     List<String> js, SingleMapping sourceMap, String wantedFile) {
   List<_DartStackTraceDataEntry> result = [];
   for (String line in js) {
-    if (!line.contains("$wantedFile:")) {
-      result.add(
-          new _DartStackTraceDataEntry.error("Not correct file @ '$line'"));
+    if (!line.contains('$wantedFile:')) {
+      result.add(_DartStackTraceDataEntry.error("Not correct file @ '$line'"));
       continue;
     }
-    Iterable<Match> ms = new RegExp(r"(\d+):(\d+)").allMatches(line);
+    Iterable<Match> ms = RegExp(r'(\d+):(\d+)').allMatches(line);
     if (ms.isEmpty) {
-      result.add(new _DartStackTraceDataEntry.error(
+      result.add(_DartStackTraceDataEntry.error(
           "Line and column not found for '$line'"));
       continue;
     }
     Match m = ms.first;
-    int l = int.parse(m.group(1));
-    int c = int.parse(m.group(2));
-    SourceMapSpan span = _getColumnOrPredecessor(sourceMap, l, c);
+    int l = int.parse(m.group(1)!);
+    int c = int.parse(m.group(2)!);
+    SourceMapSpan? span = _getColumnOrPredecessor(sourceMap, l, c);
     if (span?.start == null) {
-      result.add(new _DartStackTraceDataEntry.errorWithJsPosition(
+      result.add(_DartStackTraceDataEntry.errorWithJsPosition(
           "Source map not found for '$line'", l, c));
       continue;
     }
-    var file = span.sourceUrl?.pathSegments?.last ?? "(unknown file)";
-    result.add(new _DartStackTraceDataEntry(
+    var file = span!.sourceUrl?.pathSegments.last ?? '(unknown file)';
+    result.add(_DartStackTraceDataEntry(
         file, span.start.line + 1, span.start.column + 1, l, c));
   }
   return result;
 }
 
-SourceMapSpan _getColumnOrPredecessor(
+SourceMapSpan? _getColumnOrPredecessor(
     SingleMapping sourceMap, int line, int column) {
-  SourceMapSpan span = sourceMap.spanFor(line, column);
+  SourceMapSpan? span = sourceMap.spanFor(line, column);
   if (span == null && line > 0) {
     span = sourceMap.spanFor(line - 1, 999999);
   }
@@ -334,10 +328,10 @@
 }
 
 class _DartStackTraceDataEntry {
-  final String file;
+  final String? file;
   final int line;
   final int column;
-  final errorString;
+  final String? errorString;
   final int jsLine;
   final int jsColumn;
 
@@ -356,9 +350,10 @@
         line = -1,
         column = -1;
 
-  get isError => errorString != null;
+  bool get isError => errorString != null;
 
-  String toString() => isError ? errorString : "$file:$line:$column";
+  @override
+  String toString() => isError ? errorString! : '$file:$line:$column';
 }
 
 class _PointMapping {
@@ -370,25 +365,25 @@
   _PointMapping(this.fromLine, this.fromColumn, this.toLine, this.toColumn);
 }
 
-/**
- * Input and output is expected to be 0-based.
- *
- * The "magic 4" below is taken from https://github.com/ChromeDevTools/devtools-
- * frontend/blob/fa18d70a995f06cb73365b2e5b8ae974cf60bd3a/front_end/sources/
- * JavaScriptSourceFrame.js#L1520-L1523
- */
-String _getJsBreakpointLine(
+/// Input and output is expected to be 0-based.
+///
+/// The "magic 4" below is taken from
+/// https://github.com/ChromeDevTools/devtools-frontend/blob/fa18d70a995f06cb73365b2e5b8ae974cf60bd3a/front_end/sources/JavaScriptSourceFrame.js#L1520-L1523
+String? _getJsBreakpointLine(
     String testFileName, SingleMapping sourceMap, int breakOnLine) {
   List<_PointMapping> mappingsOnLines = [];
   for (var line in sourceMap.lines) {
     for (var entry in line.entries) {
-      if (entry.sourceLine == null) continue;
-      if (entry.sourceLine >= breakOnLine &&
-          entry.sourceLine < breakOnLine + 4 &&
-          entry.sourceUrlId != null &&
-          sourceMap.urls[entry.sourceUrlId] == testFileName) {
-        mappingsOnLines.add(new _PointMapping(
-            entry.sourceLine, entry.sourceColumn, line.line, entry.column));
+      final sourceLine = entry.sourceLine;
+      if (sourceLine == null) continue;
+      final sourceColumn = entry.sourceColumn!;
+      final sourceUrlId = entry.sourceUrlId;
+      if (sourceLine >= breakOnLine &&
+          sourceLine < breakOnLine + 4 &&
+          sourceUrlId != null &&
+          sourceMap.urls[sourceUrlId] == testFileName) {
+        mappingsOnLines.add(
+            _PointMapping(sourceLine, sourceColumn, line.line, entry.column));
       }
     }
   }
@@ -405,65 +400,66 @@
   mappingsOnLines.retainWhere((p) => p.toLine >= first.toLine);
 
   _PointMapping last = mappingsOnLines.last;
-  return "${first.toLine}:${first.toColumn}:${last.toLine}:${first.toColumn}";
+  return '${first.toLine}:${first.toColumn}:${last.toLine}:${first.toColumn}';
 }
 
-/**
- * Input and output is expected to be 0-based.
- */
-String _getJsBreakpointLineAndColumn(String testFileName,
+/// Input and output is expected to be 0-based.
+String? _getJsBreakpointLineAndColumn(String testFileName,
     SingleMapping sourceMap, int breakOnLine, int breakOnColumn) {
   for (var line in sourceMap.lines) {
     for (var entry in line.entries) {
       if (entry.sourceLine == breakOnLine &&
           entry.sourceColumn == breakOnColumn &&
           entry.sourceUrlId != null &&
-          sourceMap.urls[entry.sourceUrlId] == testFileName)
-        return "${line.line}:${entry.column}";
+          sourceMap.urls[entry.sourceUrlId!] == testFileName) {
+        return '${line.line}:${entry.column}';
+      }
     }
   }
   return null;
 }
 
 ProcessResult _runD8(String outInspectorPath, List<String> scriptD8Command,
-    String debugAction, List<String> breakpoints) {
+    String debugAction, List<String?> breakpoints) {
   var outInspectorPathRelative = path.relative(outInspectorPath);
-  ProcessResult runResult = Process.runSync(
-      d8Executable,
-      ['--enable-inspector', outInspectorPathRelative]
-        ..addAll(scriptD8Command)
-        ..addAll(["--", debugAction])
-        ..addAll(breakpoints.where((s) => s != null)));
+  ProcessResult runResult = Process.runSync(d8Executable, [
+    '--enable-inspector',
+    outInspectorPathRelative,
+    ...scriptD8Command,
+    '--',
+    debugAction,
+    ...breakpoints.whereNotNull()
+  ]);
   if (runResult.exitCode != 0) {
     print(runResult.stderr);
     print(runResult.stdout);
-    throw "Exit code: ${runResult.exitCode} from d8";
+    throw 'Exit code: ${runResult.exitCode} from d8';
   }
   return runResult;
 }
 
-File _cachedD8File;
-Directory _cachedSdkRoot;
+File? _cachedD8File;
+Directory? _cachedSdkRoot;
 File getD8File() {
   File attemptFileFromDir(Directory dir) {
     if (Platform.isWindows) {
-      return new File(dir.path + Platform.pathSeparator + "d8/windows/d8.exe");
+      return File('${dir.path}${Platform.pathSeparator}d8/windows/d8.exe');
     } else if (Platform.isLinux) {
-      return new File(dir.path + Platform.pathSeparator + "d8/linux/d8");
+      return File('${dir.path}${Platform.pathSeparator}d8/linux/d8');
     } else if (Platform.isMacOS) {
-      return new File(dir.path + Platform.pathSeparator + "d8/macos/d8");
+      return File('${dir.path}${Platform.pathSeparator}d8/macos/d8');
     }
-    throw new UnsupportedError('Unsupported platform.');
+    throw UnsupportedError('Unsupported platform.');
   }
 
   File search() {
-    Directory dir = new File.fromUri(Platform.script).parent;
+    Directory dir = File.fromUri(Platform.script).parent;
     while (dir.path.length > 1) {
       for (var entry in dir.listSync()) {
         if (entry is! Directory) continue;
-        if (entry.path.endsWith("third_party")) {
+        if (entry.path.endsWith('third_party')) {
           List<String> segments = entry.uri.pathSegments;
-          if (segments[segments.length - 2] == "third_party") {
+          if (segments[segments.length - 2] == 'third_party') {
             File possibleD8 = attemptFileFromDir(entry);
             if (possibleD8.existsSync()) {
               _cachedSdkRoot = dir;
@@ -475,13 +471,13 @@
       dir = dir.parent;
     }
 
-    throw "Cannot find D8 directory.";
+    throw 'Cannot find D8 directory.';
   }
 
   return _cachedD8File ??= search();
 }
 
-Directory get sdkRoot {
+Directory? get sdkRoot {
   getD8File();
   return _cachedSdkRoot;
 }
diff --git a/pkg/sourcemap_testing/pubspec.yaml b/pkg/sourcemap_testing/pubspec.yaml
index 95dada8..d739276 100644
--- a/pkg/sourcemap_testing/pubspec.yaml
+++ b/pkg/sourcemap_testing/pubspec.yaml
@@ -4,12 +4,18 @@
 publish_to: none
 
 environment:
-  sdk: '>=2.1.0 <3.0.0'
+  sdk: '>=2.16.0 <3.0.0'
 
+# Use 'any' constraints here; we get our versions from the DEPS file.
 dependencies:
   _fe_analyzer_shared: any
-  dart2js_tools:  any
-  expect:  any
+  collection: any
+  dart2js_tools: any
+  expect: any
   path: any
   source_maps: any
   source_span: any
+
+# Use 'any' constraints here; we get our versions from the DEPS file.
+dev_dependencies:
+  lints: any
diff --git a/pkg/status_file/pubspec.yaml b/pkg/status_file/pubspec.yaml
index 27e76b2..70c564c 100644
--- a/pkg/status_file/pubspec.yaml
+++ b/pkg/status_file/pubspec.yaml
@@ -5,9 +5,11 @@
 environment:
   sdk: "^2.12.0"
 
+# Use 'any' constraints here; we get our versions from the DEPS file.
 dependencies:
-  path: any
   args: any
+  path: any
 
+# Use 'any' constraints here; we get our versions from the DEPS file.
 dev_dependencies:
   expect: any
diff --git a/pkg/telemetry/pubspec.yaml b/pkg/telemetry/pubspec.yaml
index 12acecc..d1b687c 100644
--- a/pkg/telemetry/pubspec.yaml
+++ b/pkg/telemetry/pubspec.yaml
@@ -6,6 +6,7 @@
 environment:
   sdk: '>=2.12.0 <3.0.0'
 
+# Use 'any' constraints here; we get our versions from the DEPS file.
 dependencies:
   http: any
   meta: any
@@ -13,5 +14,6 @@
   stack_trace: any
   usage: any
 
+# Use 'any' constraints here; we get our versions from the DEPS file.
 dev_dependencies:
   test: any
diff --git a/pkg/test_runner/pubspec.yaml b/pkg/test_runner/pubspec.yaml
index 017aba9..26f868f 100644
--- a/pkg/test_runner/pubspec.yaml
+++ b/pkg/test_runner/pubspec.yaml
@@ -5,8 +5,11 @@
 name: test_runner
 # This package is not intended for consumption on pub.dev. DO NOT publish.
 publish_to: none
+
 environment:
   sdk: "^2.9.0"
+
+# Use 'any' constraints here; we get our versions from the DEPS file.
 dependencies:
   args: any
   dart2js_tools: any
@@ -17,8 +20,8 @@
   status_file: any
   webdriver: any
 
+# Use 'any' constraints here; we get our versions from the DEPS file.
 dev_dependencies:
   analyzer: any
   expect: any
-  file: any
   glob: any
diff --git a/pkg/test_runner/tool/update_static_error_tests.dart b/pkg/test_runner/tool/update_static_error_tests.dart
index 23be296..7ebda75 100644
--- a/pkg/test_runner/tool/update_static_error_tests.dart
+++ b/pkg/test_runner/tool/update_static_error_tests.dart
@@ -7,11 +7,9 @@
 import 'dart:io';
 
 import 'package:args/args.dart';
-import 'package:file/file.dart' as pkg_file;
 import 'package:glob/glob.dart';
 import 'package:glob/list_local_fs.dart';
 import 'package:path/path.dart' as p;
-
 import 'package:test_runner/src/command_output.dart';
 import 'package:test_runner/src/feature.dart' show Feature;
 import 'package:test_runner/src/path.dart';
@@ -123,16 +121,17 @@
     // or relative to the current directory.
     var root = result.startsWith("tests") ? "." : "tests";
     var glob = Glob(result, recursive: true);
-    for (var entry in glob.listSync(root: root)) {
-      if (!entry.path.endsWith(".dart")) continue;
-
-      if (entry is pkg_file.File) {
-        await _processFile(entry,
-            dryRun: dryRun,
-            includeContext: includeContext,
-            remove: removeSources,
-            insert: insertSources);
-      }
+    for (var entry in glob
+        .listSync(root: root)
+        .whereType<File>()
+        .where((file) => file.path.endsWith('.dart'))) {
+      await _processFile(
+        entry,
+        dryRun: dryRun,
+        includeContext: includeContext,
+        remove: removeSources,
+        insert: insertSources,
+      );
     }
   }
 }
diff --git a/pkg/vm/pubspec.yaml b/pkg/vm/pubspec.yaml
index ca8bf35..009cfeba 100644
--- a/pkg/vm/pubspec.yaml
+++ b/pkg/vm/pubspec.yaml
@@ -6,6 +6,7 @@
 environment:
   sdk: '>=2.15.0 <3.0.0'
 
+# Use 'any' constraints here; we get our versions from the DEPS file.
 dependencies:
   args: any
   build_integration: any
@@ -15,6 +16,7 @@
   kernel: any
   package_config: any
 
+# Use 'any' constraints here; we get our versions from the DEPS file.
 dev_dependencies:
   expect: any
   json_rpc_2: any
diff --git a/pkg/vm_service/pubspec.yaml b/pkg/vm_service/pubspec.yaml
index 9eda722..7f9470e 100644
--- a/pkg/vm_service/pubspec.yaml
+++ b/pkg/vm_service/pubspec.yaml
@@ -11,6 +11,10 @@
 
 dependencies:
 
+# We use 'any' version constraints here as we get our package versions from
+# the dart-lang/sdk repo's DEPS file. Note that this is a special case; the
+# best practice for packages is to specify their compatible version ranges.
+# See also https://dart.dev/tools/pub/dependencies.
 dev_dependencies:
   async: any
   expect: any
@@ -19,5 +23,5 @@
   mockito: any
   path: any
   pub_semver: any
-  test: any
   test_package: any
+  test: any
diff --git a/pkg/vm_snapshot_analysis/pubspec.yaml b/pkg/vm_snapshot_analysis/pubspec.yaml
index 10816d4..b38740a 100644
--- a/pkg/vm_snapshot_analysis/pubspec.yaml
+++ b/pkg/vm_snapshot_analysis/pubspec.yaml
@@ -14,6 +14,10 @@
   collection: ^1.15.0
   path: ^1.8.0
 
+# We use 'any' version constraints here as we get our package versions from
+# the dart-lang/sdk repo's DEPS file. Note that this is a special case; the
+# best practice for packages is to specify their compatible version ranges.
+# See also https://dart.dev/tools/pub/dependencies.
 dev_dependencies:
   lints: any
-  test: ^1.16.8
+  test: any
diff --git a/pkg/wasm_builder/pubspec.yaml b/pkg/wasm_builder/pubspec.yaml
index af4d545..a4286a4 100644
--- a/pkg/wasm_builder/pubspec.yaml
+++ b/pkg/wasm_builder/pubspec.yaml
@@ -5,5 +5,3 @@
 
 environment:
   sdk: '>=2.12.0'
-
-dependencies:
diff --git a/runtime/vm/app_snapshot.cc b/runtime/vm/app_snapshot.cc
index 2b20b44..da71473 100644
--- a/runtime/vm/app_snapshot.cc
+++ b/runtime/vm/app_snapshot.cc
@@ -1873,12 +1873,12 @@
     // in the current loading unit).
     ObjectPoolPtr pool = code->untag()->object_pool_;
     if (s->kind() == Snapshot::kFullAOT) {
-      TracePool(s, pool, /*only_code=*/is_deferred);
+      TracePool(s, pool, /*only_call_targets=*/is_deferred);
     } else {
       if (s->InCurrentLoadingUnitOrRoot(pool)) {
         s->Push(pool);
       } else {
-        TracePool(s, pool, /*only_code=*/true);
+        TracePool(s, pool, /*only_call_targets=*/true);
       }
     }
 
@@ -1946,7 +1946,7 @@
 #endif
   }
 
-  void TracePool(Serializer* s, ObjectPoolPtr pool, bool only_code) {
+  void TracePool(Serializer* s, ObjectPoolPtr pool, bool only_call_targets) {
     if (pool == ObjectPool::null()) {
       return;
     }
@@ -1957,8 +1957,18 @@
       auto entry_type = ObjectPool::TypeBits::decode(entry_bits[i]);
       if (entry_type == ObjectPool::EntryType::kTaggedObject) {
         const ObjectPtr target = pool->untag()->data()[i].raw_obj_;
-        if (!only_code || target->IsCode()) {
+        // A field is a call target because its initializer may be called
+        // indirectly by passing the field to the runtime. A const closure
+        // is a call target because its function may be called indirectly
+        // via a closure call.
+        if (!only_call_targets || target->IsCode() || target->IsFunction() ||
+            target->IsField() || target->IsClosure()) {
           s->Push(target);
+        } else {
+          intptr_t cid = target->GetClassIdMayBeSmi();
+          if (cid >= kNumPredefinedCids) {
+            s->Push(s->isolate_group()->class_table()->At(cid));
+          }
         }
       }
     }
diff --git a/runtime/vm/compiler/aot/precompiler.cc b/runtime/vm/compiler/aot/precompiler.cc
index ee450a6..6c6a023 100644
--- a/runtime/vm/compiler/aot/precompiler.cc
+++ b/runtime/vm/compiler/aot/precompiler.cc
@@ -424,6 +424,7 @@
       typeparams_to_retain_(),
       consts_to_retain_(),
       seen_table_selectors_(),
+      api_uses_(),
       error_(Error::Handle()),
       get_runtime_type_is_unique_(false) {
   ASSERT(Precompiler::singleton_ == NULL);
@@ -662,6 +663,8 @@
       ProgramVisitor::Dedup(T);
     }
 
+    PruneDictionaries();
+
     if (retained_reasons_writer_ != nullptr) {
       reasons_writer.Write();
       retained_reasons_writer_ = nullptr;
@@ -752,6 +755,7 @@
     }
   }
   if (!main.IsNull()) {
+    AddApiUse(main);
     if (lib.LookupLocalFunction(name) == Function::null()) {
       retain_root_library_caches_ = true;
     }
@@ -1464,6 +1468,14 @@
   return seen_table_selectors_.HasKey(selector_id);
 }
 
+void Precompiler::AddApiUse(const Object& obj) {
+  api_uses_.Insert(&Object::ZoneHandle(Z, obj.ptr()));
+}
+
+bool Precompiler::HasApiUse(const Object& obj) {
+  return api_uses_.HasKey(&obj);
+}
+
 void Precompiler::AddInstantiatedClass(const Class& cls) {
   if (is_tracing()) {
     tracer_->WriteClassInstantiationRef(cls);
@@ -1523,6 +1535,7 @@
                                  &reusable_object_handle) ==
             EntryPointPragma::kAlways) {
           AddInstantiatedClass(cls);
+          AddApiUse(cls);
         }
       }
 
@@ -1541,6 +1554,7 @@
           if (pragma == EntryPointPragma::kNever) continue;
 
           AddField(field);
+          AddApiUse(field);
 
           if (!field.is_static()) {
             if (pragma != EntryPointPragma::kSetterOnly) {
@@ -1569,6 +1583,7 @@
               type == EntryPointPragma::kCallOnly) {
             functions_with_entry_point_pragmas_.Insert(function);
             AddFunction(function, RetainReasons::kEntryPointPragma);
+            AddApiUse(function);
           }
 
           if ((type == EntryPointPragma::kAlways ||
@@ -1578,10 +1593,16 @@
             function2 = function.ImplicitClosureFunction();
             functions_with_entry_point_pragmas_.Insert(function2);
             AddFunction(function2, RetainReasons::kEntryPointPragma);
+
+            // Not `function2`: Dart_GetField will lookup the regular function
+            // and get the implicit closure function from that.
+            AddApiUse(function);
           }
 
           if (function.IsGenerativeConstructor()) {
             AddInstantiatedClass(cls);
+            AddApiUse(function);
+            AddApiUse(cls);
           }
         }
         if (function.kind() == UntaggedFunction::kImplicitGetter &&
@@ -1591,6 +1612,7 @@
             if (function.accessor_field() == field.ptr()) {
               functions_with_entry_point_pragmas_.Insert(function);
               AddFunction(function, RetainReasons::kImplicitGetter);
+              AddApiUse(function);
             }
           }
         }
@@ -1601,6 +1623,7 @@
             if (function.accessor_field() == field.ptr()) {
               functions_with_entry_point_pragmas_.Insert(function);
               AddFunction(function, RetainReasons::kImplicitSetter);
+              AddApiUse(function);
             }
           }
         }
@@ -1611,9 +1634,15 @@
             if (function.accessor_field() == field.ptr()) {
               functions_with_entry_point_pragmas_.Insert(function);
               AddFunction(function, RetainReasons::kImplicitStaticGetter);
+              AddApiUse(function);
             }
           }
         }
+        if (function.is_native()) {
+          // The embedder will need to lookup this library to provide the native
+          // resolver, even if there are no embedder calls into the library.
+          AddApiUse(lib);
+        }
       }
 
       implicit_getters = GrowableObjectArray::null();
@@ -3069,6 +3098,166 @@
   }
 }
 
+void Precompiler::PruneDictionaries() {
+  // PRODUCT-only: pruning interferes with various uses of the service protocol,
+  // including heap analysis tools.
+#if defined(PRODUCT)
+  class PruneDictionariesVisitor {
+   public:
+    GrowableObjectArrayPtr PruneLibraries(
+        const GrowableObjectArray& libraries) {
+      for (intptr_t i = 0; i < libraries.Length(); i++) {
+        lib_ ^= libraries.At(i);
+        bool retain = PruneLibrary(lib_);
+        if (retain) {
+          lib_.set_index(retained_libraries_.Length());
+          retained_libraries_.Add(lib_);
+        } else {
+          lib_.set_index(-1);
+          lib_.set_private_key(null_string_);
+        }
+      }
+
+      Library::RegisterLibraries(Thread::Current(), retained_libraries_);
+      return retained_libraries_.ptr();
+    }
+
+    bool PruneLibrary(const Library& lib) {
+      dict_ = lib.dictionary();
+      intptr_t dict_size = dict_.Length() - 1;
+      intptr_t used = 0;
+      for (intptr_t i = 0; i < dict_size; i++) {
+        entry_ = dict_.At(i);
+        if (entry_.IsNull()) continue;
+
+        bool retain = false;
+        if (entry_.IsClass()) {
+          // dart:async: Fix async stack trace lookups in dart:async to annotate
+          // entry points or fail gracefully.
+          // dart:core, dart:collection, dart:typed_data: Isolate messaging
+          // between groups allows any class in these libraries.
+          retain = PruneClass(Class::Cast(entry_)) ||
+                   (lib.url() == Symbols::DartAsync().ptr()) ||
+                   (lib.url() == Symbols::DartCore().ptr()) ||
+                   (lib.url() == Symbols::DartCollection().ptr()) ||
+                   (lib.url() == Symbols::DartTypedData().ptr());
+        } else if (entry_.IsFunction() || entry_.IsField()) {
+          retain = precompiler_->HasApiUse(entry_);
+        } else {
+          FATAL("Unexpected library entry: %s", entry_.ToCString());
+        }
+        if (retain) {
+          used++;
+        } else {
+          dict_.SetAt(i, Object::null_object());
+        }
+      }
+      lib.RehashDictionary(dict_, used * 4 / 3 + 1);
+
+      bool retain = used > 0;
+      cls_ = lib.toplevel_class();
+      if (PruneClass(cls_)) {
+        retain = true;
+      }
+      if (lib.is_dart_scheme()) {
+        retain = true;
+      }
+      if (lib.ptr() == root_lib_.ptr()) {
+        retain = true;
+      }
+      if (precompiler_->HasApiUse(lib)) {
+        retain = true;
+      }
+      return retain;
+    }
+
+    bool PruneClass(const Class& cls) {
+      bool retain = precompiler_->HasApiUse(cls);
+
+      functions_ = cls.functions();
+      retained_functions_ = GrowableObjectArray::New();
+      for (intptr_t i = 0; i < functions_.Length(); i++) {
+        function_ ^= functions_.At(i);
+        if (precompiler_->HasApiUse(function_)) {
+          retained_functions_.Add(function_);
+          retain = true;
+        } else if (precompiler_->functions_called_dynamically_.ContainsKey(
+                       function_)) {
+          retained_functions_.Add(function_);
+          // No `retain = true`: the function must appear in the method
+          // dictionary for lookup, but the class may still be removed from the
+          // library.
+        }
+      }
+      if (retained_functions_.Length() > 0) {
+        functions_ = Array::MakeFixedLength(retained_functions_);
+        cls.SetFunctions(functions_);
+      } else {
+        cls.SetFunctions(Object::empty_array());
+      }
+
+      fields_ = cls.fields();
+      retained_fields_ = GrowableObjectArray::New();
+      for (intptr_t i = 0; i < fields_.Length(); i++) {
+        field_ ^= fields_.At(i);
+        if (precompiler_->HasApiUse(field_)) {
+          retained_fields_.Add(field_);
+          retain = true;
+        }
+      }
+      if (retained_fields_.Length() > 0) {
+        fields_ = Array::MakeFixedLength(retained_fields_);
+        cls.SetFields(fields_);
+      } else {
+        cls.SetFields(Object::empty_array());
+      }
+
+      return retain;
+    }
+
+    explicit PruneDictionariesVisitor(Precompiler* precompiler, Zone* zone)
+        : precompiler_(precompiler),
+          lib_(Library::Handle(zone)),
+          dict_(Array::Handle(zone)),
+          entry_(Object::Handle(zone)),
+          cls_(Class::Handle(zone)),
+          functions_(Array::Handle(zone)),
+          fields_(Array::Handle(zone)),
+          function_(Function::Handle(zone)),
+          field_(Field::Handle(zone)),
+          retained_functions_(GrowableObjectArray::Handle(zone)),
+          retained_fields_(GrowableObjectArray::Handle(zone)),
+          retained_libraries_(
+              GrowableObjectArray::Handle(zone, GrowableObjectArray::New())),
+          root_lib_(Library::Handle(
+              zone,
+              precompiler->isolate_group()->object_store()->root_library())),
+          null_string_(String::Handle(zone)) {}
+
+   private:
+    Precompiler* const precompiler_;
+    Library& lib_;
+    Array& dict_;
+    Object& entry_;
+    Class& cls_;
+    Array& functions_;
+    Array& fields_;
+    Function& function_;
+    Field& field_;
+    GrowableObjectArray& retained_functions_;
+    GrowableObjectArray& retained_fields_;
+    const GrowableObjectArray& retained_libraries_;
+    const Library& root_lib_;
+    const String& null_string_;
+  };
+
+  HANDLESCOPE(T);
+  SafepointWriteRwLocker ml(T, T->isolate_group()->program_lock());
+  PruneDictionariesVisitor visitor(this, Z);
+  libraries_ = visitor.PruneLibraries(libraries_);
+#endif  // defined(PRODUCT)
+}
+
 // Traits for the HashTable template.
 struct CodeKeyTraits {
   static uint32_t Hash(const Object& key) { return Code::Cast(key).Size(); }
diff --git a/runtime/vm/compiler/aot/precompiler.h b/runtime/vm/compiler/aot/precompiler.h
index 4e0d211..50df9e7 100644
--- a/runtime/vm/compiler/aot/precompiler.h
+++ b/runtime/vm/compiler/aot/precompiler.h
@@ -210,6 +210,37 @@
 
 typedef DirectChainedHashMap<TypeArgumentsKeyValueTrait> TypeArgumentsSet;
 
+class ProgramElementKeyValueTrait {
+ public:
+  // Typedefs needed for the DirectChainedHashMap template.
+  typedef const Object* Key;
+  typedef const Object* Value;
+  typedef const Object* Pair;
+
+  static Key KeyOf(Pair kv) { return kv; }
+
+  static Value ValueOf(Pair kv) { return kv; }
+
+  static inline uword Hash(Key key) {
+    if (key->IsFunction()) {
+      return Function::Cast(*key).Hash();
+    } else if (key->IsField()) {
+      return Field::Cast(*key).kernel_offset();
+    } else if (key->IsClass()) {
+      return Class::Cast(*key).kernel_offset();
+    } else if (key->IsLibrary()) {
+      return Library::Cast(*key).index();
+    }
+    FATAL("Unexpected type: %s\n", key->ToCString());
+  }
+
+  static inline bool IsKeyEqual(Pair pair, Key key) {
+    return pair->ptr() == key->ptr();
+  }
+};
+
+typedef DirectChainedHashMap<ProgramElementKeyValueTrait> ProgramElementSet;
+
 class InstanceKeyValueTrait {
  public:
   // Typedefs needed for the DirectChainedHashMap template.
@@ -321,6 +352,8 @@
   bool IsHitByTableSelector(const Function& function);
   // Returns the reason if the function must be retained, otherwise nullptr.
   const char* MustRetainFunction(const Function& function);
+  void AddApiUse(const Object& obj);
+  bool HasApiUse(const Object& obj);
 
   void ProcessFunction(const Function& function);
   void CheckForNewDynamicFunctions();
@@ -343,6 +376,7 @@
   void DropClasses();
   void DropLibraries();
   void DiscardCodeObjects();
+  void PruneDictionaries();
 
   DEBUG_ONLY(FunctionPtr FindUnvisitedRetainedFunction());
 
@@ -393,6 +427,7 @@
   TypeParameterSet typeparams_to_retain_;
   InstanceSet consts_to_retain_;
   TableSelectorSet seen_table_selectors_;
+  ProgramElementSet api_uses_;
   Error& error_;
 
   compiler::DispatchTableGenerator* dispatch_table_generator_;
diff --git a/runtime/vm/compiler/asm_intrinsifier_riscv.cc b/runtime/vm/compiler/asm_intrinsifier_riscv.cc
index 39b610c..f172608 100644
--- a/runtime/vm/compiler/asm_intrinsifier_riscv.cc
+++ b/runtime/vm/compiler/asm_intrinsifier_riscv.cc
@@ -151,8 +151,19 @@
 
 void AsmIntrinsifier::Smi_bitLength(Assembler* assembler,
                                     Label* normal_ir_body) {
-  // TODO(riscv)
-  __ Bind(normal_ir_body);
+  __ lx(A0, Address(SP, 0 * target::kWordSize));
+  __ SmiUntag(A0);
+
+  // XOR with sign bit to complement bits if value is negative.
+  __ srai(A1, A0, XLEN - 1);
+  __ xor_(A0, A0, A1);
+
+  __ CountLeadingZeroes(A0, A0);
+
+  __ li(TMP, XLEN);
+  __ sub(A0, TMP, A0);
+  __ SmiTag(A0);
+  __ ret();
 }
 
 void AsmIntrinsifier::Bigint_lsh(Assembler* assembler, Label* normal_ir_body) {
@@ -234,11 +245,12 @@
   __ andi(T5, T2, target::kBitsPerWord - 1);  // T5 = bit shift
   __ li(T6, target::kBitsPerWord);
   __ sub(T6, T6, T5);  // T6 = carry bit shift
+  __ sub(T1, T1, T4);  // T1 = words to process
 
   __ slli(TMP, T4, target::kWordSizeLog2);
   __ add(T0, T0, TMP);  // T0 = &src_digits[word_shift]
 
-  __ li(T2, 0);  // carry
+  // T2 = carry
   __ lx(T2, FieldAddress(T0, target::TypedData::payload_offset()));
   __ srl(T2, T2, T5);
   __ addi(T0, T0, target::kWordSize);
diff --git a/runtime/vm/compiler/assembler/assembler_arm64.cc b/runtime/vm/compiler/assembler/assembler_arm64.cc
index 9a3c611..e282fcb 100644
--- a/runtime/vm/compiler/assembler/assembler_arm64.cc
+++ b/runtime/vm/compiler/assembler/assembler_arm64.cc
@@ -574,18 +574,13 @@
 
 void Assembler::CompareObject(Register reg, const Object& object) {
   ASSERT(IsOriginalObject(object));
-  word offset = 0;
   if (IsSameObject(compiler::NullObject(), object)) {
     CompareObjectRegisters(reg, NULL_REG);
-  } else if (target::CanLoadFromThread(object, &offset)) {
-    ldr(TMP, Address(THR, offset));
-    CompareObjectRegisters(reg, TMP);
-  } else if (CanLoadFromObjectPool(object)) {
+  } else if (target::IsSmi(object)) {
+    CompareImmediate(reg, target::ToRawSmi(object), kObjectBytes);
+  } else {
     LoadObject(TMP, object);
     CompareObjectRegisters(reg, TMP);
-  } else {
-    ASSERT(target::IsSmi(object));
-    CompareImmediate(reg, target::ToRawSmi(object), kObjectBytes);
   }
 }
 
@@ -678,7 +673,9 @@
   if (fmovdi(vd, immd)) return;
 
   int64_t imm64 = bit_cast<int64_t, double>(immd);
-  if (constant_pool_allowed()) {
+  if (imm64 == 0) {
+    veor(vd, vd, vd);
+  } else if (constant_pool_allowed()) {
     intptr_t index = object_pool_builder().FindImmediate64(imm64);
     intptr_t offset = target::ObjectPool::element_offset(index);
     LoadDFromOffset(vd, PP, offset);
@@ -1309,6 +1306,8 @@
   // No store buffer update.
   if (IsSameObject(compiler::NullObject(), value)) {
     str(NULL_REG, dest);
+  } else if (target::IsSmi(value) && (target::ToRawSmi(value) == 0)) {
+    str(ZR, dest);
   } else {
     LoadObject(TMP2, value);
     str(TMP2, dest);
@@ -1326,6 +1325,8 @@
   // No store buffer update.
   if (IsSameObject(compiler::NullObject(), value)) {
     str(NULL_REG, dest, kObjectBytes);
+  } else if (target::IsSmi(value) && (target::ToRawSmi(value) == 0)) {
+    str(ZR, dest, kObjectBytes);
   } else {
     LoadObject(TMP2, value);
     str(TMP2, dest, kObjectBytes);
@@ -1340,6 +1341,8 @@
     Register value_reg = TMP2;
     if (IsSameObject(compiler::NullObject(), value)) {
       value_reg = NULL_REG;
+    } else if (target::IsSmi(value) && (target::ToRawSmi(value) == 0)) {
+      value_reg = ZR;
     } else {
       LoadObject(value_reg, value);
     }
@@ -1361,6 +1364,8 @@
   if (memory_order == kRelease) {
     if (IsSameObject(compiler::NullObject(), value)) {
       value_reg = NULL_REG;
+    } else if (target::IsSmi(value) && (target::ToRawSmi(value) == 0)) {
+      value_reg = ZR;
     } else {
       LoadObject(value_reg, value);
     }
diff --git a/runtime/vm/compiler/assembler/assembler_arm64_test.cc b/runtime/vm/compiler/assembler/assembler_arm64_test.cc
index 9daefc3..7e36b4b 100644
--- a/runtime/vm/compiler/assembler/assembler_arm64_test.cc
+++ b/runtime/vm/compiler/assembler/assembler_arm64_test.cc
@@ -969,10 +969,8 @@
       "fmovd v1, 3.000000\n"
       "fmovd v2, 4.000000\n"
       "fstpd v1, v2, [sp, #-16]!\n"
-      "movz tmp, #0x0\n"
-      "fmovdr v1, tmp\n"
-      "movz tmp, #0x0\n"
-      "fmovdr v2, tmp\n"
+      "veor v1, v1, v1\n"
+      "veor v2, v2, v2\n"
       "fldpd v1, v2, [sp], #16 !\n"
       "fsubd v0, v2, v1\n"
       "mov csp, sp\n"
@@ -1001,10 +999,8 @@
       "fmovd v1, 3.000000\n"
       "fmovd v2, 4.000000\n"
       "fstpq v1, v2, [sp, #-32]!\n"
-      "movz tmp, #0x0\n"
-      "fmovdr v1, tmp\n"
-      "movz tmp, #0x0\n"
-      "fmovdr v2, tmp\n"
+      "veor v1, v1, v1\n"
+      "veor v2, v2, v2\n"
       "fldpq v1, v2, [sp], #32 !\n"
       "fsubd v0, v2, v1\n"
       "mov csp, sp\n"
@@ -2598,9 +2594,8 @@
       "movk tmp, #0x406d lsl 48\n"
       "fmovdr v2, tmp\n"
       "fcmpd v1, v2\n"
-      "beq +12\n"
-      "movz tmp, #0x0\n"
-      "fmovdr v0, tmp\n"
+      "beq +8\n"
+      "veor v0, v0, v0\n"
       "ret\n");
 }
 
@@ -2696,8 +2691,7 @@
   typedef double (*DoubleReturn)() DART_UNUSED;
   EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry()));
   EXPECT_DISASSEMBLY(
-      "movz tmp, #0x0\n"
-      "fmovdr v0, tmp\n"
+      "veor v0, v0, v0\n"
       "movz tmp, #0x2000 lsl 32\n"
       "movk tmp, #0x406d lsl 48\n"
       "fmovdr v1, tmp\n"
@@ -2748,8 +2742,7 @@
   typedef double (*DoubleReturn)() DART_UNUSED;
   EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry()));
   EXPECT_DISASSEMBLY(
-      "movz tmp, #0x0\n"
-      "fmovdr v0, tmp\n"
+      "veor v0, v0, v0\n"
       "movz tmp, #0x6000 lsl 32\n"
       "movk tmp, #0x406d lsl 48\n"
       "fmovdr v1, tmp\n"
@@ -2789,9 +2782,8 @@
       "movk tmp, #0x406d lsl 48\n"
       "fmovdr v1, tmp\n"
       "fcmpd v1, #0.0\n"
-      "bgt +16\n"
-      "movz tmp, #0x0\n"
-      "fmovdr v0, tmp\n"
+      "bgt +12\n"
+      "veor v0, v0, v0\n"
       "ret\n"
       "movz tmp, #0x4045 lsl 48\n"
       "fmovdr v0, tmp\n"
@@ -5608,8 +5600,7 @@
   typedef double (*DoubleReturn)() DART_UNUSED;
   EXPECT_EQ(12.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry()));
   EXPECT_DISASSEMBLY(
-      "movz tmp, #0x0\n"
-      "fmovdr v0, tmp\n"
+      "veor v0, v0, v0\n"
       "fmovd v1, 1.000000\n"
       "fmovd v2, 2.000000\n"
       "fmovd v3, 3.000000\n"
@@ -5675,14 +5666,11 @@
   typedef double (*DoubleReturn)() DART_UNUSED;
   EXPECT_EQ(-6.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry()));
   EXPECT_DISASSEMBLY(
-      ""
-      "movz tmp, #0x0\n"
-      "fmovdr v0, tmp\n"
+      "veor v0, v0, v0\n"
       "fmovd v1, 1.000000\n"
       "fmovd v2, 2.000000\n"
       "fmovd v3, 3.000000\n"
-      "movz tmp, #0x0\n"
-      "fmovdr v5, tmp\n"
+      "veor v5, v5, v5\n"
       "fcvtsd v0, v0\n"
       "fcvtsd v1, v1\n"
       "fcvtsd v2, v2\n"
@@ -5744,9 +5732,7 @@
   typedef double (*DoubleReturn)() DART_UNUSED;
   EXPECT_EQ(14.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry()));
   EXPECT_DISASSEMBLY(
-      ""
-      "movz tmp, #0x0\n"
-      "fmovdr v0, tmp\n"
+      "veor v0, v0, v0\n"
       "fmovd v1, 1.000000\n"
       "fmovd v2, 2.000000\n"
       "fmovd v3, 3.000000\n"
@@ -5811,9 +5797,7 @@
   typedef double (*DoubleReturn)() DART_UNUSED;
   EXPECT_EQ(4.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry()));
   EXPECT_DISASSEMBLY(
-      ""
-      "movz tmp, #0x0\n"
-      "fmovdr v0, tmp\n"
+      "veor v0, v0, v0\n"
       "fmovd v1, 1.000000\n"
       "fmovd v2, 2.000000\n"
       "fmovd v3, 3.000000\n"
@@ -5895,8 +5879,7 @@
   EXPECT_DISASSEMBLY(
       "fmovd v0, 2.000000\n"
       "fmovd v1, 3.000000\n"
-      "movz tmp, #0x0\n"
-      "fmovdr v5, tmp\n"
+      "veor v5, v5, v5\n"
       "vinsd v4[0], v0[0]\n"
       "vinsd v4[1], v1[0]\n"
       "vsubd v5, v5, v4\n"
@@ -6151,8 +6134,7 @@
       "fcvtsd v0, v0\n"
       "vinss v1[3], v0[0]\n"
       "vinss v1[1], v0[0]\n"
-      "movz tmp, #0x0\n"
-      "fmovdr v0, tmp\n"
+      "veor v0, v0, v0\n"
       "fcvtsd v0, v0\n"
       "vinss v1[2], v0[0]\n"
       "vinss v1[0], v0[0]\n"
diff --git a/runtime/vm/compiler/assembler/assembler_riscv.cc b/runtime/vm/compiler/assembler/assembler_riscv.cc
index 094182f..863adf4 100644
--- a/runtime/vm/compiler/assembler/assembler_riscv.cc
+++ b/runtime/vm/compiler/assembler/assembler_riscv.cc
@@ -3205,7 +3205,7 @@
   // No store buffer update.
   if (IsSameObject(compiler::NullObject(), value)) {
     sx(NULL_REG, dest);
-  } else if (target::IsSmi(object) && (target::ToRawSmi(object) == 0)) {
+  } else if (target::IsSmi(value) && (target::ToRawSmi(value) == 0)) {
     sx(ZR, dest);
   } else {
     LoadObject(TMP2, value);
@@ -3226,7 +3226,7 @@
     Register value_reg = TMP2;
     if (IsSameObject(compiler::NullObject(), value)) {
       value_reg = NULL_REG;
-    } else if (target::IsSmi(object) && (target::ToRawSmi(object) == 0)) {
+    } else if (target::IsSmi(value) && (target::ToRawSmi(value) == 0)) {
       value_reg = ZR;
     } else {
       LoadObject(value_reg, value);
@@ -3392,7 +3392,7 @@
   if (IsSameObject(compiler::NullObject(), object)) {
     CompareObjectRegisters(reg, NULL_REG);
   } else if (target::IsSmi(object)) {
-    CompareImmediate(reg, target::ToRawSmi(object));
+    CompareImmediate(reg, target::ToRawSmi(object), kObjectBytes);
   } else {
     LoadObject(TMP, object);
     CompareObjectRegisters(reg, TMP);
@@ -4470,6 +4470,56 @@
   bne(TMP, TMP2, overflow);
 }
 
+void Assembler::CountLeadingZeroes(Register rd, Register rs) {
+  // Note: clz will appear in the Zbb extension.
+  // if (Supports(RV_Zbb)) {
+  //   clz(rd, rs);
+  // }
+
+  //  n = XLEN
+  //  y = x >>32; if (y != 0) { n = n - 32; x = y; }
+  //  y = x >>16; if (y != 0) { n = n - 16; x = y; }
+  //  y = x >> 8; if (y != 0) { n = n - 8; x = y; }
+  //  y = x >> 4; if (y != 0) { n = n - 4; x = y; }
+  //  y = x >> 2; if (y != 0) { n = n - 2; x = y; }
+  //  y = x >> 1; if (y != 0) { return n - 2; }
+  //  return n - x;
+  Label l0, l1, l2, l3, l4, l5;
+  li(TMP2, XLEN);
+#if XLEN == 64
+  srli(TMP, rs, 32);
+  beqz(TMP, &l0, Assembler::kNearJump);
+  subi(TMP2, TMP2, 32);
+  mv(rs, TMP);
+  Bind(&l0);
+#endif
+  srli(TMP, rs, 16);
+  beqz(TMP, &l1, Assembler::kNearJump);
+  subi(TMP2, TMP2, 16);
+  mv(rs, TMP);
+  Bind(&l1);
+  srli(TMP, rs, 8);
+  beqz(TMP, &l2, Assembler::kNearJump);
+  subi(TMP2, TMP2, 8);
+  mv(rs, TMP);
+  Bind(&l2);
+  srli(TMP, rs, 4);
+  beqz(TMP, &l3, Assembler::kNearJump);
+  subi(TMP2, TMP2, 4);
+  mv(rs, TMP);
+  Bind(&l3);
+  srli(TMP, rs, 2);
+  beqz(TMP, &l4, Assembler::kNearJump);
+  subi(TMP2, TMP2, 2);
+  mv(rs, TMP);
+  Bind(&l4);
+  srli(TMP, rs, 1);
+  sub(rd, TMP2, rs);
+  beqz(TMP, &l5, Assembler::kNearJump);
+  subi(rd, TMP2, 2);
+  Bind(&l5);
+}
+
 }  // namespace compiler
 
 }  // namespace dart
diff --git a/runtime/vm/compiler/assembler/assembler_riscv.h b/runtime/vm/compiler/assembler/assembler_riscv.h
index dfb57fe..ac1e920 100644
--- a/runtime/vm/compiler/assembler/assembler_riscv.h
+++ b/runtime/vm/compiler/assembler/assembler_riscv.h
@@ -1412,6 +1412,9 @@
                               Register rs2,
                               Label* overflow);
 
+  // Clobbers [rs].
+  void CountLeadingZeroes(Register rd, Register rs);
+
  private:
   bool constant_pool_allowed_;
 
diff --git a/runtime/vm/compiler/assembler/disassembler_arm64.cc b/runtime/vm/compiler/assembler/disassembler_arm64.cc
index c16ca8e..d3d7b2c 100644
--- a/runtime/vm/compiler/assembler/disassembler_arm64.cc
+++ b/runtime/vm/compiler/assembler/disassembler_arm64.cc
@@ -1085,7 +1085,7 @@
 void ARM64Decoder::DecodeAddSubShiftExt(Instr* instr) {
   switch (instr->Bit(30)) {
     case 0: {
-      if ((instr->RdField() == R31) && (instr->SFField())) {
+      if (instr->RdField() == R31) {
         Format(instr, "cmn'sf 'rn, 'shift_op");
       } else {
         Format(instr, "add'sf's 'rd, 'rn, 'shift_op");
@@ -1093,7 +1093,7 @@
       break;
     }
     case 1: {
-      if ((instr->RdField() == R31) && (instr->SFField())) {
+      if (instr->RdField() == R31) {
         Format(instr, "cmp'sf 'rn, 'shift_op");
       } else {
         if (instr->RnField() == R31) {
@@ -1158,7 +1158,11 @@
       Format(instr, "eon'sf 'rd, 'rn, 'shift_op");
       break;
     case 6:
-      Format(instr, "and'sfs 'rd, 'rn, 'shift_op");
+      if (instr->RdField() == R31) {
+        Format(instr, "tst'sf 'rn, 'shift_op");
+      } else {
+        Format(instr, "and'sfs 'rd, 'rn, 'shift_op");
+      }
       break;
     case 7:
       Format(instr, "bic'sfs 'rd, 'rn, 'shift_op");
diff --git a/runtime/vm/compiler/backend/il.cc b/runtime/vm/compiler/backend/il.cc
index 44c61f9..98a44f1 100644
--- a/runtime/vm/compiler/backend/il.cc
+++ b/runtime/vm/compiler/backend/il.cc
@@ -6822,12 +6822,6 @@
 void EnterHandleScopeInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   ASSERT(kEnterHandleScopeRuntimeEntry.is_leaf());
 
-  if (kind_ == Kind::kGetTopHandleScope) {
-    __ LoadMemoryValue(CallingConventions::kReturnReg, THR,
-                       compiler::target::Thread::api_top_scope_offset());
-    return;
-  }
-
   Location arg_loc = FirstArgumentLocation();
   __ EnterCFrame(arg_loc.IsRegister() ? 0 : compiler::target::kWordSize);
   NoTemporaryAllocator no_temp;
diff --git a/runtime/vm/compiler/backend/il.h b/runtime/vm/compiler/backend/il.h
index 08971e8..c4192ba 100644
--- a/runtime/vm/compiler/backend/il.h
+++ b/runtime/vm/compiler/backend/il.h
@@ -3674,6 +3674,23 @@
 
   bool IsSmi() const { return compiler::target::IsSmi(value()); }
 
+  bool HasZeroRepresentation() const {
+    switch (representation()) {
+      case kTagged:
+      case kUnboxedUint8:
+      case kUnboxedUint16:
+      case kUnboxedUint32:
+      case kUnboxedInt32:
+      case kUnboxedInt64:
+        return IsSmi() && compiler::target::SmiValue(value()) == 0;
+      case kUnboxedDouble:
+        return compiler::target::IsDouble(value()) &&
+               bit_cast<uint64_t>(compiler::target::DoubleValue(value())) == 0;
+      default:
+        return false;
+    }
+  }
+
   virtual bool ComputeCanDeoptimize() const { return false; }
 
   virtual void InferRange(RangeAnalysis* analysis, Range* range);
@@ -5334,9 +5351,7 @@
 
 class EnterHandleScopeInstr : public TemplateDefinition<0, NoThrow> {
  public:
-  enum class Kind { kEnterHandleScope = 0, kGetTopHandleScope = 1 };
-
-  explicit EnterHandleScopeInstr(Kind kind) : kind_(kind) {}
+  EnterHandleScopeInstr() {}
 
   DECLARE_INSTRUCTION(EnterHandleScope)
 
@@ -5347,8 +5362,6 @@
   PRINT_OPERANDS_TO_SUPPORT
 
  private:
-  Kind kind_;
-
   DISALLOW_COPY_AND_ASSIGN(EnterHandleScopeInstr);
 };
 
diff --git a/runtime/vm/compiler/backend/il_arm.cc b/runtime/vm/compiler/backend/il_arm.cc
index 0f1784c..8794fb4 100644
--- a/runtime/vm/compiler/backend/il_arm.cc
+++ b/runtime/vm/compiler/backend/il_arm.cc
@@ -2184,11 +2184,13 @@
         locs->set_temp(0, Location::RegisterLocation(kWriteBarrierSlotReg));
       }
       break;
-    case kExternalTypedDataUint8ArrayCid:
     case kExternalTypedDataUint8ClampedArrayCid:
+    case kTypedDataUint8ClampedArrayCid:
+      locs->set_in(2, LocationRegisterOrConstant(value()));
+      break;
+    case kExternalTypedDataUint8ArrayCid:
     case kTypedDataInt8ArrayCid:
     case kTypedDataUint8ArrayCid:
-    case kTypedDataUint8ClampedArrayCid:
     case kOneByteStringCid:
     case kTwoByteStringCid:
     case kTypedDataInt16ArrayCid:
diff --git a/runtime/vm/compiler/backend/il_arm64.cc b/runtime/vm/compiler/backend/il_arm64.cc
index ac442ee..6c1cc4f 100644
--- a/runtime/vm/compiler/backend/il_arm64.cc
+++ b/runtime/vm/compiler/backend/il_arm64.cc
@@ -287,11 +287,15 @@
   const intptr_t kNumTemps = 0;
   LocationSummary* locs = new (zone)
       LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
-  if (representation() == kUnboxedDouble) {
+  ConstantInstr* constant = value()->definition()->AsConstant();
+  if (constant != nullptr && constant->HasZeroRepresentation()) {
+    locs->set_in(0, Location::Constant(constant));
+  } else if (representation() == kUnboxedDouble) {
     locs->set_in(0, Location::RequiresFpuRegister());
   } else if (representation() == kUnboxedInt64) {
     locs->set_in(0, Location::RequiresRegister());
   } else {
+    ASSERT(representation() == kTagged);
     locs->set_in(0, LocationAnyOrConstant(value()));
   }
   return locs;
@@ -354,11 +358,17 @@
       if (value.IsRegister()) {
         reg = value.reg();
       } else if (value.IsConstant()) {
-        if (compiler::IsSameObject(compiler::NullObject(), value.constant())) {
-          reg = NULL_REG;
+        if (value.constant_instruction()->HasZeroRepresentation()) {
+          reg = ZR;
         } else {
-          reg = pusher.GetFreeTempRegister(compiler);
-          __ LoadObject(reg, value.constant());
+          ASSERT(push_arg->representation() == kTagged);
+          const Object& constant = value.constant();
+          if (constant.IsNull()) {
+            reg = NULL_REG;
+          } else {
+            reg = pusher.GetFreeTempRegister(compiler);
+            __ LoadObject(reg, value.constant());
+          }
         }
       } else if (value.IsFpuRegister()) {
         pusher.Flush(compiler);
@@ -613,19 +623,15 @@
     }
   } else if (destination.IsFpuRegister()) {
     const VRegister dst = destination.fpu_reg();
-    if (Utils::DoublesBitEqual(Double::Cast(value_).value(), 0.0)) {
-      __ veor(dst, dst, dst);
-    } else {
-      __ LoadDImmediate(dst, Double::Cast(value_).value());
-    }
+    __ LoadDImmediate(dst, Double::Cast(value_).value());
   } else if (destination.IsDoubleStackSlot()) {
+    const intptr_t dest_offset = destination.ToStackSlotOffset();
     if (Utils::DoublesBitEqual(Double::Cast(value_).value(), 0.0)) {
-      __ veor(VTMP, VTMP, VTMP);
+      __ StoreToOffset(ZR, destination.base_reg(), dest_offset);
     } else {
       __ LoadDImmediate(VTMP, Double::Cast(value_).value());
+      __ StoreDToOffset(VTMP, destination.base_reg(), dest_offset);
     }
-    const intptr_t dest_offset = destination.ToStackSlotOffset();
-    __ StoreDToOffset(VTMP, destination.base_reg(), dest_offset);
   } else {
     ASSERT(destination.IsStackSlot());
     ASSERT(tmp != kNoRegister);
@@ -634,10 +640,20 @@
         representation() == kUnboxedUint32 ||
         representation() == kUnboxedInt64) {
       const int64_t value = Integer::Cast(value_).AsInt64Value();
-      __ LoadImmediate(tmp, value);
+      if (value == 0) {
+        tmp = ZR;
+      } else {
+        __ LoadImmediate(tmp, value);
+      }
     } else {
       ASSERT(representation() == kTagged);
-      __ LoadObject(tmp, value_);
+      if (value_.IsNull()) {
+        tmp = NULL_REG;
+      } else if (value_.IsSmi() && Smi::Cast(value_).Value() == 0) {
+        tmp = ZR;
+      } else {
+        __ LoadObject(tmp, value_);
+      }
     }
     __ StoreToOffset(tmp, destination.base_reg(), dest_offset);
   }
@@ -1940,11 +1956,13 @@
         locs->set_temp(0, Location::RegisterLocation(kWriteBarrierSlotReg));
       }
       break;
-    case kExternalTypedDataUint8ArrayCid:
     case kExternalTypedDataUint8ClampedArrayCid:
+    case kTypedDataUint8ClampedArrayCid:
+      locs->set_in(2, LocationRegisterOrConstant(value()));
+      break;
+    case kExternalTypedDataUint8ArrayCid:
     case kTypedDataInt8ArrayCid:
     case kTypedDataUint8ArrayCid:
-    case kTypedDataUint8ClampedArrayCid:
     case kOneByteStringCid:
     case kTwoByteStringCid:
     case kTypedDataInt16ArrayCid:
@@ -1952,13 +1970,25 @@
     case kTypedDataInt32ArrayCid:
     case kTypedDataUint32ArrayCid:
     case kTypedDataInt64ArrayCid:
-    case kTypedDataUint64ArrayCid:
-      locs->set_in(2, Location::RequiresRegister());
+    case kTypedDataUint64ArrayCid: {
+      ConstantInstr* constant = value()->definition()->AsConstant();
+      if (constant != nullptr && constant->HasZeroRepresentation()) {
+        locs->set_in(2, Location::Constant(constant));
+      } else {
+        locs->set_in(2, Location::RequiresRegister());
+      }
       break;
+    }
     case kTypedDataFloat32ArrayCid:
-    case kTypedDataFloat64ArrayCid:  // TODO(srdjan): Support Float64 constants.
-      locs->set_in(2, Location::RequiresFpuRegister());
+    case kTypedDataFloat64ArrayCid: {
+      ConstantInstr* constant = value()->definition()->AsConstant();
+      if (constant != nullptr && constant->HasZeroRepresentation()) {
+        locs->set_in(2, Location::Constant(constant));
+      } else {
+        locs->set_in(2, Location::RequiresFpuRegister());
+      }
       break;
+    }
     case kTypedDataInt32x4ArrayCid:
     case kTypedDataFloat32x4ArrayCid:
     case kTypedDataFloat64x2ArrayCid:
@@ -2016,18 +2046,15 @@
     case kTypedDataInt8ArrayCid:
     case kTypedDataUint8ArrayCid:
     case kExternalTypedDataUint8ArrayCid:
-    case kOneByteStringCid: {
+    case kOneByteStringCid:
       ASSERT(RequiredInputRepresentation(2) == kUnboxedIntPtr);
       if (locs()->in(2).IsConstant()) {
-        const Smi& constant = Smi::Cast(locs()->in(2).constant());
-        __ LoadImmediate(TMP, static_cast<int8_t>(constant.Value()));
-        __ str(TMP, element_address, compiler::kUnsignedByte);
+        ASSERT(locs()->in(2).constant_instruction()->HasZeroRepresentation());
+        __ str(ZR, element_address, compiler::kUnsignedByte);
       } else {
-        const Register value = locs()->in(2).reg();
-        __ str(value, element_address, compiler::kUnsignedByte);
+        __ str(locs()->in(2).reg(), element_address, compiler::kUnsignedByte);
       }
       break;
-    }
     case kTypedDataUint8ClampedArrayCid:
     case kExternalTypedDataUint8ClampedArrayCid: {
       ASSERT(RequiredInputRepresentation(2) == kUnboxedIntPtr);
@@ -2040,8 +2067,12 @@
         } else if (value < 0) {
           value = 0;
         }
-        __ LoadImmediate(TMP, static_cast<int8_t>(value));
-        __ str(TMP, element_address, compiler::kUnsignedByte);
+        if (value == 0) {
+          __ str(ZR, element_address, compiler::kUnsignedByte);
+        } else {
+          __ LoadImmediate(TMP, static_cast<int8_t>(value));
+          __ str(TMP, element_address, compiler::kUnsignedByte);
+        }
       } else {
         const Register value = locs()->in(2).reg();
         // Clamp to 0x00 or 0xFF respectively.
@@ -2054,32 +2085,50 @@
     }
     case kTwoByteStringCid:
     case kTypedDataInt16ArrayCid:
-    case kTypedDataUint16ArrayCid: {
+    case kTypedDataUint16ArrayCid:
       ASSERT(RequiredInputRepresentation(2) == kUnboxedIntPtr);
-      const Register value = locs()->in(2).reg();
-      __ str(value, element_address, compiler::kUnsignedTwoBytes);
+      if (locs()->in(2).IsConstant()) {
+        ASSERT(locs()->in(2).constant_instruction()->HasZeroRepresentation());
+        __ str(ZR, element_address, compiler::kUnsignedTwoBytes);
+      } else {
+        __ str(locs()->in(2).reg(), element_address,
+               compiler::kUnsignedTwoBytes);
+      }
       break;
-    }
     case kTypedDataInt32ArrayCid:
-    case kTypedDataUint32ArrayCid: {
-      const Register value = locs()->in(2).reg();
-      __ str(value, element_address, compiler::kUnsignedFourBytes);
+    case kTypedDataUint32ArrayCid:
+      if (locs()->in(2).IsConstant()) {
+        ASSERT(locs()->in(2).constant_instruction()->HasZeroRepresentation());
+        __ str(ZR, element_address, compiler::kUnsignedFourBytes);
+      } else {
+        __ str(locs()->in(2).reg(), element_address,
+               compiler::kUnsignedFourBytes);
+      }
       break;
-    }
     case kTypedDataInt64ArrayCid:
-    case kTypedDataUint64ArrayCid: {
-      const Register value = locs()->in(2).reg();
-      __ str(value, element_address, compiler::kEightBytes);
+    case kTypedDataUint64ArrayCid:
+      if (locs()->in(2).IsConstant()) {
+        ASSERT(locs()->in(2).constant_instruction()->HasZeroRepresentation());
+        __ str(ZR, element_address, compiler::kEightBytes);
+      } else {
+        __ str(locs()->in(2).reg(), element_address, compiler::kEightBytes);
+      }
       break;
-    }
-    case kTypedDataFloat32ArrayCid: {
-      const VRegister value_reg = locs()->in(2).fpu_reg();
-      __ fstrs(value_reg, element_address);
+    case kTypedDataFloat32ArrayCid:
+      if (locs()->in(2).IsConstant()) {
+        ASSERT(locs()->in(2).constant_instruction()->HasZeroRepresentation());
+        __ str(ZR, element_address, compiler::kFourBytes);
+      } else {
+        __ fstrs(locs()->in(2).fpu_reg(), element_address);
+      }
       break;
-    }
     case kTypedDataFloat64ArrayCid: {
-      const VRegister value_reg = locs()->in(2).fpu_reg();
-      __ fstrd(value_reg, element_address);
+      if (locs()->in(2).IsConstant()) {
+        ASSERT(locs()->in(2).constant_instruction()->HasZeroRepresentation());
+        __ str(ZR, element_address, compiler::kEightBytes);
+      } else {
+        __ fstrd(locs()->in(2).fpu_reg(), element_address);
+      }
       break;
     }
     case kTypedDataFloat64x2ArrayCid:
@@ -2410,7 +2459,12 @@
     summary->set_in(kValuePos, Location::RequiresRegister());
   } else if (IsUnboxedDartFieldStore() && opt) {
     summary->set_in(kValuePos, Location::RequiresFpuRegister());
-    if (!FLAG_precompiled_mode) {
+    if (FLAG_precompiled_mode) {
+      ConstantInstr* constant = value()->definition()->AsConstant();
+      if (constant != nullptr && constant->HasZeroRepresentation()) {
+        summary->set_in(kValuePos, Location::Constant(constant));
+      }
+    } else {
       summary->set_temp(0, Location::RequiresRegister());
       summary->set_temp(1, Location::RequiresRegister());
     }
@@ -2453,22 +2507,33 @@
 
   if (IsUnboxedDartFieldStore() && compiler->is_optimizing()) {
     ASSERT(memory_order_ != compiler::AssemblerBase::kRelease);
-    const VRegister value = locs()->in(kValuePos).fpu_reg();
     const intptr_t cid = slot().field().UnboxedFieldCid();
 
     if (FLAG_precompiled_mode) {
       switch (cid) {
         case kDoubleCid:
           __ Comment("UnboxedDoubleStoreInstanceFieldInstr");
-          __ StoreDFieldToOffset(value, instance_reg, offset_in_bytes);
+          if (locs()->in(kValuePos).IsConstant()) {
+            ASSERT(locs()
+                       ->in(kValuePos)
+                       .constant_instruction()
+                       ->HasZeroRepresentation());
+            __ StoreFieldToOffset(ZR, instance_reg, offset_in_bytes,
+                                  compiler::kEightBytes);
+          } else {
+            __ StoreDFieldToOffset(locs()->in(kValuePos).fpu_reg(),
+                                   instance_reg, offset_in_bytes);
+          }
           return;
         case kFloat32x4Cid:
           __ Comment("UnboxedFloat32x4StoreInstanceFieldInstr");
-          __ StoreQFieldToOffset(value, instance_reg, offset_in_bytes);
+          __ StoreQFieldToOffset(locs()->in(kValuePos).fpu_reg(), instance_reg,
+                                 offset_in_bytes);
           return;
         case kFloat64x2Cid:
           __ Comment("UnboxedFloat64x2StoreInstanceFieldInstr");
-          __ StoreQFieldToOffset(value, instance_reg, offset_in_bytes);
+          __ StoreQFieldToOffset(locs()->in(kValuePos).fpu_reg(), instance_reg,
+                                 offset_in_bytes);
           return;
         default:
           UNREACHABLE();
@@ -2501,6 +2566,8 @@
     } else {
       __ LoadCompressedFieldFromOffset(temp, instance_reg, offset_in_bytes);
     }
+
+    const VRegister value = locs()->in(kValuePos).fpu_reg();
     switch (cid) {
       case kDoubleCid:
         __ Comment("UnboxedDoubleStoreInstanceFieldInstr");
diff --git a/runtime/vm/compiler/backend/il_printer.cc b/runtime/vm/compiler/backend/il_printer.cc
index 76b1c00..f901a37f 100644
--- a/runtime/vm/compiler/backend/il_printer.cc
+++ b/runtime/vm/compiler/backend/il_printer.cc
@@ -1287,11 +1287,7 @@
 }
 
 void EnterHandleScopeInstr::PrintOperandsTo(BaseTextBuffer* f) const {
-  if (kind_ == Kind::kEnterHandleScope) {
-    f->AddString("<enter handle scope>");
-  } else {
-    f->AddString("<get top api scope>");
-  }
+  f->AddString("<enter handle scope>");
 }
 
 void NativeReturnInstr::PrintOperandsTo(BaseTextBuffer* f) const {
diff --git a/runtime/vm/compiler/backend/il_riscv.cc b/runtime/vm/compiler/backend/il_riscv.cc
index 674370e..00b0cdb 100644
--- a/runtime/vm/compiler/backend/il_riscv.cc
+++ b/runtime/vm/compiler/backend/il_riscv.cc
@@ -322,7 +322,10 @@
   const intptr_t kNumTemps = 0;
   LocationSummary* locs = new (zone)
       LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
-  if (representation() == kUnboxedDouble) {
+  ConstantInstr* constant = value()->definition()->AsConstant();
+  if (constant != nullptr && constant->HasZeroRepresentation()) {
+    locs->set_in(0, Location::Constant(constant));
+  } else if (representation() == kUnboxedDouble) {
     locs->set_in(0, Location::RequiresFpuRegister());
   } else if (representation() == kUnboxedInt64) {
 #if XLEN == 32
@@ -332,6 +335,7 @@
     locs->set_in(0, Location::RequiresRegister());
 #endif
   } else {
+    ASSERT(representation() == kTagged);
     locs->set_in(0, LocationAnyOrConstant(value()));
   }
   return locs;
@@ -359,7 +363,14 @@
         size += 2 * compiler::target::kWordSize;
 #endif
       } else if (value.IsConstant()) {
-        size += compiler::target::kWordSize;
+        if (push_arg->representation() == kUnboxedDouble) {
+          size += sizeof(double);
+        } else if (push_arg->representation() == kUnboxedInt64) {
+          size += sizeof(int64_t);
+        } else {
+          ASSERT(push_arg->representation() == kTagged);
+          size += compiler::target::kWordSize;
+        }
       } else if (value.IsFpuRegister()) {
         size += sizeof(double);
       } else if (value.IsStackSlot()) {
@@ -385,18 +396,39 @@
         __ StoreToOffset(value.AsPairLocation()->At(0).reg(), SP, offset);
 #endif
       } else if (value.IsConstant()) {
-        const Object& constant = value.constant();
-        Register reg;
-        if (constant.IsNull()) {
-          reg = NULL_REG;
-        } else if (constant.IsSmi() && Smi::Cast(constant).Value() == 0) {
-          reg = ZR;
+        if (push_arg->representation() == kUnboxedDouble) {
+          ASSERT(value.constant_instruction()->HasZeroRepresentation());
+          offset -= sizeof(double);
+#if XLEN == 32
+          __ StoreToOffset(ZR, SP, offset + 4);
+          __ StoreToOffset(ZR, SP, offset);
+#else
+          __ StoreToOffset(ZR, SP, offset);
+#endif
+        } else if (push_arg->representation() == kUnboxedInt64) {
+          ASSERT(value.constant_instruction()->HasZeroRepresentation());
+          offset -= sizeof(int64_t);
+#if XLEN == 32
+          __ StoreToOffset(ZR, SP, offset + 4);
+          __ StoreToOffset(ZR, SP, offset);
+#else
+          __ StoreToOffset(ZR, SP, offset);
+#endif
         } else {
-          reg = TMP;
-          __ LoadObject(TMP, constant);
+          ASSERT(push_arg->representation() == kTagged);
+          const Object& constant = value.constant();
+          Register reg;
+          if (constant.IsNull()) {
+            reg = NULL_REG;
+          } else if (constant.IsSmi() && Smi::Cast(constant).Value() == 0) {
+            reg = ZR;
+          } else {
+            reg = TMP;
+            __ LoadObject(TMP, constant);
+          }
+          offset -= compiler::target::kWordSize;
+          __ StoreToOffset(reg, SP, offset);
         }
-        offset -= compiler::target::kWordSize;
-        __ StoreToOffset(reg, SP, offset);
       } else if (value.IsFpuRegister()) {
         offset -= sizeof(double);
         __ StoreDToOffset(value.fpu_reg(), SP, offset);
@@ -684,24 +716,33 @@
     const FRegister dst = destination.fpu_reg();
     __ LoadDImmediate(dst, Double::Cast(value_).value());
   } else if (destination.IsDoubleStackSlot()) {
-    __ LoadDImmediate(FTMP, Double::Cast(value_).value());
     const intptr_t dest_offset = destination.ToStackSlotOffset();
-    __ StoreDToOffset(FTMP, destination.base_reg(), dest_offset);
+#if XLEN == 32
+    if (false) {
+#else
+    if (Utils::DoublesBitEqual(Double::Cast(value_).value(), 0.0)) {
+#endif
+      __ StoreToOffset(ZR, destination.base_reg(), dest_offset);
+    } else {
+      __ LoadDImmediate(FTMP, Double::Cast(value_).value());
+      __ StoreDToOffset(FTMP, destination.base_reg(), dest_offset);
+    }
   } else {
     ASSERT(destination.IsStackSlot());
     ASSERT(tmp != kNoRegister);
     const intptr_t dest_offset = destination.ToStackSlotOffset();
     if (RepresentationUtils::IsUnboxedInteger(representation())) {
-      int64_t v;
-      const bool ok = compiler::HasIntegerValue(value_, &v);
-      RELEASE_ASSERT(ok);
+      int64_t val = Integer::Cast(value_).AsInt64Value();
 #if XLEN == 32
-      __ LoadImmediate(
-          tmp, pair_index == 0 ? Utils::Low32Bits(v) : Utils::High32Bits(v));
+      val = pair_index == 0 ? Utils::Low32Bits(val) : Utils::High32Bits(val);
 #else
       ASSERT(pair_index == 0);  // No pair representation needed on 64-bit.
-      __ LoadImmediate(tmp, v);
 #endif
+      if (val == 0) {
+        tmp = ZR;
+      } else {
+        __ LoadImmediate(tmp, val);
+      }
     } else {
       ASSERT(representation() == kTagged);
       if (value_.IsNull()) {
@@ -2159,32 +2200,64 @@
         locs->set_temp(0, Location::RegisterLocation(kWriteBarrierSlotReg));
       }
       break;
-    case kExternalTypedDataUint8ArrayCid:
     case kExternalTypedDataUint8ClampedArrayCid:
+    case kTypedDataUint8ClampedArrayCid:
+      locs->set_in(2, LocationRegisterOrConstant(value()));
+      break;
+    case kExternalTypedDataUint8ArrayCid:
     case kTypedDataInt8ArrayCid:
     case kTypedDataUint8ArrayCid:
-    case kTypedDataUint8ClampedArrayCid:
     case kOneByteStringCid:
     case kTwoByteStringCid:
     case kTypedDataInt16ArrayCid:
     case kTypedDataUint16ArrayCid:
     case kTypedDataInt32ArrayCid:
-    case kTypedDataUint32ArrayCid:
-      locs->set_in(2, Location::RequiresRegister());
+    case kTypedDataUint32ArrayCid: {
+      ConstantInstr* constant = value()->definition()->AsConstant();
+      if (constant != nullptr && constant->HasZeroRepresentation()) {
+        locs->set_in(2, Location::Constant(constant));
+      } else {
+        locs->set_in(2, Location::RequiresRegister());
+      }
       break;
+    }
     case kTypedDataInt64ArrayCid:
-    case kTypedDataUint64ArrayCid:
+    case kTypedDataUint64ArrayCid: {
 #if XLEN == 32
       locs->set_in(2, Location::Pair(Location::RequiresRegister(),
                                      Location::RequiresRegister()));
 #else
-      locs->set_in(2, Location::RequiresRegister());
+      ConstantInstr* constant = value()->definition()->AsConstant();
+      if (constant != nullptr && constant->HasZeroRepresentation()) {
+        locs->set_in(2, Location::Constant(constant));
+      } else {
+        locs->set_in(2, Location::RequiresRegister());
+      }
 #endif
       break;
-    case kTypedDataFloat32ArrayCid:
-    case kTypedDataFloat64ArrayCid:  // TODO(srdjan): Support Float64 constants.
-      locs->set_in(2, Location::RequiresFpuRegister());
+    }
+    case kTypedDataFloat32ArrayCid: {
+      ConstantInstr* constant = value()->definition()->AsConstant();
+      if (constant != nullptr && constant->HasZeroRepresentation()) {
+        locs->set_in(2, Location::Constant(constant));
+      } else {
+        locs->set_in(2, Location::RequiresFpuRegister());
+      }
       break;
+    }
+    case kTypedDataFloat64ArrayCid: {
+#if XLEN == 32
+      locs->set_in(2, Location::RequiresFpuRegister());
+#else
+      ConstantInstr* constant = value()->definition()->AsConstant();
+      if (constant != nullptr && constant->HasZeroRepresentation()) {
+        locs->set_in(2, Location::Constant(constant));
+      } else {
+        locs->set_in(2, Location::RequiresFpuRegister());
+      }
+#endif
+      break;
+    }
     case kTypedDataInt32x4ArrayCid:
     case kTypedDataFloat32x4ArrayCid:
     case kTypedDataFloat64x2ArrayCid:
@@ -2245,9 +2318,8 @@
     case kOneByteStringCid: {
       ASSERT(RequiredInputRepresentation(2) == kUnboxedIntPtr);
       if (locs()->in(2).IsConstant()) {
-        const Smi& constant = Smi::Cast(locs()->in(2).constant());
-        __ LoadImmediate(TMP, static_cast<int8_t>(constant.Value()));
-        __ sb(TMP, element_address);
+        ASSERT(locs()->in(2).constant_instruction()->HasZeroRepresentation());
+        __ sb(ZR, element_address);
       } else {
         const Register value = locs()->in(2).reg();
         __ sb(value, element_address);
@@ -2266,8 +2338,12 @@
         } else if (value < 0) {
           value = 0;
         }
-        __ LoadImmediate(TMP, static_cast<int8_t>(value));
-        __ sb(TMP, element_address);
+        if (value == 0) {
+          __ sb(ZR, element_address);
+        } else {
+          __ LoadImmediate(TMP, static_cast<int8_t>(value));
+          __ sb(TMP, element_address);
+        }
       } else {
         const Register value = locs()->in(2).reg();
 
@@ -2294,21 +2370,33 @@
     case kTypedDataInt16ArrayCid:
     case kTypedDataUint16ArrayCid: {
       ASSERT(RequiredInputRepresentation(2) == kUnboxedIntPtr);
-      const Register value = locs()->in(2).reg();
-      __ sh(value, element_address);
+      if (locs()->in(2).IsConstant()) {
+        ASSERT(locs()->in(2).constant_instruction()->HasZeroRepresentation());
+        __ sh(ZR, element_address);
+      } else {
+        __ sh(locs()->in(2).reg(), element_address);
+      }
       break;
     }
     case kTypedDataInt32ArrayCid:
     case kTypedDataUint32ArrayCid: {
-      const Register value = locs()->in(2).reg();
-      __ sw(value, element_address);
+      if (locs()->in(2).IsConstant()) {
+        ASSERT(locs()->in(2).constant_instruction()->HasZeroRepresentation());
+        __ sw(ZR, element_address);
+      } else {
+        __ sw(locs()->in(2).reg(), element_address);
+      }
       break;
     }
     case kTypedDataInt64ArrayCid:
     case kTypedDataUint64ArrayCid: {
 #if XLEN >= 64
-      const Register value = locs()->in(2).reg();
-      __ sd(value, element_address);
+      if (locs()->in(2).IsConstant()) {
+        ASSERT(locs()->in(2).constant_instruction()->HasZeroRepresentation());
+        __ sd(ZR, element_address);
+      } else {
+        __ sd(locs()->in(2).reg(), element_address);
+      }
 #else
       PairLocation* value_pair = locs()->in(2).AsPairLocation();
       Register value_lo = value_pair->At(0).reg();
@@ -2320,13 +2408,25 @@
       break;
     }
     case kTypedDataFloat32ArrayCid: {
-      const FRegister value_reg = locs()->in(2).fpu_reg();
-      __ fsw(value_reg, element_address);
+      if (locs()->in(2).IsConstant()) {
+        ASSERT(locs()->in(2).constant_instruction()->HasZeroRepresentation());
+        __ sw(ZR, element_address);
+      } else {
+        __ fsw(locs()->in(2).fpu_reg(), element_address);
+      }
       break;
     }
     case kTypedDataFloat64ArrayCid: {
-      const FRegister value_reg = locs()->in(2).fpu_reg();
-      __ fsd(value_reg, element_address);
+#if XLEN >= 64
+      if (locs()->in(2).IsConstant()) {
+        ASSERT(locs()->in(2).constant_instruction()->HasZeroRepresentation());
+        __ sd(ZR, element_address);
+      } else {
+        __ fsd(locs()->in(2).fpu_reg(), element_address);
+      }
+#else
+      __ fsd(locs()->in(2).fpu_reg(), element_address);
+#endif
       break;
     }
     case kTypedDataFloat64x2ArrayCid:
@@ -2663,7 +2763,14 @@
     }
   } else if (IsUnboxedDartFieldStore() && opt) {
     summary->set_in(kValuePos, Location::RequiresFpuRegister());
-    if (!FLAG_precompiled_mode) {
+    if (FLAG_precompiled_mode) {
+#if XLEN >= 64
+      ConstantInstr* constant = value()->definition()->AsConstant();
+      if (constant != nullptr && constant->HasZeroRepresentation()) {
+        summary->set_in(kValuePos, Location::Constant(constant));
+      }
+#endif
+    } else {
       summary->set_temp(0, Location::RequiresRegister());
       summary->set_temp(1, Location::RequiresRegister());
     }
@@ -2721,14 +2828,24 @@
 
   if (IsUnboxedDartFieldStore() && compiler->is_optimizing()) {
     ASSERT(memory_order_ != compiler::AssemblerBase::kRelease);
-    const FRegister value = locs()->in(kValuePos).fpu_reg();
     const intptr_t cid = slot().field().UnboxedFieldCid();
-
     if (FLAG_precompiled_mode) {
       switch (cid) {
         case kDoubleCid:
           __ Comment("UnboxedDoubleStoreInstanceFieldInstr");
-          __ StoreDFieldToOffset(value, instance_reg, offset_in_bytes);
+#if XLEN >= 64
+          if (locs()->in(kValuePos).IsConstant()) {
+            ASSERT(locs()
+                       ->in(kValuePos)
+                       .constant_instruction()
+                       ->HasZeroRepresentation());
+            __ StoreFieldToOffset(ZR, instance_reg, offset_in_bytes,
+                                  compiler::kEightBytes);
+            return;
+          }
+#endif
+          __ StoreDFieldToOffset(locs()->in(kValuePos).fpu_reg(), instance_reg,
+                                 offset_in_bytes);
           return;
         case kFloat32x4Cid:
           __ Comment("UnboxedFloat32x4StoreInstanceFieldInstr");
@@ -2769,6 +2886,8 @@
     } else {
       __ LoadCompressedFieldFromOffset(temp, instance_reg, offset_in_bytes);
     }
+
+    const FRegister value = locs()->in(kValuePos).fpu_reg();
     switch (cid) {
       case kDoubleCid:
         __ Comment("UnboxedDoubleStoreInstanceFieldInstr");
diff --git a/runtime/vm/compiler/frontend/kernel_to_il.cc b/runtime/vm/compiler/frontend/kernel_to_il.cc
index fe6b416..fda2a9b 100644
--- a/runtime/vm/compiler/frontend/kernel_to_il.cc
+++ b/runtime/vm/compiler/frontend/kernel_to_il.cc
@@ -3982,17 +3982,17 @@
 }
 
 Fragment FlowGraphBuilder::EnterHandleScope() {
-  auto* instr = new (Z)
-      EnterHandleScopeInstr(EnterHandleScopeInstr::Kind::kEnterHandleScope);
+  auto* instr = new (Z) EnterHandleScopeInstr();
   Push(instr);
   return Fragment(instr);
 }
 
 Fragment FlowGraphBuilder::GetTopHandleScope() {
-  auto* instr = new (Z)
-      EnterHandleScopeInstr(EnterHandleScopeInstr::Kind::kGetTopHandleScope);
-  Push(instr);
-  return Fragment(instr);
+  Fragment body;
+  body += LoadThread();
+  body += LoadUntagged(compiler::target::Thread::api_top_scope_offset());
+  body += ConvertUntaggedToUnboxed(kUnboxedIntPtr);
+  return body;
 }
 
 Fragment FlowGraphBuilder::ExitHandleScope() {
diff --git a/runtime/vm/compiler/frontend/kernel_to_il.h b/runtime/vm/compiler/frontend/kernel_to_il.h
index 4a4966f..697be82 100644
--- a/runtime/vm/compiler/frontend/kernel_to_il.h
+++ b/runtime/vm/compiler/frontend/kernel_to_il.h
@@ -380,7 +380,7 @@
   // Generates a call to `Thread::EnterApiScope`.
   Fragment EnterHandleScope();
 
-  // Generates a call to `Thread::api_top_scope`.
+  // Generates a load of `Thread::api_top_scope`.
   Fragment GetTopHandleScope();
 
   // Generates a call to `Thread::ExitApiScope`.
diff --git a/runtime/vm/compiler/frontend/kernel_translation_helper.cc b/runtime/vm/compiler/frontend/kernel_translation_helper.cc
index d52cc58..7dba48a 100644
--- a/runtime/vm/compiler/frontend/kernel_translation_helper.cc
+++ b/runtime/vm/compiler/frontend/kernel_translation_helper.cc
@@ -1891,9 +1891,11 @@
   Zone* zone = thread->zone();
   intptr_t unit_count = helper_->ReadUInt();
   Array& loading_units = Array::Handle(zone, Array::New(unit_count + 1));
+  Array& loading_unit_uris = Array::Handle(zone, Array::New(unit_count + 1));
   LoadingUnit& unit = LoadingUnit::Handle(zone);
   LoadingUnit& parent = LoadingUnit::Handle(zone);
   Library& lib = Library::Handle(zone);
+  Array& uris = Array::Handle(zone);
 
   for (int i = 0; i < unit_count; i++) {
     intptr_t id = helper_->ReadUInt();
@@ -1907,6 +1909,7 @@
     unit.set_parent(parent);
 
     intptr_t library_count = helper_->ReadUInt();
+    uris = Array::New(library_count);
     for (intptr_t j = 0; j < library_count; j++) {
       const String& uri =
           translation_helper_.DartSymbolPlain(helper_->ReadStringReference());
@@ -1915,14 +1918,18 @@
         FATAL1("Missing library: %s\n", uri.ToCString());
       }
       lib.set_loading_unit(unit);
+      uris.SetAt(j, uri);
     }
 
     loading_units.SetAt(id, unit);
+    loading_unit_uris.SetAt(id, uris);
   }
 
   ObjectStore* object_store = IG->object_store();
   ASSERT(object_store->loading_units() == Array::null());
   object_store->set_loading_units(loading_units);
+  ASSERT(object_store->loading_unit_uris() == Array::null());
+  object_store->set_loading_unit_uris(loading_unit_uris);
 }
 
 CallSiteAttributesMetadataHelper::CallSiteAttributesMetadataHelper(
diff --git a/runtime/vm/compiler/runtime_api.cc b/runtime/vm/compiler/runtime_api.cc
index 6ccecf7..abf5464 100644
--- a/runtime/vm/compiler/runtime_api.cc
+++ b/runtime/vm/compiler/runtime_api.cc
@@ -931,6 +931,15 @@
   return static_cast<word>(dart::Smi::Cast(a).Value());
 }
 
+bool IsDouble(const dart::Object& a) {
+  return a.IsDouble();
+}
+
+double DoubleValue(const dart::Object& a) {
+  RELEASE_ASSERT(IsDouble(a));
+  return dart::Double::Cast(a).value();
+}
+
 #if defined(TARGET_ARCH_IA32)
 uword Code::EntryPointOf(const dart::Code& code) {
   static_assert(kHostWordSize == kWordSize,
diff --git a/runtime/vm/compiler/runtime_api.h b/runtime/vm/compiler/runtime_api.h
index 39752bc..3ce510e 100644
--- a/runtime/vm/compiler/runtime_api.h
+++ b/runtime/vm/compiler/runtime_api.h
@@ -373,6 +373,9 @@
 
 word SmiValue(const dart::Object& a);
 
+bool IsDouble(const dart::Object& a);
+double DoubleValue(const dart::Object& a);
+
 // If the given object can be loaded from the thread on the target then
 // return true and set offset (if provided) to the offset from the
 // thread pointer to a field that contains the object.
diff --git a/runtime/vm/dart_api_impl.cc b/runtime/vm/dart_api_impl.cc
index 4f03fb7a..f8b05d2 100644
--- a/runtime/vm/dart_api_impl.cc
+++ b/runtime/vm/dart_api_impl.cc
@@ -6728,24 +6728,12 @@
   DARTSCOPE(Thread::Current());
   API_TIMELINE_DURATION(T);
 
-  const GrowableObjectArray& result =
-      GrowableObjectArray::Handle(Z, GrowableObjectArray::New());
-  const GrowableObjectArray& libs = GrowableObjectArray::Handle(
-      Z, T->isolate_group()->object_store()->libraries());
-  Library& lib = Library::Handle(Z);
-  LoadingUnit& unit = LoadingUnit::Handle(Z);
-  String& uri = String::Handle(Z);
-  for (intptr_t i = 0; i < libs.Length(); i++) {
-    lib ^= libs.At(i);
-    unit = lib.loading_unit();
-    if (unit.IsNull() || (unit.id() != loading_unit_id)) {
-      continue;
-    }
-    uri = lib.url();
-    result.Add(uri);
+  const Array& loading_units =
+      Array::Handle(Z, T->isolate_group()->object_store()->loading_unit_uris());
+  if (loading_unit_id >= 0 && loading_unit_id < loading_units.Length()) {
+    return Api::NewHandle(T, loading_units.At(loading_unit_id));
   }
-
-  return Api::NewHandle(T, Array::MakeFixedLength(result));
+  return Api::NewError("Invalid loading_unit_id");
 #endif
 }
 
diff --git a/runtime/vm/experimental_features.cc b/runtime/vm/experimental_features.cc
index 6ac7812..c776db0f 100644
--- a/runtime/vm/experimental_features.cc
+++ b/runtime/vm/experimental_features.cc
@@ -18,19 +18,8 @@
 
 bool GetExperimentalFeatureDefault(ExperimentalFeature feature) {
   constexpr bool kFeatureValues[] = {
-    true,
-    true,
-    true,
-    true,
-    true,
-    true,
-    true,
-    true,
-    true,
-    true,
-    true,
-    true,
-    true,
+      true, true, true, true, true, true, true,
+      true, true, true, true, true, true, true,
   };
   ASSERT(static_cast<size_t>(feature) < ARRAY_SIZE(kFeatureValues));
   return kFeatureValues[static_cast<int>(feature)];
@@ -38,19 +27,20 @@
 
 const char* GetExperimentalFeatureName(ExperimentalFeature feature) {
   constexpr const char* kFeatureNames[] = {
-    "nonfunction-type-aliases",
-    "non-nullable",
-    "extension-methods",
-    "constant-update-2018",
-    "control-flow-collections",
-    "generic-metadata",
-    "set-literals",
-    "spread-collections",
-    "triple-shift",
-    "constructor-tearoffs",
-    "enhanced-enums",
-    "named-arguments-anywhere",
-    "super-parameters",
+      "nonfunction-type-aliases",
+      "non-nullable",
+      "extension-methods",
+      "constant-update-2018",
+      "control-flow-collections",
+      "generic-metadata",
+      "set-literals",
+      "spread-collections",
+      "triple-shift",
+      "constructor-tearoffs",
+      "enhanced-enums",
+      "named-arguments-anywhere",
+      "super-parameters",
+      "inference-update-1",
   };
   ASSERT(static_cast<size_t>(feature) < ARRAY_SIZE(kFeatureNames));
   return kFeatureNames[static_cast<int>(feature)];
diff --git a/runtime/vm/experimental_features.h b/runtime/vm/experimental_features.h
index c32ef01..be9be59 100644
--- a/runtime/vm/experimental_features.h
+++ b/runtime/vm/experimental_features.h
@@ -27,6 +27,7 @@
   enhanced_enums,
   named_arguments_anywhere,
   super_parameters,
+  inference_update_1,
 };
 
 bool GetExperimentalFeatureDefault(ExperimentalFeature feature);
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index deae310..0b5f8bc 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -12452,8 +12452,12 @@
   untag()->set_name(name.ptr());
 }
 
-void Library::set_url(const String& name) const {
-  untag()->set_url(name.ptr());
+void Library::set_url(const String& url) const {
+  untag()->set_url(url.ptr());
+}
+
+void Library::set_private_key(const String& key) const {
+  untag()->set_private_key(key.ptr());
 }
 
 void Library::set_kernel_data(const ExternalTypedData& data) const {
diff --git a/runtime/vm/object.h b/runtime/vm/object.h
index 6f226c3..dd1699a 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -5109,6 +5109,7 @@
   // the name and url.
   void set_name(const String& name) const;
   void set_url(const String& url) const;
+  void set_private_key(const String& key) const;
 
   void set_num_imports(intptr_t value) const;
   void set_flags(uint8_t flags) const;
diff --git a/runtime/vm/object_store.h b/runtime/vm/object_store.h
index 674d1b4..718e61d 100644
--- a/runtime/vm/object_store.h
+++ b/runtime/vm/object_store.h
@@ -261,6 +261,7 @@
   RW(Array, dispatch_table_code_entries)                                       \
   RW(GrowableObjectArray, instructions_tables)                                 \
   RW(Array, obfuscation_map)                                                   \
+  RW(Array, loading_unit_uris)                                                 \
   RW(GrowableObjectArray, ffi_callback_functions)                              \
   RW(Class, ffi_pointer_class)                                                 \
   RW(Class, ffi_native_type_class)                                             \
diff --git a/sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/errors.dart b/sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/errors.dart
index b798adf..f028cb7 100644
--- a/sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/errors.dart
+++ b/sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/errors.dart
@@ -44,6 +44,21 @@
   }
 }
 
+/// Throws if [useNewTypes] does not match the version of the type
+/// representation of this SDK.
+///
+/// The call to this method is inserted into every module at compile time.
+void _checkModuleRuntimeTypes(@notNull bool useNewTypes) {
+  if (useNewTypes != compileTimeFlag('newRuntimeTypes')) {
+    var sdkTypes = compileTimeFlag('newRuntimeTypes') ? 'new' : 'old';
+    var moduleTypes = useNewTypes ? 'new' : 'old';
+
+    throw AssertionError('The Dart SDK module is using the $sdkTypes runtime '
+        'type representation and is incompatible with the $moduleTypes '
+        'representation used in this module.');
+  }
+}
+
 final _nullFailedSet = JS('!', 'new Set()');
 
 String _nullFailedMessage(variableName) =>
diff --git a/sdk/lib/_internal/js_dev_runtime/private/foreign_helper.dart b/sdk/lib/_internal/js_dev_runtime/private/foreign_helper.dart
index 6551c93..354f448 100644
--- a/sdk/lib/_internal/js_dev_runtime/private/foreign_helper.dart
+++ b/sdk/lib/_internal/js_dev_runtime/private/foreign_helper.dart
@@ -4,6 +4,9 @@
 
 library dart._foreign_helper;
 
+import 'dart:_js_shared_embedded_names' show JsBuiltin, JsGetName;
+import 'dart:_rti' show Rti;
+
 /**
  * Emits a JavaScript code fragment parameterized by arguments.
  *
@@ -221,7 +224,7 @@
 external String JS_FUNCTION_TYPE_NAMED_PARAMETERS_TAG();
 
 /// Returns the JS name for [name] from the Namer.
-external String JS_GET_NAME(String name);
+external String JS_GET_NAME(JsGetName name);
 
 /// Returns the state of a flag that is determined by the state of the compiler
 /// when the program has been analyzed.
@@ -274,3 +277,52 @@
   throw StateError('The spread function cannot be called, '
       'it should be compiled away.');
 }
+
+/// Reads an embedded global.
+///
+/// The [name] should be a constant defined in the `_js_shared_embedded_names`
+/// library.
+external JS_EMBEDDED_GLOBAL(String typeDescription, String name);
+
+/// Instructs the compiler to execute the [builtinName] action at the call-site.
+///
+/// The [builtin] should be a constant defined in the
+/// `_js_shared_embedded_names` library.
+// Add additional optional arguments if needed. The method is treated internally
+// as a variable argument method.
+external JS_BUILTIN(String typeDescription, JsBuiltin builtin,
+    [arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11]);
+
+/// Returns the interceptor for [object].
+///
+// TODO(nshahan) Replace calls at compile time?
+external getInterceptor(object);
+
+/// Returns the Rti object for the type for JavaScript arrays via JS-interop.
+///
+// TODO(nshahan) Replace calls at compile time?
+external Object getJSArrayInteropRti();
+
+/// Returns a raw reference to the JavaScript function which implements
+/// [function].
+///
+/// Warning: this is dangerous, you should probably use
+/// [DART_CLOSURE_TO_JS] instead. The returned object is not a valid
+/// Dart closure, does not store the isolate context or arity.
+///
+/// A valid example of where this can be used is as the second argument
+/// to V8's Error.captureStackTrace. See
+/// https://code.google.com/p/v8/wiki/JavaScriptStackTraceApi.
+// TODO(nshahan) Replace calls at compile time?
+external RAW_DART_FUNCTION_REF(Function function);
+
+/// Returns a TypeReference to [T].
+// TODO(nshahan) Replace calls at compile time?
+external Rti TYPE_REF<T>();
+
+/// Returns a TypeReference to [T]*.
+// TODO(nshahan) Replace calls at compile time?
+external Rti LEGACY_TYPE_REF<T>();
+
+/// JavaScript string concatenation. Inputs must be Strings.
+external String JS_STRING_CONCAT(String a, String b);
diff --git a/sdk/lib/_internal/js_dev_runtime/private/interceptors.dart b/sdk/lib/_internal/js_dev_runtime/private/interceptors.dart
index 8e700e5..8bbd911 100644
--- a/sdk/lib/_internal/js_dev_runtime/private/interceptors.dart
+++ b/sdk/lib/_internal/js_dev_runtime/private/interceptors.dart
@@ -23,9 +23,6 @@
   String toString() => JS<String>('!', '#.toString()', this);
 }
 
-// TODO(jmesserly): remove
-getInterceptor(obj) => obj;
-
 /**
  * The interceptor class for [bool].
  */
@@ -296,3 +293,6 @@
 // TODO(sigmund): revisit whether this method is still needed after reoganizing
 // all web tests.
 findInterceptorForType(Type? type) {}
+
+// TODO(nshahan) Find a correct representation for JS functions.
+typedef JavaScriptFunction = dart.FunctionType;
diff --git a/sdk/lib/_internal/js_dev_runtime/private/js_names.dart b/sdk/lib/_internal/js_dev_runtime/private/js_names.dart
new file mode 100644
index 0000000..93e5e0d
--- /dev/null
+++ b/sdk/lib/_internal/js_dev_runtime/private/js_names.dart
@@ -0,0 +1,9 @@
+// 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.
+
+library dart._js_names;
+
+String? unmangleGlobalNameIfPreservedAnyways(String name) {
+  throw ('Unimplemented');
+}
diff --git a/sdk/lib/_internal/js_runtime/lib/synced/async_await_error_codes.dart b/sdk/lib/_internal/js_runtime/lib/synced/async_await_error_codes.dart
index 1708230..f87406b 100644
--- a/sdk/lib/_internal/js_runtime/lib/synced/async_await_error_codes.dart
+++ b/sdk/lib/_internal/js_runtime/lib/synced/async_await_error_codes.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.
 
-// @dart=2.12
-
 /// Contains error codes that transformed async/async* functions use to
 /// communicate with js_helper functions.
 
diff --git a/sdk/lib/_internal/js_runtime/lib/synced/embedded_names.dart b/sdk/lib/_internal/js_runtime/lib/synced/embedded_names.dart
index 0c99f47..bbb7001 100644
--- a/sdk/lib/_internal/js_runtime/lib/synced/embedded_names.dart
+++ b/sdk/lib/_internal/js_runtime/lib/synced/embedded_names.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.
 
-// @dart=2.12
-
 /// Contains the names of globals that are embedded into the output by the
 /// compiler.
 ///
diff --git a/sdk/lib/_internal/js_shared/lib/js_util_patch.dart b/sdk/lib/_internal/js_shared/lib/js_util_patch.dart
new file mode 100644
index 0000000..f67886e
--- /dev/null
+++ b/sdk/lib/_internal/js_shared/lib/js_util_patch.dart
@@ -0,0 +1,416 @@
+// 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 'dart:_foreign_helper' show JS;
+import 'dart:_js_helper'
+    show convertDartClosureToJS, assertInterop, assertInteropArgs, patch;
+import 'dart:collection' show HashMap;
+import 'dart:async' show Completer;
+import 'dart:js_util';
+
+@patch
+dynamic jsify(Object object) {
+  if ((object is! Map) && (object is! Iterable)) {
+    throw ArgumentError("object must be a Map or Iterable");
+  }
+  return _convertDataTree(object);
+}
+
+Object _convertDataTree(Object data) {
+  var _convertedObjects = HashMap.identity();
+
+  Object? _convert(Object? o) {
+    if (_convertedObjects.containsKey(o)) {
+      return _convertedObjects[o];
+    }
+    if (o is Map) {
+      final convertedMap = JS('=Object', '{}');
+      _convertedObjects[o] = convertedMap;
+      for (var key in o.keys) {
+        JS('=Object', '#[#]=#', convertedMap, key, _convert(o[key]));
+      }
+      return convertedMap;
+    } else if (o is Iterable) {
+      var convertedList = [];
+      _convertedObjects[o] = convertedList;
+      convertedList.addAll(o.map(_convert));
+      return convertedList;
+    } else {
+      return o;
+    }
+  }
+
+  return _convert(data)!;
+}
+
+@patch
+@pragma('dart2js:tryInline')
+Object get globalThis => JS('', 'globalThis');
+
+@patch
+T newObject<T>() => JS('=Object', '{}');
+
+@patch
+bool hasProperty(Object o, Object name) => JS('bool', '# in #', name, o);
+
+@patch
+T getProperty<T>(Object o, Object name) =>
+    JS<dynamic>('Object|Null', '#[#]', o, name);
+
+/// Similar to [getProperty] but introduces an unsound implicit cast to `T`.
+T _getPropertyTrustType<T>(Object o, Object name) =>
+    JS<T>('Object|Null', '#[#]', o, name);
+
+@patch
+T setProperty<T>(Object o, Object name, T? value) {
+  assertInterop(value);
+  return JS('', '#[#]=#', o, name, value);
+}
+
+/// Unchecked version of setProperty, only used in a CFE transformation.
+@pragma('dart2js:tryInline')
+T _setPropertyUnchecked<T>(Object o, Object name, T? value) {
+  return JS('', '#[#]=#', o, name, value);
+}
+
+@patch
+T callMethod<T>(Object o, String method, List<Object?> args) {
+  assertInteropArgs(args);
+  return JS<dynamic>('Object|Null', '#[#].apply(#, #)', o, method, o, args);
+}
+
+/// Similar to [callMethod] but introduces an unsound implicit cast to `T`.
+T _callMethodTrustType<T>(Object o, String method, List<Object?> args) {
+  assertInteropArgs(args);
+  return JS<T>('Object|Null', '#[#].apply(#, #)', o, method, o, args);
+}
+
+/// Unchecked version for 0 arguments, only used in a CFE transformation.
+@pragma('dart2js:tryInline')
+T _callMethodUnchecked0<T>(Object o, String method) {
+  return JS<dynamic>('Object|Null', '#[#]()', o, method);
+}
+
+/// Similar to [_callMethodUnchecked] but introduces an unsound implicit cast
+/// to `T`.
+@pragma('dart2js:tryInline')
+T _callMethodUncheckedTrustType0<T>(Object o, String method) {
+  return JS<T>('Object|Null', '#[#]()', o, method);
+}
+
+/// Unchecked version for 1 argument, only used in a CFE transformation.
+@pragma('dart2js:tryInline')
+T _callMethodUnchecked1<T>(Object o, String method, Object? arg1) {
+  return JS<dynamic>('Object|Null', '#[#](#)', o, method, arg1);
+}
+
+/// Similar to [_callMethodUnchecked1] but introduces an unsound implicit cast
+/// to `T`.
+@pragma('dart2js:tryInline')
+T _callMethodUncheckedTrustType1<T>(Object o, String method, Object? arg1) {
+  return JS<T>('Object|Null', '#[#](#)', o, method, arg1);
+}
+
+/// Unchecked version for 2 arguments, only used in a CFE transformation.
+@pragma('dart2js:tryInline')
+T _callMethodUnchecked2<T>(
+    Object o, String method, Object? arg1, Object? arg2) {
+  return JS<dynamic>('Object|Null', '#[#](#, #)', o, method, arg1, arg2);
+}
+
+/// Similar to [_callMethodUnchecked2] but introduces an unsound implicit cast
+/// to `T`.
+@pragma('dart2js:tryInline')
+T _callMethodUncheckedTrustType2<T>(
+    Object o, String method, Object? arg1, Object? arg2) {
+  return JS<T>('Object|Null', '#[#](#, #)', o, method, arg1, arg2);
+}
+
+/// Unchecked version for 3 arguments, only used in a CFE transformation.
+@pragma('dart2js:tryInline')
+T _callMethodUnchecked3<T>(
+    Object o, String method, Object? arg1, Object? arg2, Object? arg3) {
+  return JS<dynamic>(
+      'Object|Null', '#[#](#, #, #)', o, method, arg1, arg2, arg3);
+}
+
+/// Similar to [_callMethodUnchecked3] but introduces an unsound implicit cast
+/// to `T`.
+@pragma('dart2js:tryInline')
+T _callMethodUncheckedTrustType3<T>(
+    Object o, String method, Object? arg1, Object? arg2, Object? arg3) {
+  return JS<T>('Object|Null', '#[#](#, #, #)', o, method, arg1, arg2, arg3);
+}
+
+/// Unchecked version for 4 arguments, only used in a CFE transformation.
+@pragma('dart2js:tryInline')
+T _callMethodUnchecked4<T>(Object o, String method, Object? arg1, Object? arg2,
+    Object? arg3, Object? arg4) {
+  return JS<dynamic>(
+      'Object|Null', '#[#](#, #, #, #)', o, method, arg1, arg2, arg3, arg4);
+}
+
+/// Similar to [_callMethodUnchecked4] but introduces an unsound implicit cast
+/// to `T`.
+@pragma('dart2js:tryInline')
+T _callMethodUncheckedTrustType4<T>(Object o, String method, Object? arg1,
+    Object? arg2, Object? arg3, Object? arg4) {
+  return JS<T>(
+      'Object|Null', '#[#](#, #, #, #)', o, method, arg1, arg2, arg3, arg4);
+}
+
+@patch
+bool instanceof(Object? o, Object type) =>
+    JS('bool', '# instanceof #', o, type);
+
+@patch
+T callConstructor<T>(Object constr, List<Object?>? arguments) {
+  if (arguments == null) {
+    return JS<dynamic>('Object', 'new #()', constr);
+  } else {
+    assertInteropArgs(arguments);
+  }
+
+  if (JS('bool', '# instanceof Array', arguments)) {
+    int argumentCount = JS('int', '#.length', arguments);
+    switch (argumentCount) {
+      case 0:
+        return JS<dynamic>('Object', 'new #()', constr);
+
+      case 1:
+        var arg0 = JS('', '#[0]', arguments);
+        return JS<dynamic>('Object', 'new #(#)', constr, arg0);
+
+      case 2:
+        var arg0 = JS('', '#[0]', arguments);
+        var arg1 = JS('', '#[1]', arguments);
+        return JS<dynamic>('Object', 'new #(#, #)', constr, arg0, arg1);
+
+      case 3:
+        var arg0 = JS('', '#[0]', arguments);
+        var arg1 = JS('', '#[1]', arguments);
+        var arg2 = JS('', '#[2]', arguments);
+        return JS<dynamic>(
+            'Object', 'new #(#, #, #)', constr, arg0, arg1, arg2);
+
+      case 4:
+        var arg0 = JS('', '#[0]', arguments);
+        var arg1 = JS('', '#[1]', arguments);
+        var arg2 = JS('', '#[2]', arguments);
+        var arg3 = JS('', '#[3]', arguments);
+        return JS<dynamic>(
+            'Object', 'new #(#, #, #, #)', constr, arg0, arg1, arg2, arg3);
+    }
+  }
+
+  // The following code solves the problem of invoking a JavaScript
+  // constructor with an unknown number arguments.
+  // First bind the constructor to the argument list using bind.apply().
+  // The first argument to bind() is the binding of 't', so add 'null' to
+  // the arguments list passed to apply().
+  // After that, use the JavaScript 'new' operator which overrides any binding
+  // of 'this' with the new instance.
+  var args = <dynamic>[null]..addAll(arguments);
+  var factoryFunction = JS('', '#.bind.apply(#, #)', constr, constr, args);
+  // Without this line, calling factoryFunction as a constructor throws
+  JS('String', 'String(#)', factoryFunction);
+  // This could return an UnknownJavaScriptObject, or a native
+  // object for which there is an interceptor
+  return JS<dynamic>('Object', 'new #()', factoryFunction);
+
+  // TODO(sra): Investigate:
+  //
+  //     var jsObj = JS('', 'Object.create(#.prototype)', constr);
+  //     JS('', '#.apply(#, #)', constr, jsObj,
+  //         []..addAll(arguments.map(_convertToJS)));
+  //     return _wrapToDart(jsObj);
+}
+
+/// Unchecked version for 0 arguments, only used in a CFE transformation.
+@pragma('dart2js:tryInline')
+T _callConstructorUnchecked0<T>(Object constr) {
+  return JS<dynamic>('Object', 'new #()', constr);
+}
+
+/// Unchecked version for 1 argument, only used in a CFE transformation.
+@pragma('dart2js:tryInline')
+T _callConstructorUnchecked1<T>(Object constr, Object? arg1) {
+  return JS<dynamic>('Object', 'new #(#)', constr, arg1);
+}
+
+/// Unchecked version for 2 arguments, only used in a CFE transformation.
+@pragma('dart2js:tryInline')
+T _callConstructorUnchecked2<T>(Object constr, Object? arg1, Object? arg2) {
+  return JS<dynamic>('Object', 'new #(#, #)', constr, arg1, arg2);
+}
+
+/// Unchecked version for 3 arguments, only used in a CFE transformation.
+@pragma('dart2js:tryInline')
+T _callConstructorUnchecked3<T>(
+    Object constr, Object? arg1, Object? arg2, Object? arg3) {
+  return JS<dynamic>('Object', 'new #(#, #, #)', constr, arg1, arg2, arg3);
+}
+
+/// Unchecked version for 4 arguments, only used in a CFE transformation.
+@pragma('dart2js:tryInline')
+T _callConstructorUnchecked4<T>(
+    Object constr, Object? arg1, Object? arg2, Object? arg3, Object? arg4) {
+  return JS<dynamic>(
+      'Object', 'new #(#, #, #, #)', constr, arg1, arg2, arg3, arg4);
+}
+
+@patch
+@pragma('dart2js:tryInline')
+T add<T>(Object? first, Object? second) {
+  return JS<dynamic>('Object', '# + #', first, second);
+}
+
+@patch
+@pragma('dart2js:tryInline')
+T subtract<T>(Object? first, Object? second) {
+  return JS<dynamic>('Object', '# - #', first, second);
+}
+
+@patch
+@pragma('dart2js:tryInline')
+T multiply<T>(Object? first, Object? second) {
+  return JS<dynamic>('Object', '# * #', first, second);
+}
+
+@patch
+@pragma('dart2js:tryInline')
+T divide<T>(Object? first, Object? second) {
+  return JS<dynamic>('Object', '# / #', first, second);
+}
+
+@patch
+@pragma('dart2js:tryInline')
+T exponentiate<T>(Object? first, Object? second) {
+  return JS<dynamic>('Object', '# ** #', first, second);
+}
+
+@patch
+@pragma('dart2js:tryInline')
+T modulo<T>(Object? first, Object? second) {
+  return JS<dynamic>('Object', '# % #', first, second);
+}
+
+@patch
+@pragma('dart2js:tryInline')
+bool equal<T>(Object? first, Object? second) {
+  return JS<bool>('bool', '# == #', first, second);
+}
+
+@patch
+@pragma('dart2js:tryInline')
+bool strictEqual<T>(Object? first, Object? second) {
+  return JS<bool>('bool', '# === #', first, second);
+}
+
+@patch
+@pragma('dart2js:tryInline')
+bool notEqual<T>(Object? first, Object? second) {
+  return JS<bool>('bool', '# != #', first, second);
+}
+
+@patch
+@pragma('dart2js:tryInline')
+bool strictNotEqual<T>(Object? first, Object? second) {
+  return JS<bool>('bool', '# !== #', first, second);
+}
+
+@patch
+@pragma('dart2js:tryInline')
+bool greaterThan<T>(Object? first, Object? second) {
+  return JS<bool>('bool', '# > #', first, second);
+}
+
+@patch
+@pragma('dart2js:tryInline')
+bool greaterThanOrEqual<T>(Object? first, Object? second) {
+  return JS<bool>('bool', '# >= #', first, second);
+}
+
+@patch
+@pragma('dart2js:tryInline')
+bool lessThan<T>(Object? first, Object? second) {
+  return JS<bool>('bool', '# < #', first, second);
+}
+
+@patch
+@pragma('dart2js:tryInline')
+bool lessThanOrEqual<T>(Object? first, Object? second) {
+  return JS<bool>('bool', '# <= #', first, second);
+}
+
+@patch
+Future<T> promiseToFuture<T>(Object jsPromise) {
+  final completer = Completer<T>();
+
+  final success = convertDartClosureToJS((r) => completer.complete(r), 1);
+  final error = convertDartClosureToJS((e) {
+    // Note that `completeError` expects a non-nullable error regardless of
+    // whether null-safety is enabled, so a `NullRejectionException` is always
+    // provided if the error is `null` or `undefined`.
+    if (e == null) {
+      return completer.completeError(
+          NullRejectionException._(JS('bool', '# === undefined', e)));
+    }
+    return completer.completeError(e);
+  }, 1);
+
+  JS('', '#.then(#, #)', jsPromise, success, error);
+  return completer.future;
+}
+
+@patch
+Object? objectGetPrototypeOf(Object? object) =>
+    JS('', 'Object.getPrototypeOf(#)', object);
+
+@patch
+Object? get objectPrototype => JS('', 'Object.prototype');
+
+@patch
+List<Object?> objectKeys(Object? object) => JS('', 'Object.keys(#)', object);
+
+@patch
+Object? dartify(Object? o) {
+  var _convertedObjects = HashMap.identity();
+  Object? convert() {
+    if (_convertedObjects.containsKey(o)) {
+      return _convertedObjects[o];
+    }
+    if (o == null || o is bool || o is num || o is String) return o;
+    if (isJavaScriptSimpleObject(o)) {
+      Map<Object?, Object?> dartObject = {};
+      _convertedObjects[o] = dartObject;
+      List<Object?> originalKeys = objectKeys(o);
+      List<Object?> dartKeys = [];
+      for (Object? key in originalKeys) {
+        dartKeys.add(dartify(key));
+      }
+      for (int i = 0; i < originalKeys.length; i++) {
+        Object? jsKey = originalKeys[i];
+        Object? dartKey = dartKeys[i];
+        if (jsKey != null) {
+          dartObject[dartKey] = dartify(getProperty(o, jsKey));
+        }
+      }
+      return dartObject;
+    }
+    if (isJavaScriptArray(o)) {
+      List<Object?> dartObject = [];
+      _convertedObjects[o] = dartObject;
+      int length = getProperty(o, 'length');
+      for (int i = 0; i < length; i++) {
+        dartObject.add(dartify(getProperty(o, i)));
+      }
+      return dartObject;
+    }
+    throw ArgumentError(
+        "JavaScriptObject $o must be a primitive, simple object, or array");
+  }
+
+  return convert();
+}
diff --git a/sdk/lib/_internal/js_shared/lib/synced/embedded_names.dart b/sdk/lib/_internal/js_shared/lib/synced/embedded_names.dart
index c2f6307..1e3317e 100644
--- a/sdk/lib/_internal/js_shared/lib/synced/embedded_names.dart
+++ b/sdk/lib/_internal/js_shared/lib/synced/embedded_names.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.
 
-// @dart=2.12
-
 /// A 'Universe' object used by 'dart:_rti'.
 const RTI_UNIVERSE = 'typeUniverse';
 
diff --git a/sdk/lib/_internal/js_shared/lib/synced/recipe_syntax.dart b/sdk/lib/_internal/js_shared/lib/synced/recipe_syntax.dart
index 3ccec60..b24e7c2 100644
--- a/sdk/lib/_internal/js_shared/lib/synced/recipe_syntax.dart
+++ b/sdk/lib/_internal/js_shared/lib/synced/recipe_syntax.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.
 
-// @dart=2.12
-
 /// Constants and predicates used for encoding and decoding type recipes.
 ///
 /// This library is synchronized between the compiler and the runtime system.
diff --git a/sdk/lib/_internal/vm/bin/socket_patch.dart b/sdk/lib/_internal/vm/bin/socket_patch.dart
index d0bddf8..a70896e 100644
--- a/sdk/lib/_internal/vm/bin/socket_patch.dart
+++ b/sdk/lib/_internal/vm/bin/socket_patch.dart
@@ -2543,6 +2543,7 @@
 }
 
 @patch
+@pragma("vm:entry-point")
 class ResourceHandle {
   factory ResourceHandle.fromFile(RandomAccessFile file) {
     int fd = (file as _RandomAccessFile).fd;
diff --git a/sdk/lib/js_util/js_util.dart b/sdk/lib/js_util/js_util.dart
index 0f57f47..301f486 100644
--- a/sdk/lib/js_util/js_util.dart
+++ b/sdk/lib/js_util/js_util.dart
@@ -11,12 +11,6 @@
 /// {@category Web}
 library dart.js_util;
 
-import 'dart:_foreign_helper' show JS;
-import 'dart:collection' show HashMap;
-import 'dart:async' show Completer;
-import 'dart:_js_helper'
-    show convertDartClosureToJS, assertInterop, assertInteropArgs;
-
 // Examples can assume:
 // class JS { const JS(); }
 // class Promise<T> {}
@@ -34,340 +28,74 @@
 /// converted into arrays. Strings, numbers, bools, and `@JS()` annotated
 /// objects are passed through unmodified. Dart objects are also passed through
 /// unmodified, but their members aren't usable from JavaScript.
-dynamic jsify(Object object) {
-  if ((object is! Map) && (object is! Iterable)) {
-    throw ArgumentError("object must be a Map or Iterable");
-  }
-  return _convertDataTree(object);
-}
+external dynamic jsify(Object object);
 
-Object _convertDataTree(Object data) {
-  var _convertedObjects = HashMap.identity();
+external Object get globalThis;
 
-  Object? _convert(Object? o) {
-    if (_convertedObjects.containsKey(o)) {
-      return _convertedObjects[o];
-    }
-    if (o is Map) {
-      final convertedMap = JS('=Object', '{}');
-      _convertedObjects[o] = convertedMap;
-      for (var key in o.keys) {
-        JS('=Object', '#[#]=#', convertedMap, key, _convert(o[key]));
-      }
-      return convertedMap;
-    } else if (o is Iterable) {
-      var convertedList = [];
-      _convertedObjects[o] = convertedList;
-      convertedList.addAll(o.map(_convert));
-      return convertedList;
-    } else {
-      return o;
-    }
-  }
+external T newObject<T>();
 
-  return _convert(data)!;
-}
+external bool hasProperty(Object o, Object name);
 
-@pragma('dart2js:tryInline')
-Object get globalThis => JS('', 'globalThis');
-
-T newObject<T>() => JS('=Object', '{}');
-
-bool hasProperty(Object o, Object name) => JS('bool', '# in #', name, o);
-
-T getProperty<T>(Object o, Object name) =>
-    JS<dynamic>('Object|Null', '#[#]', o, name);
-
-/// Similar to [getProperty] but introduces an unsound implicit cast to `T`.
-T _getPropertyTrustType<T>(Object o, Object name) =>
-    JS<T>('Object|Null', '#[#]', o, name);
+external T getProperty<T>(Object o, Object name);
 
 // A CFE transformation may optimize calls to `setProperty`, when [value] is
 // statically known to be a non-function.
-T setProperty<T>(Object o, Object name, T? value) {
-  assertInterop(value);
-  return JS('', '#[#]=#', o, name, value);
-}
-
-/// Unchecked version of setProperty, only used in a CFE transformation.
-@pragma('dart2js:tryInline')
-T _setPropertyUnchecked<T>(Object o, Object name, T? value) {
-  return JS('', '#[#]=#', o, name, value);
-}
+external T setProperty<T>(Object o, Object name, T? value);
 
 // A CFE transformation may optimize calls to `callMethod` when [args] is a
 // a list literal or const list containing at most 4 values, all of which are
 // statically known to be non-functions.
-T callMethod<T>(Object o, String method, List<Object?> args) {
-  assertInteropArgs(args);
-  return JS<dynamic>('Object|Null', '#[#].apply(#, #)', o, method, o, args);
-}
-
-/// Similar to [callMethod] but introduces an unsound implicit cast to `T`.
-T _callMethodTrustType<T>(Object o, String method, List<Object?> args) {
-  assertInteropArgs(args);
-  return JS<T>('Object|Null', '#[#].apply(#, #)', o, method, o, args);
-}
-
-/// Unchecked version for 0 arguments, only used in a CFE transformation.
-@pragma('dart2js:tryInline')
-T _callMethodUnchecked0<T>(Object o, String method) {
-  return JS<dynamic>('Object|Null', '#[#]()', o, method);
-}
-
-/// Similar to [_callMethodUnchecked] but introduces an unsound implicit cast
-/// to `T`.
-@pragma('dart2js:tryInline')
-T _callMethodUncheckedTrustType0<T>(Object o, String method) {
-  return JS<T>('Object|Null', '#[#]()', o, method);
-}
-
-/// Unchecked version for 1 argument, only used in a CFE transformation.
-@pragma('dart2js:tryInline')
-T _callMethodUnchecked1<T>(Object o, String method, Object? arg1) {
-  return JS<dynamic>('Object|Null', '#[#](#)', o, method, arg1);
-}
-
-/// Similar to [_callMethodUnchecked1] but introduces an unsound implicit cast
-/// to `T`.
-@pragma('dart2js:tryInline')
-T _callMethodUncheckedTrustType1<T>(Object o, String method, Object? arg1) {
-  return JS<T>('Object|Null', '#[#](#)', o, method, arg1);
-}
-
-/// Unchecked version for 2 arguments, only used in a CFE transformation.
-@pragma('dart2js:tryInline')
-T _callMethodUnchecked2<T>(
-    Object o, String method, Object? arg1, Object? arg2) {
-  return JS<dynamic>('Object|Null', '#[#](#, #)', o, method, arg1, arg2);
-}
-
-/// Similar to [_callMethodUnchecked2] but introduces an unsound implicit cast
-/// to `T`.
-@pragma('dart2js:tryInline')
-T _callMethodUncheckedTrustType2<T>(
-    Object o, String method, Object? arg1, Object? arg2) {
-  return JS<T>('Object|Null', '#[#](#, #)', o, method, arg1, arg2);
-}
-
-/// Unchecked version for 3 arguments, only used in a CFE transformation.
-@pragma('dart2js:tryInline')
-T _callMethodUnchecked3<T>(
-    Object o, String method, Object? arg1, Object? arg2, Object? arg3) {
-  return JS<dynamic>(
-      'Object|Null', '#[#](#, #, #)', o, method, arg1, arg2, arg3);
-}
-
-/// Similar to [_callMethodUnchecked3] but introduces an unsound implicit cast
-/// to `T`.
-@pragma('dart2js:tryInline')
-T _callMethodUncheckedTrustType3<T>(
-    Object o, String method, Object? arg1, Object? arg2, Object? arg3) {
-  return JS<T>('Object|Null', '#[#](#, #, #)', o, method, arg1, arg2, arg3);
-}
-
-/// Unchecked version for 4 arguments, only used in a CFE transformation.
-@pragma('dart2js:tryInline')
-T _callMethodUnchecked4<T>(Object o, String method, Object? arg1, Object? arg2,
-    Object? arg3, Object? arg4) {
-  return JS<dynamic>(
-      'Object|Null', '#[#](#, #, #, #)', o, method, arg1, arg2, arg3, arg4);
-}
-
-/// Similar to [_callMethodUnchecked4] but introduces an unsound implicit cast
-/// to `T`.
-@pragma('dart2js:tryInline')
-T _callMethodUncheckedTrustType4<T>(Object o, String method, Object? arg1,
-    Object? arg2, Object? arg3, Object? arg4) {
-  return JS<T>(
-      'Object|Null', '#[#](#, #, #, #)', o, method, arg1, arg2, arg3, arg4);
-}
+external T callMethod<T>(Object o, String method, List<Object?> args);
 
 /// Check whether [o] is an instance of [type].
 ///
 /// The value in [type] is expected to be a JS-interop object that
 /// represents a valid JavaScript constructor function.
-bool instanceof(Object? o, Object type) =>
-    JS('bool', '# instanceof #', o, type);
+external bool instanceof(Object? o, Object type);
 
-T callConstructor<T>(Object constr, List<Object?>? arguments) {
-  if (arguments == null) {
-    return JS<dynamic>('Object', 'new #()', constr);
-  } else {
-    assertInteropArgs(arguments);
-  }
-
-  if (JS('bool', '# instanceof Array', arguments)) {
-    int argumentCount = JS('int', '#.length', arguments);
-    switch (argumentCount) {
-      case 0:
-        return JS<dynamic>('Object', 'new #()', constr);
-
-      case 1:
-        var arg0 = JS('', '#[0]', arguments);
-        return JS<dynamic>('Object', 'new #(#)', constr, arg0);
-
-      case 2:
-        var arg0 = JS('', '#[0]', arguments);
-        var arg1 = JS('', '#[1]', arguments);
-        return JS<dynamic>('Object', 'new #(#, #)', constr, arg0, arg1);
-
-      case 3:
-        var arg0 = JS('', '#[0]', arguments);
-        var arg1 = JS('', '#[1]', arguments);
-        var arg2 = JS('', '#[2]', arguments);
-        return JS<dynamic>(
-            'Object', 'new #(#, #, #)', constr, arg0, arg1, arg2);
-
-      case 4:
-        var arg0 = JS('', '#[0]', arguments);
-        var arg1 = JS('', '#[1]', arguments);
-        var arg2 = JS('', '#[2]', arguments);
-        var arg3 = JS('', '#[3]', arguments);
-        return JS<dynamic>(
-            'Object', 'new #(#, #, #, #)', constr, arg0, arg1, arg2, arg3);
-    }
-  }
-
-  // The following code solves the problem of invoking a JavaScript
-  // constructor with an unknown number arguments.
-  // First bind the constructor to the argument list using bind.apply().
-  // The first argument to bind() is the binding of 't', so add 'null' to
-  // the arguments list passed to apply().
-  // After that, use the JavaScript 'new' operator which overrides any binding
-  // of 'this' with the new instance.
-  var args = <dynamic>[null]..addAll(arguments);
-  var factoryFunction = JS('', '#.bind.apply(#, #)', constr, constr, args);
-  // Without this line, calling factoryFunction as a constructor throws
-  JS('String', 'String(#)', factoryFunction);
-  // This could return an UnknownJavaScriptObject, or a native
-  // object for which there is an interceptor
-  return JS<dynamic>('Object', 'new #()', factoryFunction);
-
-  // TODO(sra): Investigate:
-  //
-  //     var jsObj = JS('', 'Object.create(#.prototype)', constr);
-  //     JS('', '#.apply(#, #)', constr, jsObj,
-  //         []..addAll(arguments.map(_convertToJS)));
-  //     return _wrapToDart(jsObj);
-}
-
-/// Unchecked version for 0 arguments, only used in a CFE transformation.
-@pragma('dart2js:tryInline')
-T _callConstructorUnchecked0<T>(Object constr) {
-  return JS<dynamic>('Object', 'new #()', constr);
-}
-
-/// Unchecked version for 1 argument, only used in a CFE transformation.
-@pragma('dart2js:tryInline')
-T _callConstructorUnchecked1<T>(Object constr, Object? arg1) {
-  return JS<dynamic>('Object', 'new #(#)', constr, arg1);
-}
-
-/// Unchecked version for 2 arguments, only used in a CFE transformation.
-@pragma('dart2js:tryInline')
-T _callConstructorUnchecked2<T>(Object constr, Object? arg1, Object? arg2) {
-  return JS<dynamic>('Object', 'new #(#, #)', constr, arg1, arg2);
-}
-
-/// Unchecked version for 3 arguments, only used in a CFE transformation.
-@pragma('dart2js:tryInline')
-T _callConstructorUnchecked3<T>(
-    Object constr, Object? arg1, Object? arg2, Object? arg3) {
-  return JS<dynamic>('Object', 'new #(#, #, #)', constr, arg1, arg2, arg3);
-}
-
-/// Unchecked version for 4 arguments, only used in a CFE transformation.
-@pragma('dart2js:tryInline')
-T _callConstructorUnchecked4<T>(
-    Object constr, Object? arg1, Object? arg2, Object? arg3, Object? arg4) {
-  return JS<dynamic>(
-      'Object', 'new #(#, #, #, #)', constr, arg1, arg2, arg3, arg4);
-}
+external T callConstructor<T>(Object constr, List<Object?>? arguments);
 
 /// Perform JavaScript addition (`+`) on two values.
-@pragma('dart2js:tryInline')
-T add<T>(Object? first, Object? second) {
-  return JS<dynamic>('Object', '# + #', first, second);
-}
+external T add<T>(Object? first, Object? second);
 
 /// Perform JavaScript subtraction (`-`) on two values.
-@pragma('dart2js:tryInline')
-T subtract<T>(Object? first, Object? second) {
-  return JS<dynamic>('Object', '# - #', first, second);
-}
+external T subtract<T>(Object? first, Object? second);
 
 /// Perform JavaScript multiplication (`*`) on two values.
-@pragma('dart2js:tryInline')
-T multiply<T>(Object? first, Object? second) {
-  return JS<dynamic>('Object', '# * #', first, second);
-}
+external T multiply<T>(Object? first, Object? second);
 
 /// Perform JavaScript division (`/`) on two values.
-@pragma('dart2js:tryInline')
-T divide<T>(Object? first, Object? second) {
-  return JS<dynamic>('Object', '# / #', first, second);
-}
+external T divide<T>(Object? first, Object? second);
 
 /// Perform JavaScript exponentiation (`**`) on two values.
-@pragma('dart2js:tryInline')
-T exponentiate<T>(Object? first, Object? second) {
-  return JS<dynamic>('Object', '# ** #', first, second);
-}
+external T exponentiate<T>(Object? first, Object? second);
 
 /// Perform JavaScript remainder (`%`) on two values.
-@pragma('dart2js:tryInline')
-T modulo<T>(Object? first, Object? second) {
-  return JS<dynamic>('Object', '# % #', first, second);
-}
+external T modulo<T>(Object? first, Object? second);
 
 /// Perform JavaScript equality comparison (`==`) on two values.
-@pragma('dart2js:tryInline')
-bool equal<T>(Object? first, Object? second) {
-  return JS<bool>('bool', '# == #', first, second);
-}
+external bool equal<T>(Object? first, Object? second);
 
 /// Perform JavaScript strict equality comparison (`===`) on two values.
-@pragma('dart2js:tryInline')
-bool strictEqual<T>(Object? first, Object? second) {
-  return JS<bool>('bool', '# === #', first, second);
-}
+external bool strictEqual<T>(Object? first, Object? second);
 
 /// Perform JavaScript inequality comparison (`!=`) on two values.
-@pragma('dart2js:tryInline')
-bool notEqual<T>(Object? first, Object? second) {
-  return JS<bool>('bool', '# != #', first, second);
-}
+external bool notEqual<T>(Object? first, Object? second);
 
 /// Perform JavaScript strict inequality comparison (`!==`) on two values.
-@pragma('dart2js:tryInline')
-bool strictNotEqual<T>(Object? first, Object? second) {
-  return JS<bool>('bool', '# !== #', first, second);
-}
+external bool strictNotEqual<T>(Object? first, Object? second);
 
 /// Perform JavaScript greater than comparison (`>`) of two values.
-@pragma('dart2js:tryInline')
-bool greaterThan<T>(Object? first, Object? second) {
-  return JS<bool>('bool', '# > #', first, second);
-}
+external bool greaterThan<T>(Object? first, Object? second);
 
 /// Perform JavaScript greater than or equal comparison (`>=`) of two values.
-@pragma('dart2js:tryInline')
-bool greaterThanOrEqual<T>(Object? first, Object? second) {
-  return JS<bool>('bool', '# >= #', first, second);
-}
+external bool greaterThanOrEqual<T>(Object? first, Object? second);
 
 /// Perform JavaScript less than comparison (`<`) of two values.
-@pragma('dart2js:tryInline')
-bool lessThan<T>(Object? first, Object? second) {
-  return JS<bool>('bool', '# < #', first, second);
-}
+external bool lessThan<T>(Object? first, Object? second);
 
 /// Perform JavaScript less than or equal comparison (`<=`) of two values.
-@pragma('dart2js:tryInline')
-bool lessThanOrEqual<T>(Object? first, Object? second) {
-  return JS<bool>('bool', '# <= #', first, second);
-}
+external bool lessThanOrEqual<T>(Object? first, Object? second);
 
 /// Exception for when the promise is rejected with a `null` or `undefined`
 /// value.
@@ -399,24 +127,7 @@
 ///   final three = await threeFuture; // == 3
 /// }
 /// ```
-Future<T> promiseToFuture<T>(Object jsPromise) {
-  final completer = Completer<T>();
-
-  final success = convertDartClosureToJS((r) => completer.complete(r), 1);
-  final error = convertDartClosureToJS((e) {
-    // Note that `completeError` expects a non-nullable error regardless of
-    // whether null-safety is enabled, so a `NullRejectionException` is always
-    // provided if the error is `null` or `undefined`.
-    if (e == null) {
-      return completer.completeError(
-          NullRejectionException._(JS('bool', '# === undefined', e)));
-    }
-    return completer.completeError(e);
-  }, 1);
-
-  JS('', '#.then(#, #)', jsPromise, success, error);
-  return completer.future;
-}
+external Future<T> promiseToFuture<T>(Object jsPromise);
 
 Object? _getConstructor(String constructorName) =>
     getProperty(globalThis, constructorName);
@@ -430,14 +141,13 @@
 
 /// Returns the prototype of a given object. Equivalent to
 /// `Object.getPrototypeOf`.
-Object? objectGetPrototypeOf(Object? object) =>
-    JS('', 'Object.getPrototypeOf(#)', object);
+external Object? objectGetPrototypeOf(Object? object);
 
 /// Returns the `Object` prototype. Equivalent to `Object.prototype`.
-Object? get objectPrototype => JS('', 'Object.prototype');
+external Object? get objectPrototype;
 
 /// Returns the keys for a given object. Equivalent to `Object.keys(object)`.
-List<Object?> objectKeys(Object? object) => JS('', 'Object.keys(#)', object);
+external List<Object?> objectKeys(Object? object);
 
 /// Returns `true` if a given object is a JavaScript array.
 bool isJavaScriptArray(value) => instanceOfString(value, 'Array');
@@ -451,42 +161,4 @@
 /// Effectively the inverse of [jsify], [dartify] Takes a JavaScript object, and
 /// converts it to a Dart based object. Only JS primitives, arrays, or 'map'
 /// like JS objects are supported.
-Object? dartify(Object? o) {
-  var _convertedObjects = HashMap.identity();
-  Object? convert() {
-    if (_convertedObjects.containsKey(o)) {
-      return _convertedObjects[o];
-    }
-    if (o == null || o is bool || o is num || o is String) return o;
-    if (isJavaScriptSimpleObject(o)) {
-      Map<Object?, Object?> dartObject = {};
-      _convertedObjects[o] = dartObject;
-      List<Object?> originalKeys = objectKeys(o);
-      List<Object?> dartKeys = [];
-      for (Object? key in originalKeys) {
-        dartKeys.add(dartify(key));
-      }
-      for (int i = 0; i < originalKeys.length; i++) {
-        Object? jsKey = originalKeys[i];
-        Object? dartKey = dartKeys[i];
-        if (jsKey != null) {
-          dartObject[dartKey] = dartify(getProperty(o, jsKey));
-        }
-      }
-      return dartObject;
-    }
-    if (isJavaScriptArray(o)) {
-      List<Object?> dartObject = [];
-      _convertedObjects[o] = dartObject;
-      int length = getProperty(o, 'length');
-      for (int i = 0; i < length; i++) {
-        dartObject.add(dartify(getProperty(o, i)));
-      }
-      return dartObject;
-    }
-    throw ArgumentError(
-        "JavaScriptObject $o must be a primitive, simple object, or array");
-  }
-
-  return convert();
-}
+external Object? dartify(Object? o);
diff --git a/sdk/lib/libraries.json b/sdk/lib/libraries.json
index 4c5eb19..8da8878 100644
--- a/sdk/lib/libraries.json
+++ b/sdk/lib/libraries.json
@@ -342,7 +342,8 @@
         "uri": "js/_js_annotations.dart"
       },
       "js_util": {
-        "uri": "js_util/js_util.dart"
+        "uri": "js_util/js_util.dart",
+        "patches": "_internal/js_shared/lib/js_util_patch.dart"
       },
       "math": {
         "uri": "math/math.dart",
@@ -424,9 +425,15 @@
       "_js_annotations": {
         "uri": "js/_js_annotations.dart"
       },
+      "_js_shared_embedded_names": {
+        "uri": "_internal/js_shared/lib/synced/embedded_names.dart"
+      },
       "_js_helper": {
         "uri": "_internal/js_dev_runtime/private/js_helper.dart"
       },
+      "_js_names": {
+        "uri": "_internal/js_dev_runtime/private/js_names.dart"
+      },
       "_js_primitives": {
         "uri": "_internal/js_dev_runtime/private/js_primitives.dart"
       },
@@ -439,6 +446,12 @@
       "_dart2js_runtime_metrics": {
         "uri": "_internal/js_dev_runtime/private/runtime_metrics.dart"
       },
+      "_rti": {
+        "uri": "_internal/js_shared/lib/rti.dart"
+      },
+      "_recipe_syntax": {
+        "uri": "_internal/js_shared/lib/synced/recipe_syntax.dart"
+      },
       "async": {
         "uri": "async/async.dart",
         "patches": "_internal/js_dev_runtime/patch/async_patch.dart"
@@ -491,7 +504,8 @@
         "patches": "_internal/js_dev_runtime/patch/js_patch.dart"
       },
       "js_util": {
-        "uri": "js_util/js_util.dart"
+        "uri": "js_util/js_util.dart",
+        "patches": "_internal/js_shared/lib/js_util_patch.dart"
       },
       "svg": {
         "uri": "svg/dart2js/svg_dart2js.dart"
diff --git a/sdk/lib/libraries.yaml b/sdk/lib/libraries.yaml
index c09c34e..fea4da3 100644
--- a/sdk/lib/libraries.yaml
+++ b/sdk/lib/libraries.yaml
@@ -311,6 +311,7 @@
 
     js_util:
       uri: "js_util/js_util.dart"
+      patches: "_internal/js_shared/lib/js_util_patch.dart"
 
     math:
       uri: "math/math.dart"
@@ -390,9 +391,15 @@
       _js_annotations:
         uri: "js/_js_annotations.dart"
 
+      _js_shared_embedded_names:
+        uri: "_internal/js_shared/lib/synced/embedded_names.dart"
+
       _js_helper:
         uri: "_internal/js_dev_runtime/private/js_helper.dart"
 
+      _js_names:
+        uri: "_internal/js_dev_runtime/private/js_names.dart"
+
       _js_primitives:
         uri: "_internal/js_dev_runtime/private/js_primitives.dart"
 
@@ -405,6 +412,12 @@
       _dart2js_runtime_metrics:
         uri: "_internal/js_dev_runtime/private/runtime_metrics.dart"
 
+      _rti:
+        uri: "_internal/js_shared/lib/rti.dart"
+
+      _recipe_syntax:
+        uri: "_internal/js_shared/lib/synced/recipe_syntax.dart"
+
       async:
         uri: "async/async.dart"
         patches: "_internal/js_dev_runtime/patch/async_patch.dart"
@@ -458,6 +471,7 @@
 
       js_util:
         uri: "js_util/js_util.dart"
+        patches: "_internal/js_shared/lib/js_util_patch.dart"
 
       svg:
         uri: "svg/dart2js/svg_dart2js.dart"
diff --git a/tests/corelib/bigint_sll_test.dart b/tests/corelib/bigint_sll_test.dart
index 082c810..05be056 100644
--- a/tests/corelib/bigint_sll_test.dart
+++ b/tests/corelib/bigint_sll_test.dart
@@ -39,6 +39,12 @@
       "d87becaa3701c97b31b5b8084f2b5b34e78570920000000000000000");
   expectShifted("d87becaa3701c97b31b5b8084f2b5b34e7857092", 65,
       "1b0f7d9546e0392f6636b70109e56b669cf0ae1240000000000000000");
+  expectShifted("d87becaa3701c97b31b5b8084f2b5b34e7857092", 127,
+      "6c3df6551b80e4bd98dadc042795ad9a73c2b84900000000000000000000000000000000");
+  expectShifted("d87becaa3701c97b31b5b8084f2b5b34e7857092", 128,
+      "d87becaa3701c97b31b5b8084f2b5b34e785709200000000000000000000000000000000");
+  expectShifted("d87becaa3701c97b31b5b8084f2b5b34e7857092", 129,
+      "1b0f7d9546e0392f6636b70109e56b669cf0ae12400000000000000000000000000000000");
 
   expectShifted("-d87becaa3701c97b31b5b8084f2b5b34e7857092", 0,
       "-d87becaa3701c97b31b5b8084f2b5b34e7857092");
@@ -58,4 +64,10 @@
       "-d87becaa3701c97b31b5b8084f2b5b34e78570920000000000000000");
   expectShifted("-d87becaa3701c97b31b5b8084f2b5b34e7857092", 65,
       "-1b0f7d9546e0392f6636b70109e56b669cf0ae1240000000000000000");
+  expectShifted("-d87becaa3701c97b31b5b8084f2b5b34e7857092", 127,
+      "-6c3df6551b80e4bd98dadc042795ad9a73c2b84900000000000000000000000000000000");
+  expectShifted("-d87becaa3701c97b31b5b8084f2b5b34e7857092", 128,
+      "-d87becaa3701c97b31b5b8084f2b5b34e785709200000000000000000000000000000000");
+  expectShifted("-d87becaa3701c97b31b5b8084f2b5b34e7857092", 129,
+      "-1b0f7d9546e0392f6636b70109e56b669cf0ae12400000000000000000000000000000000");
 }
diff --git a/tests/corelib/bigint_sra_test.dart b/tests/corelib/bigint_sra_test.dart
index a7d073a..dafe197 100644
--- a/tests/corelib/bigint_sra_test.dart
+++ b/tests/corelib/bigint_sra_test.dart
@@ -39,6 +39,9 @@
       "d87becaa3701c97b31b5b808");
   expectShifted("d87becaa3701c97b31b5b8084f2b5b34e7857092", 65,
       "6c3df6551b80e4bd98dadc04");
+  expectShifted("d87becaa3701c97b31b5b8084f2b5b34e7857092", 127, "1b0f7d954");
+  expectShifted("d87becaa3701c97b31b5b8084f2b5b34e7857092", 128, "d87becaa");
+  expectShifted("d87becaa3701c97b31b5b8084f2b5b34e7857092", 129, "6c3df655");
 
   expectShifted("-d87becaa3701c97b31b5b8084f2b5b34e7857092", 0,
       "-d87becaa3701c97b31b5b8084f2b5b34e7857092");
@@ -58,4 +61,7 @@
       "-d87becaa3701c97b31b5b809");
   expectShifted("-d87becaa3701c97b31b5b8084f2b5b34e7857092", 65,
       "-6c3df6551b80e4bd98dadc05");
+  expectShifted("-d87becaa3701c97b31b5b8084f2b5b34e7857092", 127, "-1b0f7d955");
+  expectShifted("-d87becaa3701c97b31b5b8084f2b5b34e7857092", 128, "-d87becab");
+  expectShifted("-d87becaa3701c97b31b5b8084f2b5b34e7857092", 129, "-6c3df656");
 }
diff --git a/tests/corelib/iterable_empty_test.dart b/tests/corelib/iterable_empty_test.dart
index 7d26088..84749ce 100644
--- a/tests/corelib/iterable_empty_test.dart
+++ b/tests/corelib/iterable_empty_test.dart
@@ -18,7 +18,7 @@
     Expect.throwsRangeError(() => it.elementAt(0), name);
     Expect.throwsStateError(() => it.reduce((a, b) => a), name);
     Expect.throwsStateError(() => it.singleWhere((_) => true), name);
-    Expect.equals(42, it.fold(42, (a, b) => "not 42"), name);
+    Expect.equals(42, it.fold<dynamic>(42, (a, b) => "not 42"), name);
     Expect.equals(42, it.firstWhere((v) => true, orElse: () => 42), name);
     Expect.equals(42, it.lastWhere((v) => true, orElse: () => 42), name);
     Expect.equals("", it.join("separator"), name);
diff --git a/tests/corelib_2/bigint_sll_test.dart b/tests/corelib_2/bigint_sll_test.dart
index 551f85f..9f00fd4 100644
--- a/tests/corelib_2/bigint_sll_test.dart
+++ b/tests/corelib_2/bigint_sll_test.dart
@@ -41,6 +41,12 @@
       "d87becaa3701c97b31b5b8084f2b5b34e78570920000000000000000");
   expectShifted("d87becaa3701c97b31b5b8084f2b5b34e7857092", 65,
       "1b0f7d9546e0392f6636b70109e56b669cf0ae1240000000000000000");
+  expectShifted("d87becaa3701c97b31b5b8084f2b5b34e7857092", 127,
+      "6c3df6551b80e4bd98dadc042795ad9a73c2b84900000000000000000000000000000000");
+  expectShifted("d87becaa3701c97b31b5b8084f2b5b34e7857092", 128,
+      "d87becaa3701c97b31b5b8084f2b5b34e785709200000000000000000000000000000000");
+  expectShifted("d87becaa3701c97b31b5b8084f2b5b34e7857092", 129,
+      "1b0f7d9546e0392f6636b70109e56b669cf0ae12400000000000000000000000000000000");
 
   expectShifted("-d87becaa3701c97b31b5b8084f2b5b34e7857092", 0,
       "-d87becaa3701c97b31b5b8084f2b5b34e7857092");
@@ -60,4 +66,10 @@
       "-d87becaa3701c97b31b5b8084f2b5b34e78570920000000000000000");
   expectShifted("-d87becaa3701c97b31b5b8084f2b5b34e7857092", 65,
       "-1b0f7d9546e0392f6636b70109e56b669cf0ae1240000000000000000");
+  expectShifted("-d87becaa3701c97b31b5b8084f2b5b34e7857092", 127,
+      "-6c3df6551b80e4bd98dadc042795ad9a73c2b84900000000000000000000000000000000");
+  expectShifted("-d87becaa3701c97b31b5b8084f2b5b34e7857092", 128,
+      "-d87becaa3701c97b31b5b8084f2b5b34e785709200000000000000000000000000000000");
+  expectShifted("-d87becaa3701c97b31b5b8084f2b5b34e7857092", 129,
+      "-1b0f7d9546e0392f6636b70109e56b669cf0ae12400000000000000000000000000000000");
 }
diff --git a/tests/corelib_2/bigint_sra_test.dart b/tests/corelib_2/bigint_sra_test.dart
index 84f35f3..e4d8966 100644
--- a/tests/corelib_2/bigint_sra_test.dart
+++ b/tests/corelib_2/bigint_sra_test.dart
@@ -41,6 +41,9 @@
       "d87becaa3701c97b31b5b808");
   expectShifted("d87becaa3701c97b31b5b8084f2b5b34e7857092", 65,
       "6c3df6551b80e4bd98dadc04");
+  expectShifted("d87becaa3701c97b31b5b8084f2b5b34e7857092", 127, "1b0f7d954");
+  expectShifted("d87becaa3701c97b31b5b8084f2b5b34e7857092", 128, "d87becaa");
+  expectShifted("d87becaa3701c97b31b5b8084f2b5b34e7857092", 129, "6c3df655");
 
   expectShifted("-d87becaa3701c97b31b5b8084f2b5b34e7857092", 0,
       "-d87becaa3701c97b31b5b8084f2b5b34e7857092");
@@ -60,4 +63,7 @@
       "-d87becaa3701c97b31b5b809");
   expectShifted("-d87becaa3701c97b31b5b8084f2b5b34e7857092", 65,
       "-6c3df6551b80e4bd98dadc05");
+  expectShifted("-d87becaa3701c97b31b5b8084f2b5b34e7857092", 127, "-1b0f7d955");
+  expectShifted("-d87becaa3701c97b31b5b8084f2b5b34e7857092", 128, "-d87becab");
+  expectShifted("-d87becaa3701c97b31b5b8084f2b5b34e7857092", 129, "-6c3df656");
 }
diff --git a/tools/FAKE_COMMITS b/tools/FAKE_COMMITS
index b709239..b75d4b3 100644
--- a/tools/FAKE_COMMITS
+++ b/tools/FAKE_COMMITS
@@ -34,6 +34,7 @@
 Trigger builds to check recipe changes
 Trigger builds to check recipe changes
 Trigger builds to test builder configuration change
+Trigger mac builds now that the snoopy service is installed
 
 Analyzer branch commits:
 Force build on new analyzer-branch linux build with new workflow
diff --git a/tools/VERSION b/tools/VERSION
index 9bcf7ac..e8c8999 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 18
 PATCH 0
-PRERELEASE 149
+PRERELEASE 150
 PRERELEASE_PATCH 0
\ No newline at end of file
diff --git a/tools/experimental_features.yaml b/tools/experimental_features.yaml
index cea81af..dec610c 100644
--- a/tools/experimental_features.yaml
+++ b/tools/experimental_features.yaml
@@ -125,9 +125,6 @@
   macros:
     help: "Static meta-programming"
 
-  inference-update-1:
-    help: "Horizontal type inference for function expressions passed to generic invocations."
-
   inference-update-2:
     help: "Type promotion for fields"
 
@@ -264,3 +261,20 @@
       void main(){
         print(C('feature enabled').foo);
       }
+
+  inference-update-1:
+    help: "Horizontal type inference for function expressions passed to generic invocations."
+    enabledIn: '2.18.0'
+    validation: |
+      void test(List<int> list) {
+        var a = list.fold(0, (x, y) => x + y);
+        f(a);
+      }
+      void f<T>(T t) {
+        if (T == int) {
+          print('feature enabled');
+        }
+      }
+      void main() {
+        test([1, 2, 3]);
+      }
diff --git a/tools/package_deps/bin/package_deps.dart b/tools/package_deps/bin/package_deps.dart
index 48bf5b0..3cf437c 100644
--- a/tools/package_deps/bin/package_deps.dart
+++ b/tools/package_deps/bin/package_deps.dart
@@ -1,7 +1,6 @@
 import 'dart:io';
 
 import 'package:cli_util/cli_logging.dart';
-import 'package:collection/collection.dart';
 import 'package:path/path.dart' as path;
 import 'package:pub_semver/pub_semver.dart';
 import 'package:yaml/yaml.dart' as yaml;
@@ -252,41 +251,39 @@
       fail = true;
     }
 
-    // Validate that we don't have relative deps into third_party.
-    // TODO(devoncarew): This is currently just enforced for publishable
-    // packages.
     if (publishable) {
-      for (PubDep dep in [..._declaredPubDeps, ..._declaredDevPubDeps]) {
-        if (dep is PathPubDep) {
-          var path = dep.path;
-
-          if (path.contains('third_party/pkg_tested/') ||
-              path.contains('third_party/pkg/')) {
-            out('  Prefer a semver dependency for packages brought in via DEPS:');
-            out('    $dep');
-            fail = true;
-          }
-        }
-      }
-    }
-
-    // Validate that published packages don't use path deps.
-    if (publishable) {
+      // Validate that deps for published packages use semver (but not any).
       for (PubDep dep in _declaredPubDeps) {
-        if (dep is PathPubDep) {
-          out('  Published packages should use semver deps:');
-          out('    $dep');
-          fail = true;
-        }
+        if (dep is SemverPubDep) continue;
+
+        out('  Published packages should use semver deps:');
+        out('    $dep');
+        fail = true;
+      }
+
+      // Validate that dev deps for published packages use an 'any' constraint.
+      for (PubDep dep in _declaredDevPubDeps) {
+        if (dep is AnyPubDep) continue;
+
+        out('  Prefer an `any` constraint for dev dependencies');
+        out('    $dep');
+        fail = true;
+      }
+    } else {
+      // Validate that non-publishable packages use an 'any' constraint.
+      for (PubDep dep in [..._declaredPubDeps, ..._declaredDevPubDeps]) {
+        if (dep is AnyPubDep) continue;
+
+        out('  Prefer an `any` constraint for unpublished packages');
+        out('    $dep');
+        fail = true;
       }
     }
 
     // Validate that the version of any package dep'd in works with our declared
     // version ranges.
     for (PubDep dep in [..._declaredPubDeps, ..._declaredDevPubDeps]) {
-      if (dep is! SemverPubDep) {
-        continue;
-      }
+      if (dep is! SemverPubDep) continue;
 
       ResolvedDep? resolvedDep = sdkDeps.resolve(dep.name);
       if (resolvedDep == null) {
@@ -323,17 +320,6 @@
       }
     }
 
-    // Validate that non-published packages use relative a (relative) path dep
-    // for pkg/ packages.
-    if (!publishable) {
-      for (PubDep dep in [..._declaredPubDeps, ..._declaredDevPubDeps]) {
-        if (dep is AnyPubDep) continue;
-        out('  Prefer `any` dependencies for unpublished packages');
-        out('    $dep');
-        fail = true;
-      }
-    }
-
     if (!fail) {
       print('  No issues.');
     }
diff --git a/tools/rev_sdk_deps.dart b/tools/rev_sdk_deps.dart
new file mode 100644
index 0000000..c9cbb5e
--- /dev/null
+++ b/tools/rev_sdk_deps.dart
@@ -0,0 +1,227 @@
+import 'dart:convert';
+import 'dart:io';
+
+import 'package:path/path.dart' as path;
+
+// These packages are effectively pinned - they often require manual work when
+// rolling.
+// TODO(devoncarew): Keep this metadata in the DEPS file.
+const Set<String> pinned = {
+  'dart_style',
+  'linter',
+  'pub',
+};
+
+void main(List<String> args) async {
+  // Validate we're running from the repo root.
+  if (!File('README.dart-sdk').existsSync() || !File('DEPS').existsSync()) {
+    stderr.writeln('Please run this script from the root of the SDK repo.');
+    exit(1);
+  }
+
+  final gclient = GClientHelper();
+
+  final deps = await gclient.getPackageDependencies();
+  print('${deps.length} non-pinned package dependencies found.');
+  print('');
+
+  deps.sort((a, b) => a.name.compareTo(b.name));
+
+  for (var dep in deps) {
+    final git = GitHelper(dep.relativePath);
+
+    await git.fetch();
+
+    var commit = await git.findLatestUnsyncedCommit();
+    if (commit.isNotEmpty) {
+      var gitLog = await git.calculateUnsyncedCommits();
+      var currentHash = await gclient.getHash(dep);
+
+      // Construct the github diff URL.
+      print('${dep.name} (${dep.getGithubDiffUrl(currentHash, commit)}):');
+
+      // Print out the new commits.
+      print(gitLog.split('\n').map((l) => '  $l').join('\n').trimRight());
+
+      // Update the DEPS file.
+      await gclient.setHash(dep, commit);
+
+      print('');
+    }
+  }
+}
+
+class GitHelper {
+  final String dir;
+
+  GitHelper(this.dir);
+
+  Future<String> fetch() {
+    return exec(['git', 'fetch'], cwd: dir);
+  }
+
+  Future<String> findLatestUnsyncedCommit() async {
+    // git log HEAD..origin --format=%H -1
+
+    var result = await exec(
+      [
+        'git',
+        'log',
+        'HEAD..origin',
+        '--format=%H',
+        '-1',
+      ],
+      cwd: dir,
+    );
+    return result.trim();
+  }
+
+  Future<String> calculateUnsyncedCommits() async {
+    // git log HEAD..origin --format="%h  %ad  %aN  %s" -1
+    var result = await exec(
+      [
+        'git',
+        'log',
+        'HEAD..origin',
+        '--format=%h  %ad  %aN  %s',
+      ],
+      cwd: dir,
+    );
+    return result.trim();
+  }
+}
+
+class GClientHelper {
+  Future<List<PackageDependency>> getPackageDependencies() async {
+    // gclient revinfo --output-json=<file> --ignore-dep-type=cipd
+
+    final tempDir = Directory.systemTemp.createTempSync();
+    final outFile = File(path.join(tempDir.path, 'deps.json'));
+
+    await exec([
+      'gclient',
+      'revinfo',
+      '--output-json=${outFile.path}',
+      '--ignore-dep-type=cipd',
+    ]);
+    Map<String, dynamic> m = jsonDecode(outFile.readAsStringSync());
+    tempDir.deleteSync(recursive: true);
+
+    return m.entries.map((entry) {
+      return PackageDependency(
+        entry: entry.key,
+        url: (entry.value as Map)['url'],
+        rev: (entry.value as Map)['rev'],
+      );
+    }).where((PackageDependency deps) {
+      return deps.entry.startsWith('sdk/third_party/pkg/') ||
+          deps.entry.startsWith('sdk/third_party/pkg_tested/');
+    }).where((PackageDependency deps) {
+      return !pinned.contains(deps.name);
+    }).toList();
+  }
+
+  Future<String> getHash(PackageDependency dep) async {
+    // DEPOT_TOOLS_UPDATE=0 gclient getdep --var=path_rev
+    var depName = dep.name;
+    var result = await exec(
+      [
+        'gclient',
+        'getdep',
+        '--var=${depName}_rev',
+      ],
+      environment: {
+        'DEPOT_TOOLS_UPDATE': '0',
+      },
+    );
+    return result.trim();
+  }
+
+  Future<String> setHash(PackageDependency dep, String hash) async {
+    // gclient setdep --var=args_rev=9879dsf7g9d87d9f8g7
+    var depName = dep.name;
+    return await exec(
+      [
+        'gclient',
+        'setdep',
+        '--var=${depName}_rev=$hash',
+      ],
+      environment: {
+        'DEPOT_TOOLS_UPDATE': '0',
+      },
+    );
+  }
+}
+
+class PackageDependency {
+  final String entry;
+  final String url;
+  final String? rev;
+
+  PackageDependency({
+    required this.entry,
+    required this.url,
+    required this.rev,
+  });
+
+  String get name => entry.substring(entry.lastIndexOf('/') + 1);
+
+  String get relativePath => entry.substring('sdk/'.length);
+
+  String getGithubDiffUrl(String fromCommit, String toCommit) {
+    // https://github.com/dart-lang/<repo>/compare/<old>..<new>
+    final from = fromCommit.substring(0, 7);
+    final to = toCommit.substring(0, 7);
+
+    var repo = url.substring(url.lastIndexOf('/') + 1);
+    if (repo.endsWith('git')) {
+      repo = repo.substring(0, repo.length - '.git'.length);
+    }
+
+    var org = 'dart-lang';
+    if (url.contains('/external/')) {
+      // https://dart.googlesource.com/external/github.com/google/webdriver.dart.git
+      final parts = url.split('/');
+      org = parts[parts.length - 2];
+    }
+
+    // TODO(devoncarew): Eliminate this special-casing; see #48830.
+    const orgOverrides = {
+      'platform.dart': 'google',
+    };
+    if (orgOverrides.containsKey(repo)) {
+      org = orgOverrides[repo]!;
+    }
+
+    return 'https://github.com/$org/$repo/compare/$from..$to';
+  }
+
+  @override
+  String toString() => '${rev?.substring(0, 8)} $relativePath';
+}
+
+Future<String> exec(
+  List<String> cmd, {
+  String? cwd,
+  Map<String, String>? environment,
+}) async {
+  var result = await Process.run(
+    cmd.first,
+    cmd.sublist(1),
+    workingDirectory: cwd,
+    environment: environment,
+  );
+  if (result.exitCode != 0) {
+    var cwdLocation = cwd == null ? '' : ' ($cwd)';
+    print('${cmd.join(' ')}$cwdLocation');
+
+    if ((result.stdout as String).isNotEmpty) {
+      stdout.write(result.stdout);
+    }
+    if ((result.stderr as String).isNotEmpty) {
+      stderr.write(result.stderr);
+    }
+    exit(1);
+  }
+  return result.stdout;
+}
diff --git a/tools/verify_docs/README.md b/tools/verify_docs/README.md
index 41be863..f2adb28 100644
--- a/tools/verify_docs/README.md
+++ b/tools/verify_docs/README.md
@@ -123,4 +123,3 @@
 // final BuildContext context;
 // final String userAvatarUrl;
 ```
-
diff --git a/utils/dartdevc/BUILD.gn b/utils/dartdevc/BUILD.gn
index 5d93e80..d2bcd69 100644
--- a/utils/dartdevc/BUILD.gn
+++ b/utils/dartdevc/BUILD.gn
@@ -8,6 +8,11 @@
 import("../application_snapshot.gni")
 import("../create_timestamp.gni")
 
+declare_args() {
+  # Enables DDC canary features during compilation to Javascript.
+  ddc_canary = false
+}
+
 patched_sdk_dir = "$target_gen_dir/patched_sdk"
 sdk_summary = "$target_gen_dir/ddc_sdk.sum"
 
@@ -30,6 +35,10 @@
     rebase_path("../../pkg/dev_compiler/bin/dartdevc.dart"),
   ]
 
+  if (ddc_canary) {
+    training_args += [ "--canary" ]
+  }
+
   deps = [
     ":dartdevc_kernel_sdk",
     ":dartdevc_platform",
@@ -186,6 +195,10 @@
       "package:$module/$module.dart",
     ]
 
+    if (ddc_canary) {
+      args += [ "--canary" ]
+    }
+
     if (defined(invoker.extra_libraries)) {
       foreach(lib, invoker.extra_libraries) {
         args += [ "package:$module/$lib.dart" ]
@@ -356,6 +369,10 @@
     if (invoker.sound_null_safety) {
       args += [ "--sound-null-safety" ]
     }
+
+    if (ddc_canary) {
+      args += [ "--canary" ]
+    }
   }
 }
 
